~ chicken-core (chicken-5) e8e3b17b65f9921c3277f0768e757d2f03121fd9


commit e8e3b17b65f9921c3277f0768e757d2f03121fd9
Author:     Felix <bunny351@gmail.com>
AuthorDate: Sun Nov 8 00:13:43 2009 +0100
Commit:     Felix <bunny351@gmail.com>
CommitDate: Sun Nov 8 00:13:43 2009 +0100

    removed meaningless benchmarks and replaced them with two real ones; also did some test-suite cleanups

diff --git a/Makefile b/Makefile
index f1aaa31a..fb2816e0 100644
--- a/Makefile
+++ b/Makefile
@@ -75,6 +75,4 @@ libs:
 	$(MAKE) -f $(SRCDIR)/Makefile.$(PLATFORM) libs
 bootstrap:
 	$(MAKE) -f $(SRCDIR)/Makefile.$(PLATFORM) bootstrap
-bench:
-	$(MAKE) -f $(SRCDIR)/Makefile.$(PLATFORM) bench
 endif
diff --git a/benchmarks/0.scm b/benchmarks/0.scm
deleted file mode 100644
index 81a44219..00000000
--- a/benchmarks/0.scm
+++ /dev/null
@@ -1,3 +0,0 @@
-;;;; 0.scm - does nothing
-
-(time #f)
diff --git a/benchmarks/binarytrees.scm b/benchmarks/binarytrees.scm
deleted file mode 100644
index 8ed7ce9c..00000000
--- a/benchmarks/binarytrees.scm
+++ /dev/null
@@ -1,33 +0,0 @@
-;;; The Computer Language Benchmarks Game
-;;; http://shootout.alioth.debian.org/
-;;; contributed by Sven Hartrumpf
-
-(define make (lambda (item d)
-  (if (= d 0)
-    (list 'empty item)
-    (let ((item2 (* item 2))
-          (d2 (- d 1)))
-      (list 'node (make (- item2 1) d2) item (make item2 d2))))))
-
-(define check (lambda (t)
-  (if (eq? (car t) 'empty)
-    (cadr t)
-    (+ (caddr t) (- (check (cadr t)) (check (cadddr t)))))))
-
-(define main (lambda (n)
-  (let* ((min-depth 4)
-         (max-depth (max (+ min-depth 2) n)))
-    (let ((stretch-depth (+ max-depth 1)))
-      (display "stretch tree of depth ") (display stretch-depth) (write-char #\tab) (display " check: ") (display (check (make 0 stretch-depth))) (newline))
-    (let ((long-lived-tree (make 0 max-depth)))
-      (do ((d 4 (+ d 2))
-           (c 0 0))
-        ((> d max-depth))
-        (let ((iterations (arithmetic-shift 1 (+ (- max-depth d) min-depth)))) ; chicken-specific: arithmetic-shift
-          (do ((i 0 (+ i 1)))
-            ((>= i iterations))
-            (set! c (+ c (check (make i d)) (check (make (- i) d)))))
-          (display (* 2 iterations)) (write-char #\tab) (display " trees of depth ") (display d) (write-char #\tab) (display " check: ") (display c) (newline)))
-      (display "long lived tree of depth ") (display max-depth) (write-char #\tab) (display " check: ") (display (check long-lived-tree)) (newline)))))
-
-(time (main 10))
diff --git a/benchmarks/boyer.scm b/benchmarks/boyer.scm
deleted file mode 100644
index d6118372..00000000
--- a/benchmarks/boyer.scm
+++ /dev/null
@@ -1,284 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:	  boyer.sc
-;;; Description:  The Boyer benchmark
-;;; Author:	  Bob Boyer
-;;; Created:	  5-Apr-85
-;;; Modified:	  10-Apr-85 14:52:20 (Bob Shaw)
-;;;		  22-Jul-87 (Will Clinger)
-;;;		  23-May-94 (Qobi)
-;;;		  31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:	  Scheme (but see note)
-;;; Status:	  Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Note:  This benchmark uses property lists.	The procedures that must
-;;; be supplied are get and put, where (put x y z) is equivalent to Common
-;;; Lisp's (setf (get x y) z).
-;;; Note:  The Common Lisp version of this benchmark returns the wrong
-;;; answer because it uses the Common Lisp equivalent of memv instead of
-;;; member in the falsep and truep procedures.	(The error arose because
-;;; memv is called member in Common Lisp.  Don't ask what member is called,
-;;; unless you want to learn about keyword arguments.)	This Scheme version
-;;; may run a few percent slower than it would if it were equivalent to
-;;; the Common Lisp version, but it works.
-
-;;; BOYER -- Logic programming benchmark, originally written by Bob Boyer.
-;;; Fairly CONS intensive.
-
-
-(define unify-subst '())		;Qobi
-
-(define temp-temp #f)			;Qobi
-
-(define (add-lemma term)
-  (cond ((and (pair? term) (eq? (car term) 'equal) (pair? (cadr term)))
-	 (put! (car (cadr term))
-	      'lemmas
-	      (cons term (or (get (car (cadr term)) 'lemmas) '()))))
-	(else (display "ADD-LEMMA did not like term: ") ;Qobi
-	      (display term)		;Qobi
-	      (newline))))		;Qobi
-
-(define (add-lemma-lst lst)
-  (cond ((null? lst) #t)
-	(else (add-lemma (car lst)) (add-lemma-lst (cdr lst)))))
-
-(define (apply-subst alist term)
-  (cond ((not (pair? term))
-	 (cond ((begin (set! temp-temp (assq term alist)) temp-temp)
-		(cdr temp-temp))
-	       (else term)))
-	(else (cons (car term) (apply-subst-lst alist (cdr term))))))
-
-(define (apply-subst-lst alist lst)
-  (cond ((null? lst) '())		;Qobi
-	(else (cons (apply-subst alist (car lst))
-		    (apply-subst-lst alist (cdr lst))))))
-
-(define (falsep x lst) (or (equal? x '(f)) (member x lst)))
-
-(define (one-way-unify term1 term2)
-  (set! unify-subst '())		;Qobi
-  (one-way-unify1 term1 term2))
-
-(define (one-way-unify1 term1 term2)
-  (cond ((not (pair? term2))
-	 (cond ((begin (set! temp-temp (assq term2 unify-subst)) temp-temp)
-		(equal? term1 (cdr temp-temp)))
-	       (else (set! unify-subst (cons (cons term2 term1) unify-subst))
-		     #t)))
-	((not (pair? term1)) #f)
-	((eq? (car term1) (car term2))
-	 (one-way-unify1-lst (cdr term1) (cdr term2)))
-	(else #f)))
-
-(define (one-way-unify1-lst lst1 lst2)
-  (cond ((null? lst1) #t)
-	((one-way-unify1 (car lst1) (car lst2))
-	 (one-way-unify1-lst (cdr lst1) (cdr lst2)))
-	(else #f)))
-
-(define (rewrite term)
-  (cond ((not (pair? term)) term)
-	(else (rewrite-with-lemmas
-	       (cons (car term) (rewrite-args (cdr term)))
-	       (or (get (car term) 'lemmas) '())))))
-
-(define (rewrite-args lst)
-  (cond ((null? lst) '())		;Qobi
-	(else (cons (rewrite (car lst)) (rewrite-args (cdr lst))))))
-
-(define (rewrite-with-lemmas term lst)
-  (cond ((null? lst) term)
-	((one-way-unify term (cadr (car lst)))
-	 (rewrite (apply-subst unify-subst (caddr (car lst)))))
-	(else (rewrite-with-lemmas term (cdr lst)))))
-
-(define (setup)
-  (add-lemma-lst
-   '((equal (compile form) (reverse (codegen (optimize form) (nil))))
-     (equal (eqp x y) (equal (fix x) (fix y)))
-     (equal (greaterp x y) (lessp y x))
-     (equal (lesseqp x y) (not (lessp y x)))
-     (equal (greatereqp x y) (not (lessp x y)))
-     (equal (boolean x) (or (equal x (t)) (equal x (f))))
-     (equal (iff x y) (and (implies x y) (implies y x)))
-     (equal (even1 x) (if (zerop x) (t) (odd (sub1 x)))) ;Qobi
-     (equal (countps- l pred) (countps-loop l pred (zero)))
-     (equal (fact- i) (fact-loop i (one)))
-     (equal (reverse- x) (reverse-loop x (nil)))
-     (equal (divides x y) (zerop (remainder y x)))
-     (equal (assume-true var alist) (cons (cons var (t)) alist))
-     (equal (assume-false var alist) (cons (cons var (f)) alist))
-     (equal (tautology-checker x) (tautologyp (normalize x) (nil)))
-     (equal (falsify x) (falsify1 (normalize x) (nil)))
-     (equal (prime x)
-	    (and (not (zerop x))
-		 (not (equal x (add1 (zero))))
-		 (prime1 x (sub1 x))))	;Qobi
-     (equal (and p q) (if p (if q (t) (f)) (f)))
-     (equal (or p q) (if p (t) (if q (t) (f)) (f)))
-     (equal (not p) (if p (f) (t)))
-     (equal (implies p q) (if p (if q (t) (f)) (t)))
-     (equal (fix x) (if (numberp x) x (zero)))
-     (equal (if (if a b c) d e) (if a (if b d e) (if c d e)))
-     (equal (zerop x) (or (equal x (zero)) (not (numberp x))))
-     (equal (plus (plus x y) z) (plus x (plus y z)))
-     (equal (equal (plus a b) (zero)) (and (zerop a) (zerop b)))
-     (equal (difference x x) (zero))
-     (equal (equal (plus a b) (plus a c)) (equal (fix b) (fix c)))
-     (equal (equal (zero) (difference x y)) (not (lessp y x)))
-     (equal (equal x (difference x y))
-	    (and (numberp x) (or (equal x (zero)) (zerop y))))
-     (equal (meaning (plus-tree (append x y)) a)
-	    (plus (meaning (plus-tree x) a) (meaning (plus-tree y) a)))
-     (equal (meaning (plus-tree (plus-fringe x)) a) (fix (meaning x a)))
-     (equal (append (append x y) z) (append x (append y z)))
-     (equal (reverse (append a b)) (append (reverse b) (reverse a)))
-     (equal (times x (plus y z)) (plus (times x y) (times x z)))
-     (equal (times (times x y) z) (times x (times y z)))
-     (equal (equal (times x y) (zero)) (or (zerop x) (zerop y)))
-     (equal (exec (append x y) pds envrn) (exec y (exec x pds envrn) envrn))
-     (equal (mc-flatten x y) (append (flatten x) y))
-     (equal (member x (append a b)) (or (member x a) (member x b)))
-     (equal (member x (reverse y)) (member x y))
-     (equal (length (reverse x)) (length x))
-     (equal (member a (intersect b c)) (and (member a b) (member a c)))
-     (equal (nth (zero) i) (zero))
-     (equal (exp i (plus j k)) (times (exp i j) (exp i k)))
-     (equal (exp i (times j k)) (exp (exp i j) k))
-     (equal (reverse-loop x y) (append (reverse x) y))
-     (equal (reverse-loop x (nil)) (reverse x))
-     (equal (count-list z (sort-lp x y))
-	    (plus (count-list z x) (count-list z y)))
-     (equal (equal (append a b) (append a c)) (equal b c))
-     (equal (plus (remainder x y) (times y (quotient x y))) (fix x))
-     (equal (power-eval (big-plus1 l i base) base)
-	    (plus (power-eval l base) i))
-     (equal (power-eval (big-plus x y i base) base)
-	    (plus i (plus (power-eval x base) (power-eval y base))))
-     (equal (remainder y (one)) (zero))
-     (equal (lessp (remainder x y) y) (not (zerop y)))
-     (equal (remainder x x) (zero))
-     (equal (lessp (quotient i j) i)
-	    (and (not (zerop i)) (or (zerop j) (not (equal j (one))))))
-     (equal (lessp (remainder x y) x)
-	    (and (not (zerop y)) (not (zerop x)) (not (lessp x y))))
-     (equal (power-eval (power-rep i base) base) (fix i))
-     (equal (power-eval (big-plus (power-rep i base)
-				  (power-rep j base)
-				  (zero)
-				  base)
-			base)
-	    (plus i j))
-     (equal (gcd x y) (gcd y x))
-     (equal (nth (append a b) i)
-	    (append (nth a i) (nth b (difference i (length a)))))
-     (equal (difference (plus x y) x) (fix y))
-     (equal (difference (plus y x) x) (fix y))
-     (equal (difference (plus x y) (plus x z)) (difference y z))
-     (equal (times x (difference c w)) (difference (times c x) (times w x)))
-     (equal (remainder (times x z) z) (zero))
-     (equal (difference (plus b (plus a c)) a) (plus b c))
-     (equal (difference (add1 (plus y z)) z) (add1 y))
-     (equal (lessp (plus x y) (plus x z)) (lessp y z))
-     (equal (lessp (times x z) (times y z)) (and (not (zerop z)) (lessp x y)))
-     (equal (lessp y (plus x y)) (not (zerop x)))
-     (equal (gcd (times x z) (times y z)) (times z (gcd x y)))
-     (equal (value (normalize x) a) (value x a))
-     (equal (equal (flatten x) (cons y (nil))) (and (nlistp x) (equal x y)))
-     (equal (listp (gopher x)) (listp x))
-     (equal (samefringe x y) (equal (flatten x) (flatten y)))
-     (equal (equal (greatest-factor x y) (zero))
-	    (and (or (zerop y) (equal y (one))) (equal x (zero))))
-     (equal (equal (greatest-factor x y) (one)) (equal x (one)))
-     (equal (numberp (greatest-factor x y))
-	    (not (and (or (zerop y) (equal y (one))) (not (numberp x)))))
-     (equal (times-list (append x y)) (times (times-list x) (times-list y)))
-     (equal (prime-list (append x y)) (and (prime-list x) (prime-list y)))
-     (equal (equal z (times w z))
-	    (and (numberp z) (or (equal z (zero)) (equal w (one)))))
-     (equal (greatereqpr x y) (not (lessp x y)))
-     (equal (equal x (times x y))
-	    (or (equal x (zero)) (and (numberp x) (equal y (one)))))
-     (equal (remainder (times y x) y) (zero))
-     (equal (equal (times a b) (one))
-	    (and (not (equal a (zero)))
-		 (not (equal b (zero)))
-		 (numberp a)
-		 (numberp b)
-		 (equal (sub1 a) (zero)) ;Qobi
-		 (equal (sub1 b) (zero)))) ;Qobi
-     (equal (lessp (length (delete x l)) (length l)) (member x l))
-     (equal (sort2 (delete x l)) (delete x (sort2 l)))
-     (equal (dsort x) (sort2 x))
-     (equal (length
-	     (cons x1 (cons x2 (cons x3 (cons x4 (cons x5 (cons x6 x7)))))))
-	    (plus (six) (length x7)))
-     (equal (difference (add1 (add1 x)) (two)) (fix x))
-     (equal (quotient (plus x (plus x y)) (two)) (plus x (quotient y (two))))
-     (equal (sigma (zero) i) (quotient (times i (add1 i)) (two)))
-     (equal (plus x (add1 y)) (if (numberp y) (add1 (plus x y)) (add1 x)))
-     (equal (equal (difference x y) (difference z y))
-	    (if (lessp x y)
-		(not (lessp y z))
-		(if (lessp z y) (not (lessp y x)) (equal (fix x) (fix z)))))
-     (equal (meaning (plus-tree (delete x y)) a)
-	    (if (member x y)
-		(difference (meaning (plus-tree y) a) (meaning x a))
-		(meaning (plus-tree y) a)))
-     (equal (times x (add1 y)) (if (numberp y) (plus x (times x y)) (fix x)))
-     (equal (nth (nil) i) (if (zerop i) (nil) (zero)))
-     (equal (last (append a b))
-	    (if (listp b) (last b) (if (listp a) (cons (car (last a)) b) b)))
-     (equal (equal (lessp x y) z) (if (lessp x y) (equal t z) (equal f z)))
-     (equal (assignment x (append a b))
-	    (if (assignedp x a) (assignment x a) (assignment x b)))
-     (equal (car (gopher x)) (if (listp x) (car (flatten x)) (zero)))
-     (equal (flatten (cdr (gopher x)))
-	    (if (listp x) (cdr (flatten x)) (cons (zero) (nil))))
-     (equal (quotient (times y x) y) (if (zerop y) (zero) (fix x)))
-     (equal (get j (set i val mem)) (if (eqp j i) val (get j mem))))))
-
-(define (tautologyp x true-lst false-lst)
-  (cond ((truep x true-lst) #t)
-	((falsep x false-lst) #f)
-	((not (pair? x))	#f)
-	((eq? (car x) 'if)
-	 (cond ((truep (cadr x) true-lst)
-		(tautologyp (caddr x) true-lst false-lst))
-	       ((falsep (cadr x) false-lst)
-		(tautologyp (cadddr x) true-lst false-lst))
-	       (else (and (tautologyp (caddr x)
-				      (cons (cadr x) true-lst)
-				      false-lst)
-			  (tautologyp (cadddr x)
-				      true-lst
-				      (cons (cadr x) false-lst))))))
-	(else #f)))
-
-(define (tautp x) (tautologyp (rewrite x) '() '())) ;Qobi
-
-(define (test)
-  (define ans #f)
-  (define term #f)
-  (set! term
-	(apply-subst
-	 '((x f (plus (plus a b) (plus c (zero))))
-	   (y f (times (times a b) (plus c d)))
-	   (z f (reverse (append (append a b) (nil))))
-	   (u equal (plus a b) (difference x y))
-	   (w lessp (remainder a b) (member a (length b))))
-	 '(implies (and (implies x y)
-			(and (implies y z) (and (implies z u) (implies u w))))
-		   (implies x w))))
-  (set! ans (tautp term))
-  ans)
-
-(define (truep x lst) (or (equal? x '(t)) (member x lst)))
-
-(setup)
-
-(if (not (eq? #t (time (test))))
-    (error "wrong result") )
diff --git a/benchmarks/browse.scm b/benchmarks/browse.scm
deleted file mode 100644
index bb433899..00000000
--- a/benchmarks/browse.scm
+++ /dev/null
@@ -1,151 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         browse.sc
-;;; Description:  The BROWSE benchmark from the Gabriel tests
-;;; Author:       Richard Gabriel
-;;; Created:      8-Apr-85
-;;; Modified:     14-Jun-85 18:44:49 (Bob Shaw)
-;;;               16-Aug-87 (Will Clinger)
-;;;               22-Jan-88 (Will Clinger)
-;;;               24-Mar-96 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme (but see notes below)
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Note:  This benchmark has been run only in implementations in which
-;;; the empty list is the same as #f, and may not work if that is not true.
-;;; Note:  This benchmark uses property lists.  The procedures that must
-;;; be supplied are get and put, where (put x y z) is equivalent to Common
-;;; Lisp's (setf (get x y) z).
-;;; Note:  The Common Lisp version assumes that eq works on characters,
-;;; which is not a portable assumption but is true in most implementations.
-;;; This translation makes the same assumption about eq?.
-;;; Note:  The gensym procedure was left as in Common Lisp.  Most Scheme
-;;; implementations have something similar internally.
-;;; Note:  The original benchmark took the car or cdr of the empty list
-;;; 14,600 times.  Before explicit tests were added to protect the offending
-;;; calls to car and cdr, MacScheme was spending a quarter of its run time
-;;; in the exception handler recovering from those errors.
-
-; 11/07/00 - felix:
-;
-; - Renamed 'match' to 'bmatch', because there exists a macro-definition of
-;   'match' already.
-
-;;; The next few definitions should be omitted if the Scheme implementation
-;;; already provides them.
-
-(define (append! x y)
-  (if (null? x)
-      y
-      (do ((a x b) (b (cdr x) (cdr b))) ((null? b) (set-cdr! a y) x))))
-
-(define (copy-tree x)
-  (if (not (pair? x)) x (cons (copy-tree (car x)) (copy-tree (cdr x)))))
-
-
-;;; BROWSE -- Benchmark to create and browse through
-;;; an AI-like data base of units.
-
-;;; n is # of symbols
-;;; m is maximum amount of stuff on the plist
-;;; npats is the number of basic patterns on the unit
-;;; ipats is the instantiated copies of the patterns
-
-(define *rand* 21)
-
-(define (init n m npats ipats)
-  (let ((ipats (copy-tree ipats)))
-    (do ((p ipats (cdr p))) ((null? (cdr p)) (set-cdr! p ipats)))
-    (do ((n n (- n 1))
-	 (i m (cond ((zero? i) m) (else (- i 1))))
-	 (name (gensym) (gensym))
-	 (a '()))
-	((= n 0) a)
-      (set! a (cons name a))
-      (do ((i i (- i 1))) ((zero? i)) (put! name (gensym) #f))
-      (put! name
-	   'pattern
-	   (do ((i npats (- i 1)) (ipats ipats (cdr ipats)) (a '()))
-	       ((zero? i) a)
-	     (set! a (cons (car ipats) a))))
-      (do ((j (- m i) (- j 1))) ((zero? j)) (put! name (gensym) #f)))))
-
-(define (browse-random)
-  (set! *rand* (remainder (* *rand* 17) 251))
-  *rand*)
-
-(define (randomize l)
-  (do ((a '())) ((null? l) a)
-   (let ((n (remainder (browse-random) (length l))))
-    (cond ((zero? n)
-	   (set! a (cons (car l) a))
-	   (set! l (cdr l))
-	   l)
-	  (else (do ((n n (- n 1)) (x l (cdr x)))
-		  ((= n 1)
-		   (set! a (cons (cadr x) a))
-		   (set-cdr! x (cddr x))
-		   x)))))))
-
-(define (bmatch pat dat alist)
-  (cond ((null? pat) (null? dat))
-	((null? dat) #f)		;Qobi: used to depend on () being false
-	((or (eq? (car pat) '?) (eq? (car pat) (car dat)))
-	 (bmatch (cdr pat) (cdr dat) alist))
-	((eq? (car pat) '*)
-	 (or (bmatch (cdr pat) dat alist)
-	     (bmatch (cdr pat) (cdr dat) alist)
-	     (bmatch pat (cdr dat) alist)))
-	(else (cond ((not (pair? (car pat)))
-		     (cond ((eq? (string-ref (symbol->string (car pat)) 0) #\?)
-			    (let ((val (assv (car pat) alist)))
-			     (cond (val (bmatch (cons (cdr val) (cdr pat))
-					       dat alist))
-				   (else (bmatch (cdr pat)
-						(cdr dat)
-						(cons (cons (car pat)
-							    (car dat))
-						      alist))))))
-			   ((eq? (string-ref (symbol->string (car pat)) 0) #\*)
-			    (let ((val (assv (car pat) alist)))
-			     (cond (val (bmatch (append (cdr val) (cdr pat))
-					       dat alist))
-				   (else
-				    (do ((l '()
-					    (append! l
-						     (cons (if (null? d)
-							       '()
-							       (car d))
-							   '())))
-					 (e (cons '() dat) (cdr e))
-					 (d dat (if (null? d) '() (cdr d))))
-				      ((or (null? e)
-					   (bmatch (cdr pat)
-						  d
-						  (cons (cons (car pat) l)
-							alist)))
-				       (if (null? e) #f #t)))))))
-			   ;; Qobi: used to depend of missing ELSE returning #F
-			   (else #f)))
-		    (else (and (pair? (car dat))
-			       (bmatch (car pat) (car dat) alist)
-			       (bmatch (cdr pat) (cdr dat) alist)))))))
-
-(define (browse)
-  (investigate (randomize (init 100 10 4 '((a a a b b b b a a a a a b b a a a)
-					   (a a b b b b a a (a a) (b b))
-					   (a a a b (b a) b a b a))))
-	       '((*a ?b *b ?b a *a a *b *a)
-		 (*a *b *b *a (*a) (*b))
-		 (? ? * (b a) * ? ?))))
-
-(define (investigate units pats)
-  (do ((units units (cdr units))) ((null? units))
-   (do ((pats pats (cdr pats))) ((null? pats))
-    (do ((p (get (car units) 'pattern) (cdr p))) ((null? p))
-     (bmatch (car pats) (car p) '())))))
-
-
-(time (browse))
diff --git a/benchmarks/conform.scm b/benchmarks/conform.scm
deleted file mode 100644
index be2013d5..00000000
--- a/benchmarks/conform.scm
+++ /dev/null
@@ -1,453 +0,0 @@
-;;; CONFORM -- Type checker, written by Jim Miller.
-
-;;; Functional and unstable
-
-(define (sort-list obj pred)
-
-  (define (loop l)
-    (if (and (pair? l) (pair? (cdr l)))
-        (split-list l '() '())
-        l))
-
-  (define (split-list l one two)
-    (if (pair? l)
-        (split-list (cdr l) two (cons (car l) one))
-        (merge (loop one) (loop two))))
-
-  (define (merge one two)
-    (cond ((null? one) two)
-          ((pred (car two) (car one))
-           (cons (car two)
-                 (merge (cdr two) one)))
-          (else
-           (cons (car one)
-                 (merge (cdr one) two)))))
-
-  (loop obj))
-
-;; SET OPERATIONS
-; (representation as lists with distinct elements)
-
-(define (adjoin element set)
-  (if (memq element set) set (cons element set)))
-
-(define (eliminate element set)
-  (cond ((null? set) set)
-        ((eq? element (car set)) (cdr set))
-        (else (cons (car set) (eliminate element (cdr set))))))
-
-(define (intersect list1 list2)
-  (let loop ((l list1))
-    (cond ((null? l) '())
-          ((memq (car l) list2) (cons (car l) (loop (cdr l))))
-          (else (loop (cdr l))))))
-
-(define (union list1 list2)
-  (if (null? list1)
-      list2
-      (union (cdr list1)
-             (adjoin (car list1) list2))))
-
-;; GRAPH NODES
-
-(define make-internal-node vector)
-(define (internal-node-name node) (vector-ref node 0))
-(define (internal-node-green-edges node) (vector-ref node 1))
-(define (internal-node-red-edges node) (vector-ref node 2))
-(define (internal-node-blue-edges node) (vector-ref node 3))
-(define (set-internal-node-name! node name) (vector-set! node 0 name))
-(define (set-internal-node-green-edges! node edges) (vector-set! node 1 edges))
-(define (set-internal-node-red-edges! node edges) (vector-set! node 2 edges))
-(define (set-internal-node-blue-edges! node edges) (vector-set! node 3 edges))
-
-(define (make-node name . blue-edges)   ; User's constructor
-  (let ((name (if (symbol? name) (symbol->string name) name))
-        (blue-edges (if (null? blue-edges) 'NOT-A-NODE-YET (car blue-edges))))
-    (make-internal-node name '() '() blue-edges)))
-
-(define (copy-node node)
-  (make-internal-node (name node) '() '() (blue-edges node)))
-
-; Selectors
-
-(define name internal-node-name)
-(define (make-edge-getter selector)
-  (lambda (node)
-    (if (or (none-node? node) (any-node? node))
-        (fatal-error "Can't get edges from the ANY or NONE nodes")
-        (selector node))))
-(define red-edges (make-edge-getter internal-node-red-edges))
-(define green-edges (make-edge-getter internal-node-green-edges))
-(define blue-edges (make-edge-getter internal-node-blue-edges))
-
-; Mutators
-
-(define (make-edge-setter mutator!)
-  (lambda (node value)
-    (cond ((any-node? node) (fatal-error "Can't set edges from the ANY node"))
-          ((none-node? node) 'OK)
-          (else (mutator! node value)))))
-(define set-red-edges! (make-edge-setter set-internal-node-red-edges!))
-(define set-green-edges! (make-edge-setter set-internal-node-green-edges!))
-(define set-blue-edges! (make-edge-setter set-internal-node-blue-edges!))
-
-;; BLUE EDGES
-
-(define make-blue-edge vector)
-(define (blue-edge-operation edge) (vector-ref edge 0))
-(define (blue-edge-arg-node edge) (vector-ref edge 1))
-(define (blue-edge-res-node edge) (vector-ref edge 2))
-(define (set-blue-edge-operation! edge value) (vector-set! edge 0 value))
-(define (set-blue-edge-arg-node! edge value) (vector-set! edge 1 value))
-(define (set-blue-edge-res-node! edge value) (vector-set! edge 2 value))
-
-; Selectors
-(define operation blue-edge-operation)
-(define arg-node blue-edge-arg-node)
-(define res-node blue-edge-res-node)
-
-; Mutators
-(define set-arg-node! set-blue-edge-arg-node!)
-(define set-res-node! set-blue-edge-res-node!)
-
-; Higher level operations on blue edges
-
-(define (lookup-op op node)
-  (let loop ((edges (blue-edges node)))
-    (cond ((null? edges) '())
-          ((eq? op (operation (car edges))) (car edges))
-          (else (loop (cdr edges))))))
-
-(define (has-op? op node)
-  (not (null? (lookup-op op node))))
-
-;; GRAPHS
-
-(define make-internal-graph vector)
-(define (internal-graph-nodes graph) (vector-ref graph 0))
-(define (internal-graph-already-met graph) (vector-ref graph 1))
-(define (internal-graph-already-joined graph) (vector-ref graph 2))
-(define (set-internal-graph-nodes! graph nodes) (vector-set! graph 0 nodes))
-
-; Constructor
-
-(define (make-graph . nodes)
-  (make-internal-graph nodes (make-empty-table) (make-empty-table)))
-
-; Selectors
-
-(define graph-nodes internal-graph-nodes)
-(define already-met internal-graph-already-met)
-(define already-joined internal-graph-already-joined)
-
-; Higher level functions on graphs
-
-(define (add-graph-nodes! graph nodes)
-  (set-internal-graph-nodes! graph (cons nodes (graph-nodes graph))))
-
-(define (copy-graph g)
-  (define (copy-list l) (vector->list (list->vector l)))
-  (make-internal-graph
-   (copy-list (graph-nodes g))
-   (already-met g)
-   (already-joined g)))
-
-(define (clean-graph g)
-  (define (clean-node node)
-    (if (not (or (any-node? node) (none-node? node)))
-        (begin
-          (set-green-edges! node '())
-          (set-red-edges! node '()))))
-  (for-each clean-node (graph-nodes g))
-  g)
-
-(define (canonicalize-graph graph classes)
-  (define (fix node)
-    (define (fix-set object selector mutator)
-      (mutator object 
-               (map (lambda (node)
-                      (find-canonical-representative node classes))
-                    (selector object))))
-    (if (not (or (none-node? node) (any-node? node)))
-        (begin
-          (fix-set node green-edges set-green-edges!)
-          (fix-set node red-edges set-red-edges!)
-          (for-each 
-           (lambda (blue-edge)
-             (set-arg-node! blue-edge
-                            (find-canonical-representative (arg-node blue-edge) classes))
-             (set-res-node! blue-edge
-                            (find-canonical-representative (res-node blue-edge) classes)))
-           (blue-edges node))))
-    node)
-  (define (fix-table table)
-    (define (canonical? node) (eq? node (find-canonical-representative node classes)))
-    (define (filter-and-fix predicate-fn update-fn list)
-      (let loop ((list list))
-        (cond ((null? list) '())
-              ((predicate-fn (car list))
-               (cons (update-fn (car list)) (loop (cdr list))))
-              (else (loop (cdr list))))))
-    (define (fix-line line)
-      (filter-and-fix
-       (lambda (entry) (canonical? (car entry)))
-       (lambda (entry) (cons (car entry)
-                             (find-canonical-representative (cdr entry) classes)))
-       line))
-    (if (null? table)
-        '()
-        (cons (car table)
-              (filter-and-fix
-               (lambda (entry) (canonical? (car entry)))
-               (lambda (entry) (cons (car entry) (fix-line (cdr entry))))
-               (cdr table)))))
-  (make-internal-graph
-   (map (lambda (class) (fix (car class))) classes)
-   (fix-table (already-met graph))
-   (fix-table (already-joined graph))))
-
-;; USEFUL NODES
-
-(define none-node (make-node 'none #t))
-(define (none-node? node) (eq? node none-node))
-
-(define any-node (make-node 'any '()))
-(define (any-node? node) (eq? node any-node))
-
-;; COLORED EDGE TESTS
-
-(define (green-edge? from-node to-node)
-  (cond ((any-node? from-node) #f)
-        ((none-node? from-node) #t)
-        ((memq to-node (green-edges from-node)) #t)
-        (else #f)))
-
-(define (red-edge? from-node to-node)
-  (cond ((any-node? from-node) #f)
-        ((none-node? from-node) #t)
-        ((memq to-node (red-edges from-node)) #t)
-        (else #f)))
-
-;; SIGNATURE
-
-; Return signature (i.e. <arg, res>) given an operation and a node
-
-(define sig
-  (let ((none-comma-any (cons none-node any-node)))
-    (lambda (op node)                   ; Returns (arg, res)
-      (let ((the-edge (lookup-op op node)))
-        (if (not (null? the-edge))
-            (cons (arg-node the-edge) (res-node the-edge))
-            none-comma-any)))))
-
-; Selectors from signature
-
-(define (arg pair) (car pair))
-(define (res pair) (cdr pair))
-
-;; CONFORMITY
-
-(define (conforms? t1 t2)
-  (define nodes-with-red-edges-out '())
-  (define (add-red-edge! from-node to-node)
-    (set-red-edges! from-node (adjoin to-node (red-edges from-node)))
-    (set! nodes-with-red-edges-out
-          (adjoin from-node nodes-with-red-edges-out)))
-  (define (greenify-red-edges! from-node)
-    (set-green-edges! from-node
-                      (append (red-edges from-node) (green-edges from-node)))
-    (set-red-edges! from-node '()))
-  (define (delete-red-edges! from-node)
-    (set-red-edges! from-node '()))
-  (define (does-conform t1 t2)
-    (cond ((or (none-node? t1) (any-node? t2)) #t)
-          ((or (any-node? t1) (none-node? t2)) #f)
-          ((green-edge? t1 t2) #t)
-          ((red-edge? t1 t2) #t)
-          (else
-           (add-red-edge! t1 t2)
-           (let loop ((blues (blue-edges t2)))
-             (if (null? blues)
-                 #t
-                 (let* ((current-edge (car blues))
-                        (phi (operation current-edge)))
-                   (and (has-op? phi t1)
-                        (does-conform
-                         (res (sig phi t1))
-                         (res (sig phi t2)))
-                        (does-conform
-                         (arg (sig phi t2))
-                         (arg (sig phi t1)))
-                        (loop (cdr blues)))))))))
-  (let ((result (does-conform t1 t2)))
-    (for-each (if result greenify-red-edges! delete-red-edges!)
-              nodes-with-red-edges-out)
-    result))
-
-(define (equivalent? a b)
-  (and (conforms? a b) (conforms? b a)))
-
-;; EQUIVALENCE CLASSIFICATION
-; Given a list of nodes, return a list of equivalence classes
-
-(define (classify nodes)
-  (let node-loop ((classes '())
-                  (nodes nodes))
-    (if (null? nodes)
-        (map (lambda (class)
-               (sort-list class
-                          (lambda (node1 node2)
-                            (< (string-length (name node1))
-                               (string-length (name node2))))))
-             classes)
-        (let ((this-node (car nodes)))
-          (define (add-node classes)
-            (cond ((null? classes) (list (list this-node)))
-                  ((equivalent? this-node (caar classes))
-                   (cons (cons this-node (car classes))
-                         (cdr classes)))
-                  (else (cons (car classes)
-                              (add-node (cdr classes))))))
-          (node-loop (add-node classes)
-                     (cdr nodes))))))
-
-; Given a node N and a classified set of nodes,
-; find the canonical member corresponding to N
-
-(define (find-canonical-representative element classification)
-  (let loop ((classes classification))
-    (cond ((null? classes) (fatal-error "Can't classify" element)) 
-          ((memq element (car classes)) (car (car classes)))
-          (else (loop (cdr classes))))))
-
-; Reduce a graph by taking only one member of each equivalence 
-; class and canonicalizing all outbound pointers
-
-(define (reduce graph)
-  (let ((classes (classify (graph-nodes graph))))
-    (canonicalize-graph graph classes)))
-
-;; TWO DIMENSIONAL TABLES
-
-(define (make-empty-table) (list 'TABLE))
-(define (lookup table x y)
-  (let ((one (assq x (cdr table))))
-    (if one
-        (let ((two (assq y (cdr one))))
-          (if two (cdr two) #f))
-        #f)))
-(define (insert! table x y value)
-  (define (make-singleton-table x y)
-    (list (cons x y)))
-  (let ((one (assq x (cdr table))))
-    (if one
-        (set-cdr! one (cons (cons y value) (cdr one)))
-        (set-cdr! table (cons (cons x (make-singleton-table y value))
-                              (cdr table))))))
-
-;; MEET/JOIN 
-; These update the graph when computing the node for node1*node2
-
-(define (blue-edge-operate arg-fn res-fn graph op sig1 sig2)
-  (make-blue-edge op
-                  (arg-fn graph (arg sig1) (arg sig2))
-                  (res-fn graph (res sig1) (res sig2))))
-
-(define (meet graph node1 node2)
-  (cond ((eq? node1 node2) node1)
-        ((or (any-node? node1) (any-node? node2)) any-node) ; canonicalize
-        ((none-node? node1) node2)
-        ((none-node? node2) node1)
-        ((lookup (already-met graph) node1 node2)) ; return it if found
-        ((conforms? node1 node2) node2)
-        ((conforms? node2 node1) node1)
-        (else
-         (let ((result
-                (make-node (string-append "(" (name node1) " ^ " (name node2) ")"))))
-           (add-graph-nodes! graph result)
-           (insert! (already-met graph) node1 node2 result)
-           (set-blue-edges! result
-             (map
-              (lambda (op)
-                (blue-edge-operate join meet graph op (sig op node1) (sig op node2)))
-              (intersect (map operation (blue-edges node1))
-                         (map operation (blue-edges node2)))))
-           result))))
-
-(define (join graph node1 node2)
-  (cond ((eq? node1 node2) node1)
-        ((any-node? node1) node2)
-        ((any-node? node2) node1)
-        ((or (none-node? node1) (none-node? node2)) none-node) ; canonicalize
-        ((lookup (already-joined graph) node1 node2)) ; return it if found
-        ((conforms? node1 node2) node1)
-        ((conforms? node2 node1) node2)
-        (else
-         (let ((result
-                (make-node (string-append "(" (name node1) " v " (name node2) ")"))))
-           (add-graph-nodes! graph result)
-           (insert! (already-joined graph) node1 node2 result)
-           (set-blue-edges! result
-             (map
-              (lambda (op)
-                (blue-edge-operate meet join graph op (sig op node1) (sig op node2)))
-              (union (map operation (blue-edges node1))
-                     (map operation (blue-edges node2)))))
-           result))))
-
-;; MAKE A LATTICE FROM A GRAPH
-
-(define (make-lattice g print?)
-  (define (step g)
-    (let* ((copy (copy-graph g))
-           (nodes (graph-nodes copy)))
-      (for-each (lambda (first)
-                  (for-each (lambda (second)
-                              (meet copy first second) (join copy first second))
-                            nodes))
-                nodes)
-      copy))
-  (define (loop g count)
-    (if print? (display count))
-    (let ((lattice (step g)))
-      (if print? (begin (display " -> ") (display (length (graph-nodes lattice)))))
-      (let* ((new-g (reduce lattice))
-             (new-count (length (graph-nodes new-g))))
-        (if (= new-count count)
-            (begin
-              (if print? (newline))
-              new-g)
-            (begin
-              (if print? (begin (display " -> ") (display new-count) (newline)))
-              (loop new-g new-count))))))
-  (let ((graph
-         (apply make-graph
-                (adjoin any-node (adjoin none-node (graph-nodes (clean-graph g)))))))
-    (loop graph (length (graph-nodes graph)))))
-
-;; DEBUG and TEST
-
-(define a '())
-(define b '())
-(define c '())
-(define d '())
-
-(define (setup)
-  (set! a (make-node 'a))
-  (set! b (make-node 'b))
-  (set-blue-edges! a (list (make-blue-edge 'phi any-node b)))
-  (set-blue-edges! b (list (make-blue-edge 'phi any-node a)
-                           (make-blue-edge 'theta any-node b)))
-  (set! c (make-node "c"))
-  (set! d (make-node "d"))
-  (set-blue-edges! c (list (make-blue-edge 'theta any-node b)))
-  (set-blue-edges! d (list (make-blue-edge 'phi any-node c)
-                           (make-blue-edge 'theta any-node d)))
-  '(made a b c d))
-
-(define (test)
-  (setup)
-  (map name
-       (graph-nodes (make-lattice (make-graph a b c d any-node none-node) #f))))
-
-(time (test))
diff --git a/benchmarks/cpstak.scm b/benchmarks/cpstak.scm
deleted file mode 100644
index 0c6ea7b7..00000000
--- a/benchmarks/cpstak.scm
+++ /dev/null
@@ -1,24 +0,0 @@
-;;; cpstak.scm 
-
-
-(define (cpstak x y z)
-  (define (tak x y z k)
-    (if (not (< y x))
-        (k z)
-        (tak (- x 1)
-             y
-             z
-             (lambda (v1)
-               (tak (- y 1)
-                    z
-                    x
-                    (lambda (v2)
-                      (tak (- z 1)
-                           x
-                           y
-                           (lambda (v3)
-                             (tak v1 v2 v3 k)))))))))
-  (tak x y z (lambda (a) a)))
- 
-(time (do ((i 100 (- i 1))) ((zero? i)) (cpstak 18 12 6)))
-
diff --git a/benchmarks/cscbench.scm b/benchmarks/cscbench.scm
deleted file mode 100644
index cf194c12..00000000
--- a/benchmarks/cscbench.scm
+++ /dev/null
@@ -1,189 +0,0 @@
-;;;; cscbench - Compile and run benchmarks - felix -*- Scheme -*-
-;
-; - Usage: cscbench [-debug] [-cc=<path>] [-csc=<path>] [-chicken=<path>] OPTION ...
-
-(require-extension srfi-1 utils posix regex)
-
-(define ignored-files '("cscbench.scm" "cscbench.scm~"))
-(define flonum-files '("fft" "maze" "nbody"))
-(define cc "gcc")
-(define chicken "chicken")
-(define csc "csc")
-
-(define +chicken-format+ 
-  "~A ~A -quiet -no-warnings -heap-size 16m -output-file tmpfile.c ~A ~A -debug xopi 2>&1 >>bench.log")
-
-(define +cc-format+
-  (cond-expand
-    (macos      "~a ~a -s -I.. tmpfile.c -o tmpfile ../lib~achicken.a -lm")
-    (else       "~a ~a -I.. tmpfile.c -o tmpfile ../lib~achicken.a -lm") ) )
-
-(define (abort-run) #f)
-
-(define run
-  (let ([secrx (regexp "^ *([-.+e0-9]*(\\.[0-9]*)?) seconds elapsed$")])
-    (lambda ()
-      (system* "./tmpfile >tmpfile.out")
-      (with-input-from-file "tmpfile.out"
-        (lambda ()
-          (let loop ([line (read-line)])
-            (if (eof-object? line) 
-                (abort-run)
-                (let ([m (string-match secrx line)])
-                  (if m
-                      (string->number (second m)) 
-                      (loop (read-line)) ) ) ) ) ) ) ) ) )
-
-(define (display-l str len pad)
-  (let ([slen (string-length str)])
-    (display (substring str 0 (min slen len)))
-    (display (make-string (max 0 (- len slen)) pad)) ) )
-
-(define (display-r str len pad)
-  (let ([slen (string-length str)])
-    (display (make-string (max 0 (- len slen)) pad))
-    (display (substring str 0 (min slen len))) ) )
-
-(define display-f-4.3
-  (let ([florx (regexp "^([-+e0-9]*)(\\.([0-9]*))?$")])
-    (lambda (n)
-      (let* ([m (string-match florx (number->string n))]
-	     [is (second m)]
-	     [fs (fourth m)] )
-        (display-r is 4 #\space)
-        (display #\.)
-        (display-r (or fs "0") 3 #\0) ) ) ) )
-
-(define (display-size n)
-  (display-r 
-   (string-append (number->string (quotient n 1024)) "k") 
-   10 #\space))
-
-(define (compile-and-run file decls options coptions unsafe)
-  (system* +chicken-format+ chicken file decls options)
-  (system* +cc-format+ cc coptions (if unsafe "u" ""))
-  (let ((time (call-with-current-continuation
-	       (lambda (abort)
-		 (set! abort-run (cut abort #f))
-		 (let ((runs
-			(butlast
-			 (cdr 
-			  (sort 
-			   (map (lambda _ (run)) (iota 5))
-			   <)))))
-		   (/ (apply + runs) 3)))))
-	(size (file-size "tmpfile")))
-    (display #\space)
-    (cond (time
-            (display-f-4.3 time)
-            (values time size))
-          (else
-            (display "FAILED")
-            (values 9999.9 size)))))
-
-(define (dflush x)
-  (display x)
-  (flush-output) )
-
-(define (main options)
-  (call/cc 
-   (lambda (return)
-     (let loop ((opts options))
-       (cond ((null? opts) (return #f))
-	     ((string=? "-debug" (car opts)) 
-	      (set! system*
-		(let ([system* system*])
-		  (lambda args
-		    (let ([s (apply sprintf args)])
-		      (printf "system: ~A~%" s)
-		      (system* s) ) ) ) ) )
-	     ((string-match "-cc=(.*)" (car opts)) =>
-	      (lambda (m) (set! cc (second m))))
-	     ((string-match "-csc=(.*)" (car opts)) =>
-	      (lambda (m) (set! csc (second m))))
-	     ((string-match "-chicken=(.*)" (car opts)) =>
-	      (lambda (m) (set! chicken (second m))))
-	     (else
-	      (set! options opts)
-	      (return #f)))
-       (loop (cdr opts)))))
-  (set! cc (string-trim-both (with-input-from-pipe "csc -cc-name" read-line)))
-  (delete-file* "tmpfile.scm")
-  (delete-file* "bench.log")
-  (system* "~A -version" chicken)
-  (dflush "\nCC:\n")
-  (if (eq? (build-platform) 'sun)
-      (system (conc cc " -V"))
-      (system* "~A -v" cc) )
-  (dflush "\nCFLAGS:\n")
-  (system* "echo `~a -cflags`" csc)
-  (display "\nRunning benchmarks ...\n\n  (averaging over 5 runs, dropping highest and lowest, binaries are statically linked and stripped,\n")
-  (display "   compiler log will be written to \"bench.log\")\n")
-  (display "\n                     (runtime)                                  (code size)\n")
-  (display "\n                     base       fast     unsafe        max      base      fast    unsafe       max")
-  (display "\n                  ----------------------------------------------------------------------------------\n")
-  (let ((sum-base 0.0)
-	(sum-fast 0.0)
-        (sum-unsafe 0.0)
-        (sum-max 0.0)
-	(size-base 0)
-	(size-fast 0)
-	(size-unsafe 0)
-	(size-max 0))
-    (for-each
-     (lambda (file)
-       (let* ([name (pathname-file file)]
-	      [options (string-intersperse options " ")] 
-	      (t 0))
-	 (display-l name 16 #\space)
-	 (flush-output)
-	 (set!-values 
-	  (t size-base)
-	  (compile-and-run		; base
-	   file
-	   "-debug-level 0 -optimize-level 1" 
-	   options "" #f))
-	 (set! sum-base (+ sum-base t))
-	 (dflush "  ")
-	 (set!-values 
-	  (t size-fast)
-	  (compile-and-run		; fast but safe
-	   file
-	   "-debug-level 0 -optimize-level 3 -lambda-lift" 
-	   options "" #f))
-	 (set! sum-fast (+ sum-fast t))
-	 (dflush "  ")
-	 (set!-values
-	  (t size-unsafe)
-	  (compile-and-run 		; fast and unsafe
-	   file
-	   "-debug-level 0 -optimize-level 4 -block -disable-interrupts -lambda-lift" 
-	   options "" #t))
-	 (set! sum-unsafe (+ sum-unsafe t))
-	 (dflush "  ")
-	 (cond ((member name flonum-files)
-		(display "         "))
-	       (else
-		(set!-values
-		 (t size-max)
-		 (compile-and-run file "-benchmark-mode" options "" #t) ) ; maximal speed
-		(set! sum-max (+ sum-max t))))
-	 (display-size size-base)
-	 (display-size size-fast)
-	 (display-size size-unsafe)
-	 (display-size size-max)
-	 (newline)
-	 (flush-output)))
-     (lset-difference string=? (sort (glob "*.scm") string<?) ignored-files))
-    (display "\nTOTAL            ")
-    (display-f-4.3 sum-base)
-    (display "   ")
-    (display-f-4.3 sum-fast)
-    (display "   ")
-    (display-f-4.3 sum-unsafe)
-    (display "   ")
-    (display-f-4.3 sum-max)
-    (newline)
-    0))
-
-(main (command-line-arguments))
diff --git a/benchmarks/ctak.scm b/benchmarks/ctak.scm
deleted file mode 100644
index c2fc46b0..00000000
--- a/benchmarks/ctak.scm
+++ /dev/null
@@ -1,35 +0,0 @@
-;;; ctak.scm
-
-(define (ctak x y z)
-  (call-with-current-continuation
-   (lambda (k)
-     (ctak-aux k x y z))))
-
-(define (ctak-aux k x y z)
-  (cond ((not (< y x))			;xy
-         (k z))
-        (else (call-with-current-continuation
-	       (lambda (k)		; (was missing)
-		 (ctak-aux
-		  k
-		  (call-with-current-continuation
-		   (lambda (k)
-		     (ctak-aux k
-			       (- x 1)
-			       y
-			       z)))
-		  (call-with-current-continuation
-		   (lambda (k)
-		     (ctak-aux k
-			       (- y 1)
-			       z
-			       x)))
-		  (call-with-current-continuation
-		   (lambda (k)
-		     (ctak-aux k
-			       (- z 1)
-			       x
-			       y)))))))) )
-
-
-(time (do ((i 10 (- i 1))) ((zero? i)) (ctak 18 12 6)))
diff --git a/benchmarks/dderiv.scm b/benchmarks/dderiv.scm
deleted file mode 100644
index 911082bc..00000000
--- a/benchmarks/dderiv.scm
+++ /dev/null
@@ -1,76 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         dderiv.sc
-;;; Description:  DDERIV benchmark from the Gabriel tests
-;;; Author:       Vaughan Pratt
-;;; Created:      8-Apr-85
-;;; Modified:     10-Apr-85 14:53:29 (Bob Shaw)
-;;;               23-Jul-87 (Will Clinger)
-;;;               9-Feb-88 (Will Clinger)
-;;;               21-Mar-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;		  26-Mar-00 (flw)
-;;; Language:     Scheme (but see note below)
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; Note:  This benchmark uses property lists.  The procedures that must
-;;; be supplied are get and put, where (put x y z) is equivalent to Common
-;;; Lisp's (setf (get x y) z).
-
-;;; DDERIV -- Symbolic derivative benchmark written by Vaughan Pratt.
-
-;;; This benchmark is a variant of the simple symbolic derivative program
-;;; (DERIV). The main change is that it is `table-driven.'  Instead of using a
-;;; large COND that branches on the CAR of the expression, this program finds
-;;; the code that will take the derivative on the property list of the atom in
-;;; the CAR position. So, when the expression is (+ . <rest>), the code
-;;; stored under the atom '+ with indicator DERIV will take <rest> and
-;;; return the derivative for '+. The way that MacLisp does this is with the
-;;; special form: (DEFUN (FOO BAR) ...). This is exactly like DEFUN with an
-;;; atomic name in that it expects an argument list and the compiler compiles
-;;; code, but the name of the function with that code is stored on the
-;;; property list of FOO under the indicator BAR, in this case. You may have
-;;; to do something like:
-
-;;; :property keyword is not Common Lisp.
-
-
-(define (dderiv-aux a) (list '/ (dderiv a) a))
-
-(define (+dderiv a) (cons '+ (map dderiv a)))
-
-(put! '+ 'dderiv +dderiv)    ; install procedure on the property list
-
-(define (-dderiv a) (cons '- (map dderiv a)))
-
-(put! '- 'dderiv -dderiv)    ; install procedure on the property list
-
-(define (*dderiv a) (list '* (cons '* a) (cons '+ (map dderiv-aux a))))
-
-(put! '* 'dderiv *dderiv)    ; install procedure on the property list
-
-(define (/dderiv a)
- (list '-
-       (list '/ (dderiv (car a)) (cadr a))
-       (list '/
-	     (car a)
-	     (list '* (cadr a) (cadr a) (dderiv (cadr a))))))
-
-(put! '/ 'dderiv /dderiv)    ; install procedure on the property list
-
-(define (dderiv a)
- (cond ((not (pair? a)) (cond ((eq? a 'x) 1) (else 0)))
-       (else (let ((dderiv (get (car a) 'dderiv)))
-	      (cond (dderiv (dderiv (cdr a)))
-		    (else 'error))))))
-
-(define (run)
- (do ((i 0 (+ i 1))) ((= i 1000))
-  (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (dderiv '(+ (* 3 x x) (* a x x) (* b x) 5))))
-
-
-(time (do ((i 10 (- i 1))) ((zero? i)) (run)))
diff --git a/benchmarks/deriv.scm b/benchmarks/deriv.scm
deleted file mode 100644
index 10f848cc..00000000
--- a/benchmarks/deriv.scm
+++ /dev/null
@@ -1,42 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         deriv.sc
-;;; Description:  The DERIV benchmark from the Gabriel tests.
-;;; Author:       Vaughan Pratt
-;;; Created:      8-Apr-85
-;;; Modified:     10-Apr-85 14:53:50 (Bob Shaw)
-;;;               23-Jul-87 (Will Clinger)
-;;;               9-Feb-88 (Will Clinger)
-;;;               21-Mar-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (felix)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; DERIV -- Symbolic derivative benchmark written by Vaughan Pratt.
-;;; It uses a simple subset of Lisp and does a lot of CONSing.
-
-(define (deriv-aux a) (list '/ (deriv a) a))
-
-(define (deriv a)
- (cond ((not (pair? a)) (cond ((eq? a 'x) 1) (else 0)))
-       ((eq? (car a) '+) (cons '+ (map deriv (cdr a))))
-       ((eq? (car a) '-) (cons '- (map deriv (cdr a))))
-       ((eq? (car a) '*) (list '* a (cons '+ (map deriv-aux (cdr a)))))
-       ((eq? (car a) '/)
-	(list '-
-	      (list '/ (deriv (cadr a)) (caddr a))
-	      (list '/
-		    (cadr a)
-		    (list '* (caddr a) (caddr a) (deriv (caddr a))))))
-       (else 'error)))
-
-(define (run)
- (do ((i 0 (+ i 1))) ((= i 1000))
-  (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))
-  (deriv '(+ (* 3 x x) (* a x x) (* b x) 5))))
-
-(time (do ((i 10 (- i 1))) ((zero? i)) (run)))
diff --git a/benchmarks/destructive.scm b/benchmarks/destructive.scm
deleted file mode 100644
index 4b54e62a..00000000
--- a/benchmarks/destructive.scm
+++ /dev/null
@@ -1,47 +0,0 @@
-;;; destructive.scm
-
-
-(define (append! lst1 lst2)
-  (let loop ((lst1 lst1))
-    (cond ((null? lst1) lst2)
-	  ((null? (cdr lst1)) (set-cdr! lst1 lst2))
-	  (else (loop (cdr lst1))) ) )
-  lst1)
-
-(define (destructive n m)
-  (let ((l (do ((i 10 (- i 1))
-                (a '() (cons '() a)))
-               ((= i 0) a))))
-    (do ((i n (- i 1)))
-        ((= i 0))
-      (cond ((null? (car l))
-             (do ((l l (cdr l)))
-                 ((null? l))
-               (or (car l)
-                   (set-car! l (cons '() '())))
-               (append! (car l)
-			(do ((j m (- j 1))
-			     (a '() (cons '() a)))
-			    ((= j 0) a)))))
-            (else
-             (do ((l1 l (cdr l1))
-                  (l2 (cdr l) (cdr l2)))
-                 ((null? l2))
-               (set-cdr! (do ((j (quotient (length (car l2)) 2) (- j 1))
-			      (a (car l2) (cdr a)))
-			     ((zero? j) a)
-			   (set-car! a i))
-			 (let ((n (quotient (length (car l1)) 2)))
-			   (cond ((= n 0)
-				  (set-car! l1 '())
-				  (car l1))
-				 (else
-				  (do ((j n (- j 1))
-				       (a (car l1) (cdr a)))
-				      ((= j 1)
-				       (let ((x (cdr a)))
-					 (set-cdr! a '())
-					 x))
-				    (set-car! a i))))))))))))
- 
-(time (destructive 6000 50))
diff --git a/benchmarks/div-iter.scm b/benchmarks/div-iter.scm
deleted file mode 100644
index 1639344b..00000000
--- a/benchmarks/div-iter.scm
+++ /dev/null
@@ -1,24 +0,0 @@
-;;; div-iter.scm
-
-
-(define (create-n n)
-  (do ((n n (- n 1))
-       (a '() (cons '() a)))
-      ((= n 0) a)))
- 
-(define *ll* (create-n 200))
- 
-(define (iterative-div2 l)
-  (do ((l l (cddr l))
-       (a '() (cons (car l) a)))
-      ((null? l) a)))
- 
-(define (test l)
-  (do ((i 3000 (- i 1)))
-      ((= i 0))
-    (iterative-div2 l)
-    (iterative-div2 l)
-    (iterative-div2 l)
-    (iterative-div2 l)))
-
-(time (test *ll*))
diff --git a/benchmarks/div-rec.scm b/benchmarks/div-rec.scm
deleted file mode 100644
index d100f405..00000000
--- a/benchmarks/div-rec.scm
+++ /dev/null
@@ -1,23 +0,0 @@
-;;; div-rec.scm
-
-
-(define (create-n n)
-  (do ((n n (- n 1))
-       (a '() (cons '() a)))
-      ((= n 0) a)))
- 
-(define *ll* (create-n 200))
- 
-(define (recursive-div2 l)
-  (cond ((null? l) '())
-        (else (cons (car l) (recursive-div2 (cddr l))))))
- 
-(define (test l)
-  (do ((i 3000 (- i 1)))
-      ((= i 0))
-    (recursive-div2 l)
-    (recursive-div2 l)
-    (recursive-div2 l)
-    (recursive-div2 l)))
-
-(time (test *ll*))
diff --git a/benchmarks/dynamic.scm b/benchmarks/dynamic.scm
deleted file mode 100644
index bfe1d140..00000000
--- a/benchmarks/dynamic.scm
+++ /dev/null
@@ -1,2320 +0,0 @@
-;;; DYNAMIC -- Obtained from Andrew Wright.
-;
-; 08/06/01 (felix): renamed "null" to "null2" because stupid MZC can't
-; handle redefinitions of primitives.
-;
-;
-;; Fritz's dynamic type inferencer, set up to run on itself
-;; (see the end of this file).
-
-;----------------------------------------------------------------------------
-; Environment management
-;----------------------------------------------------------------------------
-
-;; environments are lists of pairs, the first component being the key
-
-;; general environment operations
-;;
-;; empty-env: Env
-;; gen-binding: Key x Value -> Binding
-;; binding-key: Binding -> Key
-;; binding-value: Binding -> Value
-;; binding-show: Binding -> Symbol*
-;; extend-env-with-binding: Env x Binding -> Env
-;; extend-env-with-env: Env x Env -> Env
-;; lookup: Key x Env -> (Binding + False)
-;; env->list: Env -> Binding*
-;; env-show: Env -> Symbol*
-
-
-; bindings
-
-(define gen-binding cons)
-; generates a type binding, binding a symbol to a type variable
-
-(define binding-key car)
-; returns the key of a type binding
-
-(define binding-value cdr)
-; returns the tvariable of a type binding
-
-(define (key-show key)
-  ; default show procedure for keys
-  key)
-
-(define (value-show value)
-  ; default show procedure for values
-  value)
-
-(define (binding-show binding)
-  ; returns a printable representation of a type binding
-  (cons (key-show (binding-key binding))
-        (cons ': (value-show (binding-value binding)))))
-
-
-; environments
-
-(define dynamic-empty-env '())
-; returns the empty environment
-
-(define (extend-env-with-binding env binding)
-  ; extends env with a binding, which hides any other binding in env
-  ; for the same key (see dynamic-lookup)
-  ; returns the extended environment
-  (cons binding env))
-
-(define (extend-env-with-env env ext-env)
-  ; extends environment env with environment ext-env 
-  ; a binding for a key in ext-env hides any binding in env for
-  ; the same key (see dynamic-lookup)
-  ; returns the extended environment
-  (append ext-env env))
-
-(define dynamic-lookup (lambda (x l) (assv x l)))
-; returns the first pair in env that matches the key; returns #f
-; if no such pair exists
-
-(define (env->list e)
-  ; converts an environment to a list of bindings
-  e)
-
-(define (env-show env)
-  ; returns a printable list representation of a type environment
-  (map binding-show env))
-;----------------------------------------------------------------------------
-;       Parsing for Scheme
-;----------------------------------------------------------------------------
-
-
-;; Needed packages: environment management
-
-;(load "env-mgmt.ss")
-;(load "pars-act.ss")
-
-;; Lexical notions
-
-(define syntactic-keywords
-  ;; source: IEEE Scheme, 7.1, <expression keyword>, <syntactic keyword>
-  '(lambda if set! begin cond and or case let let* letrec do
-          quasiquote else => define unquote unquote-splicing))
-
-
-;; Parse routines
-
-; Datum
-
-; dynamic-parse-datum: parses nonterminal <datum>
-
-(define (dynamic-parse-datum e)
-  ;; Source: IEEE Scheme, sect. 7.2, <datum>
-  ;; Note: "'" is parsed as 'quote, "`" as 'quasiquote, "," as
-  ;; 'unquote, ",@" as 'unquote-splicing (see sect. 4.2.5, p. 18)
-  ;; ***Note***: quasi-quotations are not permitted! (It would be
-  ;; necessary to pass the environment to dynamic-parse-datum.)
-  (cond
-   ((null? e)
-    (dynamic-parse-action-null-const))
-   ((boolean? e)
-    (dynamic-parse-action-boolean-const e))
-   ((char? e)
-    (dynamic-parse-action-char-const e))
-   ((number? e)
-    (dynamic-parse-action-number-const e))
-   ((string? e)
-    (dynamic-parse-action-string-const e))
-   ((symbol? e)
-    (dynamic-parse-action-symbol-const e))
-   ((vector? e)
-    (dynamic-parse-action-vector-const (map dynamic-parse-datum (vector->list e))))
-   ((pair? e)
-    (dynamic-parse-action-pair-const (dynamic-parse-datum (car e))
-                             (dynamic-parse-datum (cdr e))))
-   (else (error 'dynamic-parse-datum "Unknown datum: ~s" e))))
-
-
-; VarDef
-
-; dynamic-parse-formal: parses nonterminal <variable> in defining occurrence position
-
-(define (dynamic-parse-formal f-env e)
-  ; e is an arbitrary object, f-env is a forbidden environment;
-  ; returns: a variable definition (a binding for the symbol), plus
-  ; the value of the binding as a result
-  (if (symbol? e)
-      (cond
-       ((memq e syntactic-keywords)
-        (error 'dynamic-parse-formal "Illegal identifier (keyword): ~s" e))
-       ((dynamic-lookup e f-env)
-        (error 'dynamic-parse-formal "Duplicate variable definition: ~s" e))
-       (else (let ((dynamic-parse-action-result (dynamic-parse-action-var-def e)))
-               (cons (gen-binding e dynamic-parse-action-result)
-                     dynamic-parse-action-result))))
-      (error 'dynamic-parse-formal "Not an identifier: ~s" e)))
-
-; dynamic-parse-formal*
-
-(define (dynamic-parse-formal* formals)
-  ;; parses a list of formals and returns a pair consisting of generated
-  ;; environment and list of parsing action results
-  (letrec
-      ((pf*
-        (lambda (f-env results formals)
-          ;; f-env: "forbidden" environment (to avoid duplicate defs)
-          ;; results: the results of the parsing actions
-          ;; formals: the unprocessed formals
-          ;; Note: generates the results of formals in reverse order!
-          (cond
-           ((null? formals)
-            (cons f-env results))
-           ((pair? formals)
-            (let* ((fst-formal (car formals))
-                   (binding-result (dynamic-parse-formal f-env fst-formal))
-                   (binding (car binding-result))
-                   (var-result (cdr binding-result)))
-              (pf*
-               (extend-env-with-binding f-env binding)
-               (cons var-result results)
-               (cdr formals))))
-           (else (error 'dynamic-parse-formal* "Illegal formals: ~s" formals))))))
-    (let ((renv-rres (pf* dynamic-empty-env '() formals)))
-      (cons (car renv-rres) (reverse (cdr renv-rres))))))
-
-
-; dynamic-parse-formals: parses <formals>
-
-(define (dynamic-parse-formals formals)
-  ;; parses <formals>; see IEEE Scheme, sect. 7.3
-  ;; returns a pair: env and result
-  (letrec ((pfs (lambda (f-env formals)
-                  (cond
-                   ((null? formals)
-                    (cons dynamic-empty-env (dynamic-parse-action-null-formal)))
-                   ((pair? formals)
-                    (let* ((fst-formal (car formals))
-                           (rem-formals (cdr formals))
-                           (bind-res (dynamic-parse-formal f-env fst-formal))
-                           (bind (car bind-res))
-                           (res (cdr bind-res))
-                           (nf-env (extend-env-with-binding f-env bind))
-                           (renv-res* (pfs nf-env rem-formals))
-                           (renv (car renv-res*))
-                           (res* (cdr renv-res*)))
-                      (cons
-                       (extend-env-with-binding renv bind)
-                       (dynamic-parse-action-pair-formal res res*))))
-                   (else
-                    (let* ((bind-res (dynamic-parse-formal f-env formals))
-                           (bind (car bind-res))
-                           (res (cdr bind-res)))
-                      (cons
-                       (extend-env-with-binding dynamic-empty-env bind)
-                       res)))))))
-    (pfs dynamic-empty-env formals)))
-
-
-; Expr
-
-; dynamic-parse-expression: parses nonterminal <expression>
-
-(define (dynamic-parse-expression env e)
-  (cond
-   ((symbol? e)
-    (dynamic-parse-variable env e))
-   ((pair? e)
-    (let ((op (car e)) (args (cdr e)))
-      (case op
-        ((quote) (dynamic-parse-quote env args))
-        ((lambda) (dynamic-parse-lambda env args))
-        ((if) (dynamic-parse-if env args))
-        ((set!) (dynamic-parse-set env args))
-        ((begin) (dynamic-parse-begin env args))
-        ((cond) (dynamic-parse-cond env args))
-        ((case) (dynamic-parse-case env args))
-        ((and) (dynamic-parse-and env args))
-        ((or) (dynamic-parse-or env args))
-        ((let) (dynamic-parse-let env args))
-        ((let*) (dynamic-parse-let* env args))
-        ((letrec) (dynamic-parse-letrec env args))
-        ((do) (dynamic-parse-do env args))
-        ((quasiquote) (dynamic-parse-quasiquote env args))
-        (else (dynamic-parse-procedure-call env op args)))))
-   (else (dynamic-parse-datum e))))
-
-; dynamic-parse-expression*
-
-(define (dynamic-parse-expression* env exprs)
-  ;; Parses lists of expressions (returns them in the right order!)
-  (letrec ((pe*
-            (lambda (results es)
-              (cond
-               ((null? es) results)
-               ((pair? es) (pe* (cons (dynamic-parse-expression env (car es)) results) (cdr es)))
-               (else (error 'dynamic-parse-expression* "Not a list of expressions: ~s" es))))))
-    (reverse (pe* '() exprs))))
-
-
-; dynamic-parse-expressions
-
-(define (dynamic-parse-expressions env exprs)
-  ;; parses lists of arguments of a procedure call
-  (cond
-   ((null? exprs) (dynamic-parse-action-null-arg))
-   ((pair? exprs) (let* ((fst-expr (car exprs))
-                         (rem-exprs (cdr exprs))
-                         (fst-res (dynamic-parse-expression env fst-expr))
-                         (rem-res (dynamic-parse-expressions env rem-exprs)))
-                    (dynamic-parse-action-pair-arg fst-res rem-res)))
-   (else (error 'dynamic-parse-expressions "Illegal expression list: ~s"
-                exprs))))
-
-
-; dynamic-parse-variable: parses variables (applied occurrences)
-
-(define (dynamic-parse-variable env e)
-  (if (symbol? e)
-      (if (memq e syntactic-keywords)
-          (error 'dynamic-parse-variable "Illegal identifier (keyword): ~s" e)
-          (let ((assoc-var-def (dynamic-lookup e env)))
-            (if assoc-var-def
-                (dynamic-parse-action-variable (binding-value assoc-var-def))
-                (dynamic-parse-action-identifier e))))
-      (error 'dynamic-parse-variable "Not an identifier: ~s" e)))
-
-
-; dynamic-parse-procedure-call
-
-(define (dynamic-parse-procedure-call env op args)
-  (dynamic-parse-action-procedure-call
-   (dynamic-parse-expression env op)
-   (dynamic-parse-expressions env args)))
-
-
-; dynamic-parse-quote
-
-(define (dynamic-parse-quote env args)
-  (if (list-of-1? args)
-      (dynamic-parse-datum (car args))
-      (error 'dynamic-parse-quote "Not a datum (multiple arguments): ~s" args)))
-
-
-; dynamic-parse-lambda
-
-(define (dynamic-parse-lambda env args)
-  (if (pair? args)
-      (let* ((formals (car args))
-             (body (cdr args))
-             (nenv-fresults (dynamic-parse-formals formals))
-             (nenv (car nenv-fresults))
-             (fresults (cdr nenv-fresults)))
-        (dynamic-parse-action-lambda-expression
-         fresults
-         (dynamic-parse-body (extend-env-with-env env nenv) body)))
-      (error 'dynamic-parse-lambda "Illegal formals/body: ~s" args)))
-
-
-; dynamic-parse-body
-
-(define (dynamic-parse-body env body)
-  ; <body> = <definition>* <expression>+
-  (define (def-var* f-env body)
-    ; finds the defined variables in a body and returns an 
-    ; environment containing them
-    (if (pair? body)
-        (let ((n-env (def-var f-env (car body))))
-          (if n-env
-              (def-var* n-env (cdr body))
-              f-env))
-        f-env))
-  (define (def-var f-env clause)
-    ; finds the defined variables in a single clause and extends
-    ; f-env accordingly; returns false if it's not a definition
-    (if (pair? clause)
-        (case (car clause)
-          ((define) (if (pair? (cdr clause))
-                        (let ((pattern (cadr clause)))
-                          (cond
-                           ((symbol? pattern)
-                            (extend-env-with-binding 
-                             f-env 
-                             (gen-binding pattern
-                                          (dynamic-parse-action-var-def pattern))))
-                           ((and (pair? pattern) (symbol? (car pattern)))
-                            (extend-env-with-binding
-                             f-env
-                             (gen-binding (car pattern)
-                                          (dynamic-parse-action-var-def 
-                                           (car pattern)))))
-                           (else f-env)))
-                        f-env))
-          ((begin) (def-var* f-env (cdr clause)))
-          (else #f))
-        #f))
-  (if (pair? body)
-      (dynamic-parse-command* (def-var* env body) body)
-      (error 'dynamic-parse-body "Illegal body: ~s" body)))
-
-; dynamic-parse-if
-
-(define (dynamic-parse-if env args)
-  (cond
-   ((list-of-3? args)
-    (dynamic-parse-action-conditional
-     (dynamic-parse-expression env (car args))
-     (dynamic-parse-expression env (cadr args))
-     (dynamic-parse-expression env (caddr args))))
-   ((list-of-2? args)
-    (dynamic-parse-action-conditional
-     (dynamic-parse-expression env (car args))
-     (dynamic-parse-expression env (cadr args))
-     (dynamic-parse-action-empty)))
-   (else (error 'dynamic-parse-if "Not an if-expression: ~s" args))))
-
-
-; dynamic-parse-set
-
-(define (dynamic-parse-set env args)
-  (if (list-of-2? args)
-      (dynamic-parse-action-assignment
-       (dynamic-parse-variable env (car args))
-       (dynamic-parse-expression env (cadr args)))
-      (error 'dynamic-parse-set "Not a variable/expression pair: ~s" args)))
-
-
-; dynamic-parse-begin
-
-(define (dynamic-parse-begin env args)
-  (dynamic-parse-action-begin-expression
-   (dynamic-parse-body env args)))
-
-
-; dynamic-parse-cond
-
-(define (dynamic-parse-cond env args)
-  (if (and (pair? args) (list? args))
-      (dynamic-parse-action-cond-expression
-       (map (lambda (e)
-              (dynamic-parse-cond-clause env e))
-            args))
-      (error 'dynamic-parse-cond "Not a list of cond-clauses: ~s" args)))
-
-; dynamic-parse-cond-clause
-
-(define (dynamic-parse-cond-clause env e)
-  ;; ***Note***: Only (<test> <sequence>) is permitted!
-  (if (pair? e)
-      (cons
-       (if (eqv? (car e) 'else)
-           (dynamic-parse-action-empty)
-           (dynamic-parse-expression env (car e)))
-       (dynamic-parse-body env (cdr e)))
-      (error 'dynamic-parse-cond-clause "Not a cond-clause: ~s" e)))
-
-
-; dynamic-parse-and
-
-(define (dynamic-parse-and env args)
-  (if (list? args)
-      (dynamic-parse-action-and-expression
-       (dynamic-parse-expression* env args))
-      (error 'dynamic-parse-and "Not a list of arguments: ~s" args)))
-
-
-; dynamic-parse-or
-
-(define (dynamic-parse-or env args)
-  (if (list? args)
-      (dynamic-parse-action-or-expression
-       (dynamic-parse-expression* env args))
-      (error 'dynamic-parse-or "Not a list of arguments: ~s" args)))
-
-
-; dynamic-parse-case
-
-(define (dynamic-parse-case env args)
-  (if (and (list? args) (> (length args) 1))
-      (dynamic-parse-action-case-expression
-       (dynamic-parse-expression env (car args))
-       (map (lambda (e)
-               (dynamic-parse-case-clause env e))
-             (cdr args)))
-      (error 'dynamic-parse-case "Not a list of clauses: ~s" args)))
-
-; dynamic-parse-case-clause
-
-(define (dynamic-parse-case-clause env e)
-  (if (pair? e)
-      (cons
-       (cond
-        ((eqv? (car e) 'else)
-         (list (dynamic-parse-action-empty)))
-        ((list? (car e))
-         (map dynamic-parse-datum (car e)))
-        (else (error 'dynamic-parse-case-clause "Not a datum list: ~s" (car e))))
-       (dynamic-parse-body env (cdr e)))
-      (error 'dynamic-parse-case-clause "Not case clause: ~s" e)))
-
-
-; dynamic-parse-let
-
-(define (dynamic-parse-let env args)
-  (if (pair? args)
-      (if (symbol? (car args))
-          (dynamic-parse-named-let env args)
-          (dynamic-parse-normal-let env args))
-      (error 'dynamic-parse-let "Illegal bindings/body: ~s" args)))
-
-
-; dynamic-parse-normal-let
-
-(define (dynamic-parse-normal-let env args)
-  ;; parses "normal" let-expressions
-  (let* ((bindings (car args))
-         (body (cdr args))
-         (env-ast (dynamic-parse-parallel-bindings env bindings))
-         (nenv (car env-ast))
-         (bresults (cdr env-ast)))
-    (dynamic-parse-action-let-expression
-     bresults
-     (dynamic-parse-body (extend-env-with-env env nenv) body))))
-
-; dynamic-parse-named-let
-
-(define (dynamic-parse-named-let env args)
-  ;; parses a named let-expression
-  (if (pair? (cdr args))
-      (let* ((variable (car args))
-             (bindings (cadr args))
-             (body (cddr args))
-             (vbind-vres (dynamic-parse-formal dynamic-empty-env variable))
-             (vbind (car vbind-vres))
-             (vres (cdr vbind-vres))
-             (env-ast (dynamic-parse-parallel-bindings env bindings))
-             (nenv (car env-ast))
-             (bresults (cdr env-ast)))
-        (dynamic-parse-action-named-let-expression
-         vres bresults
-         (dynamic-parse-body (extend-env-with-env 
-                      (extend-env-with-binding env vbind)
-                      nenv) body)))
-      (error 'dynamic-parse-named-let "Illegal named let-expression: ~s" args)))
-
-
-; dynamic-parse-parallel-bindings
-
-(define (dynamic-parse-parallel-bindings env bindings)
-  ; returns a pair consisting of an environment
-  ; and a list of pairs (variable . asg)
-  ; ***Note***: the list of pairs is returned in reverse unzipped form!
-  (if (list-of-list-of-2s? bindings)
-      (let* ((env-formals-asg
-             (dynamic-parse-formal* (map car bindings)))
-            (nenv (car env-formals-asg))
-            (bresults (cdr env-formals-asg))
-            (exprs-asg
-             (dynamic-parse-expression* env (map cadr bindings))))
-        (cons nenv (cons bresults exprs-asg)))
-      (error 'dynamic-parse-parallel-bindings
-             "Not a list of bindings: ~s" bindings)))
-
-
-; dynamic-parse-let*
-
-(define (dynamic-parse-let* env args)
-  (if (pair? args)
-      (let* ((bindings (car args))
-             (body (cdr args))
-             (env-ast (dynamic-parse-sequential-bindings env bindings))
-             (nenv (car env-ast))
-             (bresults (cdr env-ast)))
-        (dynamic-parse-action-let*-expression
-         bresults
-         (dynamic-parse-body (extend-env-with-env env nenv) body)))
-      (error 'dynamic-parse-let* "Illegal bindings/body: ~s" args)))
-
-; dynamic-parse-sequential-bindings
-
-(define (dynamic-parse-sequential-bindings env bindings)
-  ; returns a pair consisting of an environment
-  ; and a list of pairs (variable . asg)
-  ;; ***Note***: the list of pairs is returned in reverse unzipped form!
-  (letrec
-      ((psb
-        (lambda (f-env c-env var-defs expr-asgs binds)
-          ;; f-env: forbidden environment
-          ;; c-env: constructed environment
-          ;; var-defs: results of formals
-          ;; expr-asgs: results of corresponding expressions
-          ;; binds: reminding bindings to process
-          (cond
-           ((null? binds)
-            (cons f-env (cons var-defs expr-asgs)))
-           ((pair? binds)
-            (let ((fst-bind (car binds)))
-              (if (list-of-2? fst-bind)
-                  (let* ((fbinding-bres
-                          (dynamic-parse-formal f-env (car fst-bind)))
-                         (fbind (car fbinding-bres))
-                         (bres (cdr fbinding-bres))
-                         (new-expr-asg
-                          (dynamic-parse-expression c-env (cadr fst-bind))))
-                    (psb
-                     (extend-env-with-binding f-env fbind)
-                     (extend-env-with-binding c-env fbind)
-                     (cons bres var-defs)
-                     (cons new-expr-asg expr-asgs)
-                     (cdr binds)))
-                  (error 'dynamic-parse-sequential-bindings
-                         "Illegal binding: ~s" fst-bind))))
-           (else (error 'dynamic-parse-sequential-bindings
-                        "Illegal bindings: ~s" binds))))))
-    (let ((env-vdefs-easgs (psb dynamic-empty-env env '() '() bindings)))
-      (cons (car env-vdefs-easgs)
-            (cons (reverse (cadr env-vdefs-easgs))
-                  (reverse (cddr env-vdefs-easgs)))))))
-
-
-; dynamic-parse-letrec
-
-(define (dynamic-parse-letrec env args)
-  (if (pair? args)
-      (let* ((bindings (car args))
-             (body (cdr args))
-             (env-ast (dynamic-parse-recursive-bindings env bindings))
-             (nenv (car env-ast))
-             (bresults (cdr env-ast)))
-        (dynamic-parse-action-letrec-expression
-          bresults
-          (dynamic-parse-body (extend-env-with-env env nenv) body)))
-      (error 'dynamic-parse-letrec "Illegal bindings/body: ~s" args)))
-
-; dynamic-parse-recursive-bindings
-
-(define (dynamic-parse-recursive-bindings env bindings)
-  ;; ***Note***: the list of pairs is returned in reverse unzipped form!
-  (if (list-of-list-of-2s? bindings)
-      (let* ((env-formals-asg
-              (dynamic-parse-formal* (map car bindings)))
-             (formals-env
-              (car env-formals-asg))
-             (formals-res
-              (cdr env-formals-asg))
-             (exprs-asg
-              (dynamic-parse-expression*
-               (extend-env-with-env env formals-env)
-               (map cadr bindings))))
-        (cons
-         formals-env
-         (cons formals-res exprs-asg)))
-      (error 'dynamic-parse-recursive-bindings "Illegal bindings: ~s" bindings)))
-
-
-; dynamic-parse-do
-
-(define (dynamic-parse-do env args)
-  ;; parses do-expressions
-  ;; ***Note***: Not implemented!
-  (error 'dynamic-parse-do "Nothing yet..."))
-
-; dynamic-parse-quasiquote
-
-(define (dynamic-parse-quasiquote env args)
-  ;; ***Note***: Not implemented!
-  (error 'dynamic-parse-quasiquote "Nothing yet..."))
-
-
-;; Command
-
-; dynamic-parse-command
-
-(define (dynamic-parse-command env c)
-  (if (pair? c)
-      (let ((op (car c))
-            (args (cdr c)))
-        (case op
-         ((define) (dynamic-parse-define env args))
-;        ((begin) (dynamic-parse-command* env args))  ;; AKW
-         ((begin) (dynamic-parse-action-begin-expression (dynamic-parse-command* env args)))
-         (else (dynamic-parse-expression env c))))
-      (dynamic-parse-expression env c)))
-
-
-; dynamic-parse-command*
-
-(define (dynamic-parse-command* env commands)
-  ;; parses a sequence of commands
-  (if (list? commands)
-      (map (lambda (command) (dynamic-parse-command env command)) commands)
-      (error 'dynamic-parse-command* "Invalid sequence of commands: ~s" commands)))
-
-
-; dynamic-parse-define
-
-(define (dynamic-parse-define env args)
-  ;; three cases -- see IEEE Scheme, sect. 5.2
-  ;; ***Note***: the parser admits forms (define (x . y) ...)
-  ;; ***Note***: Variables are treated as applied occurrences!
-  (if (pair? args)
-      (let ((pattern (car args))
-            (exp-or-body (cdr args)))
-        (cond
-         ((symbol? pattern)
-          (if (list-of-1? exp-or-body)
-              (dynamic-parse-action-definition
-               (dynamic-parse-variable env pattern)
-               (dynamic-parse-expression env (car exp-or-body)))
-              (error 'dynamic-parse-define "Not a single expression: ~s" exp-or-body)))
-         ((pair? pattern)
-          (let* ((function-name (car pattern))
-                 (function-arg-names (cdr pattern))
-                 (env-ast (dynamic-parse-formals function-arg-names))
-                 (formals-env (car env-ast))
-                 (formals-ast (cdr env-ast)))
-            (dynamic-parse-action-function-definition
-             (dynamic-parse-variable env function-name)
-             formals-ast
-             (dynamic-parse-body (extend-env-with-env env formals-env) exp-or-body))))
-         (else (error 'dynamic-parse-define "Not a valid pattern: ~s" pattern))))
-      (error 'dynamic-parse-define "Not a valid definition: ~s" args)))
-
-;; Auxiliary routines
-
-; forall?
-
-(define (forall? pred list)
-  (if (null? list)
-      #t
-      (and (pred (car list)) (forall? pred (cdr list)))))
-
-; list-of-1?
-
-(define (list-of-1? l)
-  (and (pair? l) (null? (cdr l))))
-
-; list-of-2?
-
-(define (list-of-2? l)
-  (and (pair? l) (pair? (cdr l)) (null? (cddr l))))
-
-; list-of-3?
-
-(define (list-of-3? l)
-  (and (pair? l) (pair? (cdr l)) (pair? (cddr l)) (null? (cdddr l))))
-
-; list-of-list-of-2s?
-
-(define (list-of-list-of-2s? e)
-  (cond
-   ((null? e)
-    #t)
-   ((pair? e)
-    (and (list-of-2? (car e)) (list-of-list-of-2s? (cdr e))))
-   (else #f)))
-
-
-;; File processing
-
-; dynamic-parse-from-port
-
-(define (dynamic-parse-from-port port)
-  (let ((next-input (read port)))
-    (if (eof-object? next-input)
-        '()
-        (dynamic-parse-action-commands
-         (dynamic-parse-command dynamic-empty-env next-input)
-         (dynamic-parse-from-port port)))))
-
-; dynamic-parse-file
-
-(define (dynamic-parse-file file-name)
-  (let ((input-port (open-input-file file-name)))
-    (dynamic-parse-from-port input-port)))
-;----------------------------------------------------------------------------
-; Implementation of Union/find data structure in Scheme
-;----------------------------------------------------------------------------
-
-;; for union/find the following attributes are necessary: rank, parent 
-;; (see Tarjan, "Data structures and network algorithms", 1983)
-;; In the Scheme realization an element is represented as a single
-;; cons cell; its address is the element itself; the car field contains 
-;; the parent, the cdr field is an address for a cons
-;; cell containing the rank (car field) and the information (cdr field)
-
-
-;; general union/find data structure
-;; 
-;; gen-element: Info -> Elem
-;; find: Elem -> Elem
-;; link: Elem! x Elem! -> Elem
-;; asymm-link: Elem! x Elem! -> Elem
-;; info: Elem -> Info
-;; set-info!: Elem! x Info -> Void
-
-
-(define (gen-element info)
-  ; generates a new element: the parent field is initialized to '(),
-  ; the rank field to 0
-  (cons '() (cons 0 info)))
-
-(define info (lambda (l) (cddr l)))
-  ; returns the information stored in an element
-
-(define (set-info! elem info)
-  ; sets the info-field of elem to info
-  (set-cdr! (cdr elem) info))
-
-; (define (find! x)
-;   ; finds the class representative of x and sets the parent field 
-;   ; directly to the class representative (a class representative has
-;   ; '() as its parent) (uses path halving)
-;   ;(display "Find!: ")
-;   ;(display (pretty-print (info x)))
-;   ;(newline)
-;   (let ((px (car x)))
-;     (if (null? px)
-;       x
-;       (let ((ppx (car px)))
-;         (if (null? ppx)
-;             px
-;             (begin
-;               (set-car! x ppx)
-;               (find! ppx)))))))
-
-(define (find! elem)
-  ; finds the class representative of elem and sets the parent field 
-  ; directly to the class representative (a class representative has
-  ; '() as its parent)
-  ;(display "Find!: ")
-  ;(display (pretty-print (info elem)))
-  ;(newline)
-  (let ((p-elem (car elem)))
-    (if (null? p-elem)
-        elem
-        (let ((rep-elem (find! p-elem)))
-          (set-car! elem rep-elem)
-          rep-elem))))
-
-(define (link! elem-1 elem-2)
-  ; links class elements by rank
-  ; they must be distinct class representatives
-  ; returns the class representative of the merged equivalence classes
-  ;(display "Link!: ")
-  ;(display (pretty-print (list (info elem-1) (info elem-2))))
-  ;(newline)
-  (let ((rank-1 (cadr elem-1))
-        (rank-2 (cadr elem-2)))
-    (cond
-     ((= rank-1 rank-2)
-      (set-car! (cdr elem-2) (+ rank-2 1))
-      (set-car! elem-1 elem-2)
-      elem-2)
-     ((> rank-1 rank-2)
-      (set-car! elem-2 elem-1)
-      elem-1)
-     (else
-      (set-car! elem-1 elem-2)
-      elem-2))))
-
-(define asymm-link! (lambda (l x) (set-car! l x)))
-
-;(define (asymm-link! elem-1 elem-2)
-  ; links elem-1 onto elem-2 no matter what rank; 
-  ; does not update the rank of elem-2 and does not return a value
-  ; the two arguments must be distinct
-  ;(display "AsymmLink: ")
-  ;(display (pretty-print (list (info elem-1) (info elem-2))))
-  ;(newline)
-  ;(set-car! elem-1 elem-2))
-
-;----------------------------------------------------------------------------
-; Type management
-;----------------------------------------------------------------------------
-
-; introduces type variables and types for Scheme,
-
-
-;; type TVar (type variables)
-;;
-;; gen-tvar:          () -> TVar
-;; gen-type:          TCon x TVar* -> TVar
-;; dynamic:           TVar
-;; tvar-id:           TVar -> Symbol
-;; tvar-def:          TVar -> Type + Null
-;; tvar-show:         TVar -> Symbol*
-;;
-;; set-def!:          !TVar x TCon x TVar* -> Null
-;; equiv!:            !TVar x !TVar -> Null
-;;
-;;
-;; type TCon (type constructors)
-;;
-;; ...
-;;
-;; type Type (types)
-;;
-;; gen-type:          TCon x TVar* -> Type
-;; type-con:          Type -> TCon
-;; type-args:         Type -> TVar*
-;;
-;; boolean:           TVar
-;; character:         TVar
-;; null:              TVar
-;; pair:              TVar x TVar -> TVar
-;; procedure:         TVar x TVar* -> TVar
-;; charseq:           TVar
-;; symbol:            TVar
-;; array:             TVar -> TVar
-
-
-; Needed packages: union/find
-
-;(load "union-fi.so")
-
-; TVar
-
-(define counter 0)
-; counter for generating tvar id's
-
-(define (gen-id)
-  ; generates a new id (for printing purposes)
-  (set! counter (+ counter 1))
-  counter)
-
-(define (gen-tvar)
-  ; generates a new type variable from a new symbol
-  ; uses union/find elements with two info fields
-  ; a type variable has exactly four fields:
-  ; car:     TVar (the parent field; initially null)
-  ; cadr:    Number (the rank field; is always nonnegative)
-  ; caddr:   Symbol (the type variable identifier; used only for printing)
-  ; cdddr:   Type (the leq field; initially null)
-  (gen-element (cons (gen-id) '())))
-
-(define (gen-type tcon targs)
-  ; generates a new type variable with an associated type definition
-  (gen-element (cons (gen-id) (cons tcon targs))))
-
-(define dynamic (gen-element (cons 0 '())))
-; the special type variable dynamic
-; Generic operations
-
-(define (tvar-id tvar)
-  ; returns the (printable) symbol representing the type variable
-  (car (info tvar)))
-
-(define (tvar-def tvar)
-  ; returns the type definition (if any) of the type variable
-  (cdr (info tvar)))
-
-(define (set-def! tvar tcon targs)
-  ; sets the type definition part of tvar to type
-  (set-cdr! (info tvar) (cons tcon targs))
-  '())
-
-(define (reset-def! tvar)
-  ; resets the type definition part of tvar to nil
-  (set-cdr! (info tvar) '()))
-
-(define type-con (lambda (l) (car l)))
-; returns the type constructor of a type definition
-
-(define type-args (lambda (l) (cdr l)))
-; returns the type variables of a type definition
-
-(define (tvar->string tvar)
-  ; converts a tvar's id to a string
-  (if (eqv? (tvar-id tvar) 0)
-      "Dynamic"
-      (string-append "t#" (number->string (tvar-id tvar) 10))))
-
-(define (tvar-show tv)
-  ; returns a printable list representation of type variable tv
-  (let* ((tv-rep (find! tv))
-         (tv-def (tvar-def tv-rep)))
-    (cons (tvar->string tv-rep)
-          (if (null? tv-def)
-              '()
-              (cons 'is (type-show tv-def))))))
-
-(define (type-show type)
-  ; returns a printable list representation of type definition type
-  (cond
-   ((eqv? (type-con type) ptype-con)
-    (let ((new-tvar (gen-tvar)))
-      (cons ptype-con
-            (cons (tvar-show new-tvar)
-                  (tvar-show ((type-args type) new-tvar))))))
-   (else
-    (cons (type-con type)
-          (map (lambda (tv)
-                 (tvar->string (find! tv)))
-               (type-args type))))))
-
-
-
-; Special type operations
-
-; type constructor literals
-
-(define boolean-con 'boolean)
-(define char-con 'char)
-(define null-con 'null)
-(define number-con 'number)
-(define pair-con 'pair)
-(define procedure-con 'procedure)
-(define string-con 'string)
-(define symbol-con 'symbol)
-(define vector-con 'vector)
-
-; type constants and type constructors
-
-(define (null2)
-  ; ***Note***: Temporarily changed to be a pair!
-  ; (gen-type null-con '())
-  (pair (gen-tvar) (gen-tvar)))
-(define (boolean)
-  (gen-type boolean-con '()))
-(define (character)
-  (gen-type char-con '()))
-(define (number)
-  (gen-type number-con '()))
-(define (charseq)
-  (gen-type string-con '()))
-(define (symbol)
-  (gen-type symbol-con '()))
-(define (pair tvar-1 tvar-2)
-  (gen-type pair-con (list tvar-1 tvar-2)))
-(define (array tvar)
-  (gen-type vector-con (list tvar)))
-(define (procedure arg-tvar res-tvar)
-  (gen-type procedure-con (list arg-tvar res-tvar)))
-
-
-; equivalencing of type variables
-
-(define (equiv! tv1 tv2)
-  (let* ((tv1-rep (find! tv1))
-         (tv2-rep (find! tv2))
-         (tv1-def (tvar-def tv1-rep))
-         (tv2-def (tvar-def tv2-rep)))
-    (cond
-     ((eqv? tv1-rep tv2-rep)
-      '())
-     ((eqv? tv2-rep dynamic)
-      (equiv-with-dynamic! tv1-rep))
-     ((eqv? tv1-rep dynamic)
-      (equiv-with-dynamic! tv2-rep))
-     ((null? tv1-def)
-      (if (null? tv2-def)
-          ; both tv1 and tv2 are distinct type variables
-          (link! tv1-rep tv2-rep)
-          ; tv1 is a type variable, tv2 is a (nondynamic) type
-          (asymm-link! tv1-rep tv2-rep)))
-     ((null? tv2-def)
-      ; tv1 is a (nondynamic) type, tv2 is a type variable
-      (asymm-link! tv2-rep tv1-rep))
-     ((eqv? (type-con tv1-def) (type-con tv2-def))
-      ; both tv1 and tv2 are (nondynamic) types with equal numbers of
-      ; arguments
-      (link! tv1-rep tv2-rep)
-      (map equiv! (type-args tv1-def) (type-args tv2-def)))
-     (else
-      ; tv1 and tv2 are types with distinct type constructors or different
-      ; numbers of arguments
-      (equiv-with-dynamic! tv1-rep)
-      (equiv-with-dynamic! tv2-rep))))
-  '())
-
-(define (equiv-with-dynamic! tv)
-  (let ((tv-rep (find! tv)))
-    (if (not (eqv? tv-rep dynamic))
-        (let ((tv-def (tvar-def tv-rep)))
-          (asymm-link! tv-rep dynamic)
-          (if (not (null? tv-def))
-              (map equiv-with-dynamic! (type-args tv-def))))))
-  '())
-;----------------------------------------------------------------------------
-; Polymorphic type management
-;----------------------------------------------------------------------------
-
-; introduces parametric polymorphic types
-
-
-;; forall: (Tvar -> Tvar) -> TVar
-;; fix: (Tvar -> Tvar) -> Tvar
-;;  
-;; instantiate-type: TVar -> TVar
-
-; type constructor literal for polymorphic types
-
-(define ptype-con 'forall)
-
-(define (forall tv-func)
-  (gen-type ptype-con tv-func))
-
-(define (forall2 tv-func2)
-  (forall (lambda (tv1)
-            (forall (lambda (tv2)
-                      (tv-func2 tv1 tv2))))))
-
-(define (forall3 tv-func3)
-  (forall (lambda (tv1)
-            (forall2 (lambda (tv2 tv3)
-                       (tv-func3 tv1 tv2 tv3))))))
-
-(define (forall4 tv-func4)
-  (forall (lambda (tv1)
-            (forall3 (lambda (tv2 tv3 tv4)
-                       (tv-func4 tv1 tv2 tv3 tv4))))))
-
-(define (forall5 tv-func5)
-  (forall (lambda (tv1)
-            (forall4 (lambda (tv2 tv3 tv4 tv5)
-                       (tv-func5 tv1 tv2 tv3 tv4 tv5))))))
-
-
-; (polymorphic) instantiation
-
-(define (instantiate-type tv)
-  ; instantiates type tv and returns a generic instance
-  (let* ((tv-rep (find! tv))
-         (tv-def (tvar-def tv-rep)))
-    (cond 
-     ((null? tv-def)
-      tv-rep)
-     ((eqv? (type-con tv-def) ptype-con)
-      (instantiate-type ((type-args tv-def) (gen-tvar))))
-     (else
-      tv-rep))))
-
-(define (fix tv-func)
-  ; forms a recursive type: the fixed point of type mapping tv-func
-  (let* ((new-tvar (gen-tvar))
-         (inst-tvar (tv-func new-tvar))
-         (inst-def (tvar-def inst-tvar)))
-    (if (null? inst-def)
-        (error 'fix "Illegal recursive type: ~s"
-               (list (tvar-show new-tvar) '= (tvar-show inst-tvar)))
-        (begin
-          (set-def! new-tvar 
-                    (type-con inst-def)
-                    (type-args inst-def))
-          new-tvar))))
-
-  
-;----------------------------------------------------------------------------
-;       Constraint management 
-;----------------------------------------------------------------------------
-
-
-; constraints
-
-(define gen-constr (lambda (a b) (cons a b)))
-; generates an equality between tvar1 and tvar2
-
-(define constr-lhs (lambda (c) (car c)))
-; returns the left-hand side of a constraint
-
-(define constr-rhs (lambda (c) (cdr c)))
-; returns the right-hand side of a constraint
-
-(define (constr-show c)
-  (cons (tvar-show (car c)) 
-        (cons '= 
-              (cons (tvar-show (cdr c)) '()))))
-
-
-; constraint set management
-
-(define global-constraints '())
-
-(define (init-global-constraints!)
-  (set! global-constraints '()))
-
-(define (add-constr! lhs rhs)
-  (set! global-constraints
-        (cons (gen-constr lhs rhs) global-constraints))
-  '())
-
-(define (glob-constr-show) 
-  ; returns printable version of global constraints
-  (map constr-show global-constraints))
-
-
-; constraint normalization
-
-; Needed packages: type management
-
-;(load "typ-mgmt.so")
-
-(define (normalize-global-constraints!) 
-  (normalize! global-constraints)
-  (init-global-constraints!))
-
-(define (normalize! constraints)
-  (map (lambda (c)
-         (equiv! (constr-lhs c) (constr-rhs c))) constraints))
-; ----------------------------------------------------------------------------
-; Abstract syntax definition and parse actions
-; ----------------------------------------------------------------------------
-
-; Needed packages: ast-gen.ss
-;(load "ast-gen.ss")
-
-;; Abstract syntax
-;;
-;; VarDef
-;;
-;; Identifier =         Symbol - SyntacticKeywords
-;; SyntacticKeywords =  { ... } (see Section 7.1, IEEE Scheme Standard)
-;;
-;; Datum
-;;
-;; null-const:          Null            -> Datum
-;; boolean-const:       Bool            -> Datum
-;; char-const:          Char            -> Datum
-;; number-const:        Number          -> Datum
-;; string-const:        String          -> Datum
-;; vector-const:        Datum*          -> Datum
-;; pair-const:          Datum x Datum   -> Datum
-;;
-;; Expr
-;;
-;; Datum <              Expr
-;;
-;; var-def:             Identifier              -> VarDef
-;; variable:            VarDef                  -> Expr
-;; identifier:          Identifier              -> Expr
-;; procedure-call:      Expr x Expr*            -> Expr
-;; lambda-expression:   Formals x Body          -> Expr
-;; conditional:         Expr x Expr x Expr      -> Expr
-;; assignment:          Variable x Expr         -> Expr
-;; cond-expression:     CondClause+             -> Expr
-;; case-expression:     Expr x CaseClause*      -> Expr
-;; and-expression:      Expr*                   -> Expr
-;; or-expression:       Expr*                   -> Expr
-;; let-expression:      (VarDef* x Expr*) x Body -> Expr
-;; named-let-expression: VarDef x (VarDef* x Expr*) x Body -> Expr
-;; let*-expression:     (VarDef* x Expr*) x Body -> Expr
-;; letrec-expression:   (VarDef* x Expr*) x Body -> Expr
-;; begin-expression:    Expr+                   -> Expr
-;; do-expression:       IterDef* x CondClause x Expr* -> Expr
-;; empty:                                       -> Expr
-;;
-;; VarDef* <            Formals
-;;
-;; simple-formal:       VarDef                  -> Formals
-;; dotted-formals:      VarDef* x VarDef        -> Formals
-;;
-;; Body =               Definition* x Expr+     (reversed)
-;; CondClause =         Expr x Expr+
-;; CaseClause =         Datum* x Expr+
-;; IterDef =            VarDef x Expr x Expr
-;;
-;; Definition
-;;
-;; definition:          Identifier x Expr       -> Definition
-;; function-definition: Identifier x Formals x Body -> Definition
-;; begin-command:       Definition*             -> Definition
-;;
-;; Expr <               Command
-;; Definition <         Command
-;;
-;; Program =            Command*
-
-
-;; Abstract syntax operators
-
-; Datum
-
-(define null-const 0)
-(define boolean-const 1)
-(define char-const 2)
-(define number-const 3)
-(define string-const 4)
-(define symbol-const 5)
-(define vector-const 6)
-(define pair-const 7)
-
-; Bindings
-
-(define var-def 8)
-(define null-def 29)
-(define pair-def 30)
-
-; Expr
-
-(define variable 9)
-(define identifier 10)
-(define procedure-call 11)
-(define lambda-expression 12)
-(define conditional 13)
-(define assignment 14)
-(define cond-expression 15)
-(define case-expression 16)
-(define and-expression 17)
-(define or-expression 18)
-(define let-expression 19)
-(define named-let-expression 20)
-(define let*-expression 21)
-(define letrec-expression 22)
-(define begin-expression 23)
-(define do-expression 24)
-(define empty 25)
-(define null-arg 31)
-(define pair-arg 32)
-
-; Command
-
-(define definition 26)
-(define function-definition 27)
-(define begin-command 28)
-
-
-;; Parse actions for abstract syntax construction
-
-(define (dynamic-parse-action-null-const)
-  ;; dynamic-parse-action for '()
-  (ast-gen null-const '()))
-
-(define (dynamic-parse-action-boolean-const e)
-  ;; dynamic-parse-action for #f and #t
-  (ast-gen boolean-const e))
-
-(define (dynamic-parse-action-char-const e)
-  ;; dynamic-parse-action for character constants
-  (ast-gen char-const e))
-
-(define (dynamic-parse-action-number-const e)
-  ;; dynamic-parse-action for number constants
-  (ast-gen number-const e))
-
-(define (dynamic-parse-action-string-const e)
-  ;; dynamic-parse-action for string literals
-  (ast-gen string-const e))
-
-(define (dynamic-parse-action-symbol-const e)
-  ;; dynamic-parse-action for symbol constants
-  (ast-gen symbol-const e))
-
-(define (dynamic-parse-action-vector-const e)
-  ;; dynamic-parse-action for vector literals
-  (ast-gen vector-const e))
-
-(define (dynamic-parse-action-pair-const e1 e2)
-  ;; dynamic-parse-action for pairs
-  (ast-gen pair-const (cons e1 e2)))
-
-(define (dynamic-parse-action-var-def e)
-  ;; dynamic-parse-action for defining occurrences of variables;
-  ;; e is a symbol
-  (ast-gen var-def e))
-
-(define (dynamic-parse-action-null-formal)
-  ;; dynamic-parse-action for null-list of formals
-  (ast-gen null-def '()))
-
-(define (dynamic-parse-action-pair-formal d1 d2)
-  ;; dynamic-parse-action for non-null list of formals;
-  ;; d1 is the result of parsing the first formal,
-  ;; d2 the result of parsing the remaining formals
-  (ast-gen pair-def (cons d1 d2)))
-
-(define (dynamic-parse-action-variable e)
-  ;; dynamic-parse-action for applied occurrences of variables
-  ;; ***Note***: e is the result of a dynamic-parse-action on the
-  ;; corresponding variable definition!
-  (ast-gen variable e))
-
-(define (dynamic-parse-action-identifier e)
-  ;; dynamic-parse-action for undeclared identifiers (free variable
-  ;; occurrences)
-  ;; ***Note***: e is a symbol (legal identifier)
-  (ast-gen identifier e))
- 
-(define (dynamic-parse-action-null-arg)
-  ;; dynamic-parse-action for a null list of arguments in a procedure call
-  (ast-gen null-arg '()))
-
-(define (dynamic-parse-action-pair-arg a1 a2)
-  ;; dynamic-parse-action for a non-null list of arguments in a procedure call
-  ;; a1 is the result of parsing the first argument, 
-  ;; a2 the result of parsing the remaining arguments
-  (ast-gen pair-arg (cons a1 a2)))
-
-(define (dynamic-parse-action-procedure-call op args)
-  ;; dynamic-parse-action for procedure calls: op function, args list of arguments
-  (ast-gen procedure-call (cons op args)))
-
-(define (dynamic-parse-action-lambda-expression formals body)
-  ;; dynamic-parse-action for lambda-abstractions
-  (ast-gen lambda-expression (cons formals body)))
-
-(define (dynamic-parse-action-conditional test then-branch else-branch)
-  ;; dynamic-parse-action for conditionals (if-then-else expressions)
-  (ast-gen conditional (cons test (cons then-branch else-branch))))
-
-(define (dynamic-parse-action-empty)
-  ;; dynamic-parse-action for missing or empty field
-  (ast-gen empty '()))
-
-(define (dynamic-parse-action-assignment lhs rhs)
-  ;; dynamic-parse-action for assignment
-  (ast-gen assignment (cons lhs rhs)))
-
-(define (dynamic-parse-action-begin-expression body)
-  ;; dynamic-parse-action for begin-expression
-  (ast-gen begin-expression body))
-
-(define (dynamic-parse-action-cond-expression clauses)
-  ;; dynamic-parse-action for cond-expressions
-  (ast-gen cond-expression clauses))
-
-(define (dynamic-parse-action-and-expression args)
-  ;; dynamic-parse-action for and-expressions
-  (ast-gen and-expression args))
-
-(define (dynamic-parse-action-or-expression args)
-  ;; dynamic-parse-action for or-expressions
-  (ast-gen or-expression args))
-
-(define (dynamic-parse-action-case-expression key clauses)
-  ;; dynamic-parse-action for case-expressions
-  (ast-gen case-expression (cons key clauses)))
-
-(define (dynamic-parse-action-let-expression bindings body)
-  ;; dynamic-parse-action for let-expressions
-  (ast-gen let-expression (cons bindings body)))
-
-(define (dynamic-parse-action-named-let-expression variable bindings body)
-  ;; dynamic-parse-action for named-let expressions
-  (ast-gen named-let-expression (cons variable (cons bindings body))))
-
-(define (dynamic-parse-action-let*-expression bindings body)
-  ;; dynamic-parse-action for let-expressions
-  (ast-gen let*-expression (cons bindings body)))
-
-(define (dynamic-parse-action-letrec-expression bindings body)
-  ;; dynamic-parse-action for let-expressions
-  (ast-gen letrec-expression (cons bindings body)))
-
-(define (dynamic-parse-action-definition variable expr)
-  ;; dynamic-parse-action for simple definitions
-  (ast-gen definition (cons variable expr)))
-
-(define (dynamic-parse-action-function-definition variable formals body)
-  ;; dynamic-parse-action for function definitions
-  (ast-gen function-definition (cons variable (cons formals body))))
-
-
-(define dynamic-parse-action-commands (lambda (a b) (cons a b)))
-;; dynamic-parse-action for processing a command result followed by a the
-;; result of processing the remaining commands
-
-
-;; Pretty-printing abstract syntax trees
-
-(define (ast-show ast)
-  ;; converts abstract syntax tree to list representation (Scheme program)
-  ;; ***Note***: check translation of constructors to numbers at the top of the file
-  (let ((syntax-op (ast-con ast))
-        (syntax-arg (ast-arg ast)))
-    (case syntax-op
-      ((0 1 2 3 4 8 10) syntax-arg)
-      ((29 31) '())
-      ((30 32) (cons (ast-show (car syntax-arg)) (ast-show (cdr syntax-arg))))
-      ((5) (list 'quote syntax-arg))
-      ((6) (list->vector (map ast-show syntax-arg)))
-      ((7) (list 'cons (ast-show (car syntax-arg)) (ast-show (cdr syntax-arg))))
-      ((9) (ast-arg syntax-arg))
-      ((11) (cons (ast-show (car syntax-arg)) (ast-show (cdr syntax-arg))))
-      ((12) (cons 'lambda (cons (ast-show (car syntax-arg)) 
-                                (map ast-show (cdr syntax-arg)))))
-      ((13) (cons 'if (cons (ast-show (car syntax-arg))
-                            (cons (ast-show (cadr syntax-arg))
-                                  (let ((alt (cddr syntax-arg)))
-                                    (if (eqv? (ast-con alt) empty)
-                                        '()
-                                        (list (ast-show alt))))))))
-      ((14) (list 'set! (ast-show (car syntax-arg)) (ast-show (cdr syntax-arg))))
-      ((15) (cons 'cond
-                  (map (lambda (cc)
-                         (let ((guard (car cc))
-                               (body (cdr cc)))
-                           (cons
-                            (if (eqv? (ast-con guard) empty)
-                                'else
-                                (ast-show guard))
-                            (map ast-show body))))
-                       syntax-arg)))
-      ((16) (cons 'case
-                  (cons (ast-show (car syntax-arg))
-                        (map (lambda (cc)
-                               (let ((data (car cc)))
-                                 (if (and (pair? data)
-                                          (eqv? (ast-con (car data)) empty))
-                                     (cons 'else
-                                           (map ast-show (cdr cc)))
-                                     (cons (map datum-show data)
-                                           (map ast-show (cdr cc))))))
-                             (cdr syntax-arg)))))
-      ((17) (cons 'and (map ast-show syntax-arg)))
-      ((18) (cons 'or (map ast-show syntax-arg)))
-      ((19) (cons 'let
-                  (cons (map
-                         (lambda (vd e)
-                           (list (ast-show vd) (ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map ast-show (cdr syntax-arg)))))
-      ((20) (cons 'let
-                  (cons (ast-show (car syntax-arg))
-                        (cons (map
-                               (lambda (vd e)
-                                 (list (ast-show vd) (ast-show e)))
-                               (caadr syntax-arg)
-                               (cdadr syntax-arg))
-                              (map ast-show (cddr syntax-arg))))))
-      ((21) (cons 'let*
-                  (cons (map
-                         (lambda (vd e)
-                           (list (ast-show vd) (ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map ast-show (cdr syntax-arg)))))
-      ((22) (cons 'letrec
-                  (cons (map
-                         (lambda (vd e)
-                           (list (ast-show vd) (ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map ast-show (cdr syntax-arg)))))
-      ((23) (cons 'begin
-                  (map ast-show syntax-arg)))
-      ((24) (error 'ast-show "Do expressions not handled! (~s)" syntax-arg))
-      ((25) (error 'ast-show "This can't happen: empty encountered!"))
-      ((26) (list 'define
-                  (ast-show (car syntax-arg))
-                  (ast-show (cdr syntax-arg))))
-      ((27) (cons 'define
-                  (cons
-                   (cons (ast-show (car syntax-arg))
-                         (ast-show (cadr syntax-arg)))
-                   (map ast-show (cddr syntax-arg)))))
-      ((28) (cons 'begin
-                  (map ast-show syntax-arg)))
-      (else (error 'ast-show "Unknown abstract syntax operator: ~s"
-                   syntax-op)))))
-
-
-;; ast*-show
-
-(define (ast*-show p)
-  ;; shows a list of abstract syntax trees
-  (map ast-show p))
-
-
-;; datum-show
-
-(define (datum-show ast)
-  ;; prints an abstract syntax tree as a datum
-  (case (ast-con ast)
-    ((0 1 2 3 4 5) (ast-arg ast))
-    ((6) (list->vector (map datum-show (ast-arg ast))))
-    ((7) (cons (datum-show (car (ast-arg ast))) (datum-show (cdr (ast-arg ast)))))
-    (else (error 'datum-show "This should not happen!"))))
-
-; write-to-port
-
-(define (write-to-port prog port)
-  ; writes a program to a port
-  (for-each
-   (lambda (command)
-     (pretty-print command port)
-     (newline port))
-   prog)
-  '())
-
-; write-file 
-
-(define (write-to-file prog filename)
-  ; write a program to a file
-  (let ((port (open-output-file filename)))
-    (write-to-port prog port)
-    (close-output-port port)
-    '()))
-
-; ----------------------------------------------------------------------------
-; Typed abstract syntax tree management: constraint generation, display, etc.
-; ----------------------------------------------------------------------------
-
-
-;; Abstract syntax operations, incl. constraint generation
-
-(define (ast-gen syntax-op arg)
-  ; generates all attributes and performs semantic side effects
-  (let ((ntvar
-         (case syntax-op
-           ((0 29 31) (null2))
-           ((1) (boolean))
-           ((2) (character))
-           ((3) (number))
-           ((4) (charseq))
-           ((5) (symbol))
-           ((6) (let ((aux-tvar (gen-tvar)))
-                  (for-each (lambda (t)
-                              (add-constr! t aux-tvar))
-                            (map ast-tvar arg))
-                  (array aux-tvar)))
-           ((7 30 32) (let ((t1 (ast-tvar (car arg)))
-                            (t2 (ast-tvar (cdr arg))))
-                        (pair t1 t2)))
-           ((8) (gen-tvar))
-           ((9) (ast-tvar arg))
-           ((10) (let ((in-env (dynamic-lookup arg dynamic-top-level-env)))
-                   (if in-env
-                       (instantiate-type (binding-value in-env))
-                       (let ((new-tvar (gen-tvar)))
-                         (set! dynamic-top-level-env (extend-env-with-binding
-                                              dynamic-top-level-env
-                                              (gen-binding arg new-tvar)))
-                         new-tvar))))
-           ((11) (let ((new-tvar (gen-tvar)))
-                   (add-constr! (procedure (ast-tvar (cdr arg)) new-tvar)
-                                (ast-tvar (car arg)))
-                   new-tvar))
-           ((12) (procedure (ast-tvar (car arg))
-                            (ast-tvar (tail (cdr arg)))))
-           ((13) (let ((t-test (ast-tvar (car arg)))
-                       (t-consequent (ast-tvar (cadr arg)))
-                       (t-alternate (ast-tvar (cddr arg))))
-                   (add-constr! (boolean) t-test)
-                   (add-constr! t-consequent t-alternate)
-                   t-consequent))
-           ((14) (let ((var-tvar (ast-tvar (car arg)))
-                       (exp-tvar (ast-tvar (cdr arg))))
-                   (add-constr! var-tvar exp-tvar)
-                   var-tvar))
-           ((15) (let ((new-tvar (gen-tvar)))
-                   (for-each (lambda (body)
-                               (add-constr! (ast-tvar (tail body)) new-tvar))
-                             (map cdr arg))
-                   (for-each (lambda (e)
-                               (add-constr! (boolean) (ast-tvar e)))
-                             (map car arg))
-                   new-tvar))
-           ((16) (let* ((new-tvar (gen-tvar))
-                        (t-key (ast-tvar (car arg)))
-                        (case-clauses (cdr arg)))
-                   (for-each (lambda (exprs)
-                               (for-each (lambda (e)
-                                           (add-constr! (ast-tvar e) t-key))
-                                         exprs))
-                             (map car case-clauses))
-                   (for-each (lambda (body)
-                               (add-constr! (ast-tvar (tail body)) new-tvar))
-                             (map cdr case-clauses))
-                   new-tvar))
-           ((17 18) (for-each (lambda (e)
-                                (add-constr! (boolean) (ast-tvar e)))
-                              arg)
-                    (boolean))
-           ((19 21 22) (let ((var-def-tvars (map ast-tvar (caar arg)))
-                             (def-expr-types (map ast-tvar (cdar arg)))
-                             (body-type (ast-tvar (tail (cdr arg)))))
-                         (for-each add-constr! var-def-tvars def-expr-types)
-                         body-type))
-           ((20) (let ((var-def-tvars (map ast-tvar (caadr arg)))
-                       (def-expr-types (map ast-tvar (cdadr arg)))
-                       (body-type (ast-tvar (tail (cddr arg))))
-                       (named-var-type (ast-tvar (car arg))))
-                   (for-each add-constr! var-def-tvars def-expr-types)
-                   (add-constr! (procedure (convert-tvars var-def-tvars) body-type)
-                                named-var-type)
-                   body-type))
-           ((23) (ast-tvar (tail arg)))
-           ((24) (error 'ast-gen
-                        "Do-expressions not handled! (Argument: ~s) arg"))
-           ((25) (gen-tvar))
-           ((26) (let ((t-var (ast-tvar (car arg)))
-                       (t-exp (ast-tvar (cdr arg))))
-                   (add-constr! t-var t-exp)
-                   t-var))
-           ((27) (let ((t-var (ast-tvar (car arg)))
-                       (t-formals (ast-tvar (cadr arg)))
-                       (t-body (ast-tvar (tail (cddr arg)))))
-                   (add-constr! (procedure t-formals t-body) t-var)
-                   t-var))
-           ((28) (gen-tvar))
-           (else (error 'ast-gen "Can't handle syntax operator: ~s" syntax-op)))))
-    (cons syntax-op (cons ntvar arg))))
-
-(define ast-con car)
-;; extracts the ast-constructor from an abstract syntax tree
-
-(define ast-arg cddr)
-;; extracts the ast-argument from an abstract syntax tree
-
-(define ast-tvar cadr)
-;; extracts the tvar from an abstract syntax tree
-
-
-;; tail
-
-(define (tail l)
-  ;; returns the tail of a nonempty list
-  (if (null? (cdr l))
-      (car l)
-      (tail (cdr l))))
-
-; convert-tvars
-
-(define (convert-tvars tvar-list)
-  ;; converts a list of tvars to a single tvar
-  (cond
-   ((null? tvar-list) (null2))
-   ((pair? tvar-list) (pair (car tvar-list)
-                            (convert-tvars (cdr tvar-list))))
-   (else (error 'convert-tvars "Not a list of tvars: ~s" tvar-list))))
-
-
-;; Pretty-printing abstract syntax trees
-
-(define (tast-show ast)
-  ;; converts abstract syntax tree to list representation (Scheme program)
-  (let ((syntax-op (ast-con ast))
-        (syntax-tvar (tvar-show (ast-tvar ast)))
-        (syntax-arg (ast-arg ast)))
-    (cons
-     (case syntax-op
-       ((0 1 2 3 4 8 10) syntax-arg)
-       ((29 31) '())
-       ((30 32) (cons (tast-show (car syntax-arg))
-                      (tast-show (cdr syntax-arg))))
-       ((5) (list 'quote syntax-arg))
-       ((6) (list->vector (map tast-show syntax-arg)))
-       ((7) (list 'cons (tast-show (car syntax-arg))
-                  (tast-show (cdr syntax-arg))))
-       ((9) (ast-arg syntax-arg))
-       ((11) (cons (tast-show (car syntax-arg)) (tast-show (cdr syntax-arg))))
-       ((12) (cons 'lambda (cons (tast-show (car syntax-arg))
-                                 (map tast-show (cdr syntax-arg)))))
-       ((13) (cons 'if (cons (tast-show (car syntax-arg))
-                             (cons (tast-show (cadr syntax-arg))
-                                   (let ((alt (cddr syntax-arg)))
-                                     (if (eqv? (ast-con alt) empty)
-                                         '()
-                                         (list (tast-show alt))))))))
-       ((14) (list 'set! (tast-show (car syntax-arg))
-                   (tast-show (cdr syntax-arg))))
-       ((15) (cons 'cond
-                   (map (lambda (cc)
-                          (let ((guard (car cc))
-                                (body (cdr cc)))
-                            (cons
-                             (if (eqv? (ast-con guard) empty)
-                                 'else
-                                 (tast-show guard))
-                             (map tast-show body))))
-                        syntax-arg)))
-       ((16) (cons 'case
-                   (cons (tast-show (car syntax-arg))
-                         (map (lambda (cc)
-                                (let ((data (car cc)))
-                                  (if (and (pair? data)
-                                           (eqv? (ast-con (car data)) empty))
-                                      (cons 'else
-                                            (map tast-show (cdr cc)))
-                                      (cons (map datum-show data)
-                                            (map tast-show (cdr cc))))))
-                              (cdr syntax-arg)))))
-       ((17) (cons 'and (map tast-show syntax-arg)))
-       ((18) (cons 'or (map tast-show syntax-arg)))
-       ((19) (cons 'let
-                   (cons (map
-                          (lambda (vd e)
-                            (list (tast-show vd) (tast-show e)))
-                          (caar syntax-arg)
-                          (cdar syntax-arg))
-                         (map tast-show (cdr syntax-arg)))))
-       ((20) (cons 'let
-                   (cons (tast-show (car syntax-arg))
-                         (cons (map
-                                (lambda (vd e)
-                                  (list (tast-show vd) (tast-show e)))
-                                (caadr syntax-arg)
-                                (cdadr syntax-arg))
-                               (map tast-show (cddr syntax-arg))))))
-       ((21) (cons 'let*
-                   (cons (map
-                          (lambda (vd e)
-                            (list (tast-show vd) (tast-show e)))
-                          (caar syntax-arg)
-                          (cdar syntax-arg))
-                         (map tast-show (cdr syntax-arg)))))
-       ((22) (cons 'letrec
-                   (cons (map
-                          (lambda (vd e)
-                            (list (tast-show vd) (tast-show e)))
-                          (caar syntax-arg)
-                          (cdar syntax-arg))
-                         (map tast-show (cdr syntax-arg)))))
-       ((23) (cons 'begin
-                   (map tast-show syntax-arg)))
-       ((24) (error 'tast-show "Do expressions not handled! (~s)" syntax-arg))
-       ((25) (error 'tast-show "This can't happen: empty encountered!"))
-       ((26) (list 'define
-                   (tast-show (car syntax-arg))
-                   (tast-show (cdr syntax-arg))))
-       ((27) (cons 'define
-                   (cons
-                    (cons (tast-show (car syntax-arg))
-                          (tast-show (cadr syntax-arg)))
-                    (map tast-show (cddr syntax-arg)))))
-       ((28) (cons 'begin
-                   (map tast-show syntax-arg)))
-       (else (error 'tast-show "Unknown abstract syntax operator: ~s"
-                    syntax-op)))
-     syntax-tvar)))
-
-;; tast*-show
-
-(define (tast*-show p)
-  ;; shows a list of abstract syntax trees
-  (map tast-show p))
-
-
-;; counters for tagging/untagging
-
-(define untag-counter 0)
-(define no-untag-counter 0)
-(define tag-counter 0)
-(define no-tag-counter 0)
-(define may-untag-counter 0)
-(define no-may-untag-counter 0)
-
-(define (reset-counters!)
-  (set! untag-counter 0)
-  (set! no-untag-counter 0)
-  (set! tag-counter 0)
-  (set! no-tag-counter 0)
-  (set! may-untag-counter 0)
-  (set! no-may-untag-counter 0))
-
-(define (counters-show)
-  (list
-   (cons tag-counter no-tag-counter)
-   (cons untag-counter no-untag-counter)
-   (cons may-untag-counter no-may-untag-counter)))  
-
-
-;; tag-show
-
-(define (tag-show tvar-rep prog)
-  ; display prog with tagging operation
-  (if (eqv? tvar-rep dynamic)
-      (begin
-        (set! tag-counter (+ tag-counter 1))
-        (list 'tag prog))
-      (begin
-        (set! no-tag-counter (+ no-tag-counter 1))
-        (list 'no-tag prog))))
-
-
-;; untag-show
-
-(define (untag-show tvar-rep prog)
-  ; display prog with untagging operation
-  (if (eqv? tvar-rep dynamic)
-      (begin
-        (set! untag-counter (+ untag-counter 1))
-        (list 'untag prog))
-      (begin
-        (set! no-untag-counter (+ no-untag-counter 1))
-        (list 'no-untag prog))))
-
-(define (may-untag-show tvar-rep prog)
-  ; display possible untagging in actual arguments
-  (if (eqv? tvar-rep dynamic)
-      (begin
-        (set! may-untag-counter (+ may-untag-counter 1))
-        (list 'may-untag prog))
-      (begin
-        (set! no-may-untag-counter (+ no-may-untag-counter 1))
-        (list 'no-may-untag prog))))
-
-
-;; tag-ast-show
-
-(define (tag-ast-show ast)
-  ;; converts typed and normalized abstract syntax tree to
-  ;; a Scheme program with explicit tagging and untagging operations
-  (let ((syntax-op (ast-con ast))
-        (syntax-tvar (find! (ast-tvar ast)))
-        (syntax-arg (ast-arg ast)))
-    (case syntax-op
-      ((0 1 2 3 4)
-       (tag-show syntax-tvar syntax-arg))
-      ((8 10) syntax-arg)
-      ((29 31) '())
-      ((30) (cons (tag-ast-show (car syntax-arg))
-                  (tag-ast-show (cdr syntax-arg))))
-      ((32) (cons (may-untag-show (find! (ast-tvar (car syntax-arg)))
-                              (tag-ast-show (car syntax-arg)))
-                  (tag-ast-show (cdr syntax-arg))))
-      ((5) (tag-show syntax-tvar (list 'quote syntax-arg)))
-      ((6) (tag-show syntax-tvar (list->vector (map tag-ast-show syntax-arg))))
-      ((7) (tag-show syntax-tvar (list 'cons (tag-ast-show (car syntax-arg))
-                                       (tag-ast-show (cdr syntax-arg)))))
-      ((9) (ast-arg syntax-arg))
-      ((11) (let ((proc-tvar (find! (ast-tvar (car syntax-arg)))))
-              (cons (untag-show proc-tvar 
-                                (tag-ast-show (car syntax-arg)))
-                    (tag-ast-show (cdr syntax-arg)))))
-      ((12) (tag-show syntax-tvar
-                      (cons 'lambda (cons (tag-ast-show (car syntax-arg))
-                                          (map tag-ast-show (cdr syntax-arg))))))
-      ((13) (let ((test-tvar (find! (ast-tvar (car syntax-arg)))))
-              (cons 'if (cons (untag-show test-tvar
-                                          (tag-ast-show (car syntax-arg)))
-                              (cons (tag-ast-show (cadr syntax-arg))
-                                    (let ((alt (cddr syntax-arg)))
-                                      (if (eqv? (ast-con alt) empty)
-                                          '()
-                                          (list (tag-ast-show alt)))))))))
-      ((14) (list 'set! (tag-ast-show (car syntax-arg))
-                  (tag-ast-show (cdr syntax-arg))))
-      ((15) (cons 'cond
-                  (map (lambda (cc)
-                         (let ((guard (car cc))
-                               (body (cdr cc)))
-                           (cons
-                            (if (eqv? (ast-con guard) empty)
-                                'else
-                                (untag-show (find! (ast-tvar guard))
-                                            (tag-ast-show guard)))
-                            (map tag-ast-show body))))
-                       syntax-arg)))
-      ((16) (cons 'case
-                  (cons (tag-ast-show (car syntax-arg))
-                        (map (lambda (cc)
-                               (let ((data (car cc)))
-                                 (if (and (pair? data)
-                                          (eqv? (ast-con (car data)) empty))
-                                     (cons 'else
-                                           (map tag-ast-show (cdr cc)))
-                                     (cons (map datum-show data)
-                                           (map tag-ast-show (cdr cc))))))
-                             (cdr syntax-arg)))))
-      ((17) (cons 'and (map
-                        (lambda (ast)
-                          (let ((bool-tvar (find! (ast-tvar ast))))
-                            (untag-show bool-tvar (tag-ast-show ast))))
-                        syntax-arg)))
-      ((18) (cons 'or (map
-                       (lambda (ast)
-                         (let ((bool-tvar (find! (ast-tvar ast))))
-                           (untag-show bool-tvar (tag-ast-show ast))))
-                       syntax-arg)))
-      ((19) (cons 'let
-                  (cons (map
-                         (lambda (vd e)
-                           (list (tag-ast-show vd) (tag-ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map tag-ast-show (cdr syntax-arg)))))
-      ((20) (cons 'let
-                  (cons (tag-ast-show (car syntax-arg))
-                        (cons (map
-                               (lambda (vd e)
-                                 (list (tag-ast-show vd) (tag-ast-show e)))
-                               (caadr syntax-arg)
-                               (cdadr syntax-arg))
-                              (map tag-ast-show (cddr syntax-arg))))))
-      ((21) (cons 'let*
-                  (cons (map
-                         (lambda (vd e)
-                           (list (tag-ast-show vd) (tag-ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map tag-ast-show (cdr syntax-arg)))))
-      ((22) (cons 'letrec
-                  (cons (map
-                         (lambda (vd e)
-                           (list (tag-ast-show vd) (tag-ast-show e)))
-                         (caar syntax-arg)
-                         (cdar syntax-arg))
-                        (map tag-ast-show (cdr syntax-arg)))))
-      ((23) (cons 'begin
-                  (map tag-ast-show syntax-arg)))
-      ((24) (error 'tag-ast-show "Do expressions not handled! (~s)" syntax-arg))
-      ((25) (error 'tag-ast-show "This can't happen: empty encountered!"))
-      ((26) (list 'define
-                  (tag-ast-show (car syntax-arg))
-                  (tag-ast-show (cdr syntax-arg))))
-      ((27) (let ((func-tvar (find! (ast-tvar (car syntax-arg)))))
-              (list 'define
-                    (tag-ast-show (car syntax-arg))
-                    (tag-show func-tvar
-                              (cons 'lambda
-                                    (cons (tag-ast-show (cadr syntax-arg))
-                                          (map tag-ast-show (cddr syntax-arg))))))))
-      ((28) (cons 'begin
-                  (map tag-ast-show syntax-arg)))
-      (else (error 'tag-ast-show "Unknown abstract syntax operator: ~s"
-                   syntax-op)))))
-
-
-; tag-ast*-show
-
-(define (tag-ast*-show p)
-  ; display list of commands/expressions with tagging/untagging
-  ; operations
-  (map tag-ast-show p))
-; ----------------------------------------------------------------------------
-; Top level type environment
-; ----------------------------------------------------------------------------
-
-
-; Needed packages: type management (monomorphic and polymorphic)
-
-;(load "typ-mgmt.ss")
-;(load "ptyp-mgm.ss")
-
-
-; type environment for miscellaneous
-
-(define misc-env
-  (list
-   (cons 'quote (forall (lambda (tv) tv)))
-   (cons 'eqv? (forall (lambda (tv) (procedure (convert-tvars (list tv tv))
-                                               (boolean)))))
-   (cons 'eq? (forall (lambda (tv) (procedure (convert-tvars (list tv tv))
-                                              (boolean)))))
-   (cons 'equal? (forall (lambda (tv) (procedure (convert-tvars (list tv tv))
-                                                 (boolean)))))
-   ))
-
-; type environment for input/output
-
-(define io-env
-  (list
-   (cons 'open-input-file (procedure (convert-tvars (list (charseq))) dynamic))
-   (cons 'eof-object? (procedure (convert-tvars (list dynamic)) (boolean)))
-   (cons 'read (forall (lambda (tv)
-                         (procedure (convert-tvars (list tv)) dynamic))))
-   (cons 'write (forall (lambda (tv)
-                          (procedure (convert-tvars (list tv)) dynamic))))
-   (cons 'display (forall (lambda (tv)
-                            (procedure (convert-tvars (list tv)) dynamic))))
-   (cons 'newline (procedure (null2) dynamic))
-   (cons 'pretty-print (forall (lambda (tv)
-                                 (procedure (convert-tvars (list tv)) dynamic))))))
-
-
-; type environment for Booleans
-
-(define boolean-env
-  (list
-   (cons 'boolean? (forall (lambda (tv)
-                             (procedure (convert-tvars (list tv)) (boolean)))))
-   ;(cons #f (boolean))
-   ; #f doesn't exist in Chez Scheme, but gets mapped to null!
-   (cons #t (boolean))
-   (cons 'not (procedure (convert-tvars (list (boolean))) (boolean)))
-   ))
-
-
-; type environment for pairs and lists
-
-(define (list-type tv)
-  (fix (lambda (tv2) (pair tv tv2))))
-
-(define list-env
-  (list
-   (cons 'pair? (forall2 (lambda (tv1 tv2)
-                           (procedure (convert-tvars (list (pair tv1 tv2)))
-                                      (boolean)))))
-   (cons 'null? (forall2 (lambda (tv1 tv2)
-                           (procedure (convert-tvars (list (pair tv1 tv2)))
-                                      (boolean)))))
-   (cons 'list? (forall2 (lambda (tv1 tv2)
-                           (procedure (convert-tvars (list (pair tv1 tv2)))
-                                      (boolean)))))
-   (cons 'cons (forall2 (lambda (tv1 tv2)
-                          (procedure (convert-tvars (list tv1 tv2))
-                                     (pair tv1 tv2)))))
-   (cons 'car (forall2 (lambda (tv1 tv2)
-                         (procedure (convert-tvars (list (pair tv1 tv2)))
-                                    tv1))))
-   (cons 'cdr (forall2 (lambda (tv1 tv2)
-                         (procedure (convert-tvars (list (pair tv1 tv2)))
-                                    tv2))))
-   (cons 'set-car! (forall2 (lambda (tv1 tv2)
-                              (procedure (convert-tvars (list (pair tv1 tv2)
-                                                              tv1))
-                                         dynamic))))
-   (cons 'set-cdr! (forall2 (lambda (tv1 tv2)
-                              (procedure (convert-tvars (list (pair tv1 tv2)
-                                                              tv2))
-                                         dynamic))))
-   (cons 'caar (forall3 (lambda (tv1 tv2 tv3)
-                          (procedure (convert-tvars
-                                      (list (pair (pair tv1 tv2) tv3)))
-                                     tv1))))
-   (cons 'cdar (forall3 (lambda (tv1 tv2 tv3)
-                          (procedure (convert-tvars
-                                      (list (pair (pair tv1 tv2) tv3)))
-                                     tv2))))
-
-   (cons 'cadr (forall3 (lambda (tv1 tv2 tv3)
-                          (procedure (convert-tvars
-                                      (list (pair tv1 (pair tv2 tv3))))
-                                     tv2))))
-   (cons 'cddr (forall3 (lambda (tv1 tv2 tv3)
-                          (procedure (convert-tvars
-                                      (list (pair tv1 (pair tv2 tv3))))
-                                     tv3))))
-   (cons 'caaar (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair (pair (pair tv1 tv2) tv3) tv4)))
-                              tv1))))
-   (cons 'cdaar (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair (pair (pair tv1 tv2) tv3) tv4)))
-                              tv2))))
-   (cons 'cadar (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair (pair tv1 (pair tv2 tv3)) tv4)))
-                              tv2))))
-   (cons 'cddar (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair (pair tv1 (pair tv2 tv3)) tv4)))
-                              tv3))))
-   (cons 'caadr (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair tv1 (pair (pair tv2 tv3) tv4))))
-                              tv2))))
-   (cons 'cdadr (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair tv1 (pair (pair tv2 tv3) tv4))))
-                              tv3))))
-   (cons 'caddr (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair tv1 (pair tv2 (pair tv3 tv4)))))
-                              tv3))))
-   (cons 'cdddr (forall4
-                 (lambda (tv1 tv2 tv3 tv4)
-                   (procedure (convert-tvars
-                               (list (pair tv1 (pair tv2 (pair tv3 tv4)))))
-                              tv4))))
-   (cons 'cadddr
-         (forall5 (lambda (tv1 tv2 tv3 tv4 tv5)
-                    (procedure (convert-tvars
-                                (list (pair tv1
-                                            (pair tv2
-                                                  (pair tv3
-                                                        (pair tv4 tv5))))))
-                               tv4))))
-   (cons 'cddddr
-         (forall5 (lambda (tv1 tv2 tv3 tv4 tv5)
-                    (procedure (convert-tvars
-                                (list (pair tv1
-                                            (pair tv2
-                                                  (pair tv3
-                                                        (pair tv4 tv5))))))
-                               tv5))))
-   (cons 'list (forall (lambda (tv)
-                         (procedure tv tv))))
-   (cons 'length (forall (lambda (tv)
-                           (procedure (convert-tvars (list (list-type tv)))
-                                      (number)))))
-   (cons 'append (forall (lambda (tv)
-                           (procedure (convert-tvars (list (list-type tv)
-                                                           (list-type tv)))
-                                      (list-type tv)))))
-   (cons 'reverse (forall (lambda (tv)
-                            (procedure (convert-tvars (list (list-type tv)))
-                                       (list-type tv)))))
-   (cons 'list-ref (forall (lambda (tv)
-                             (procedure (convert-tvars (list (list-type tv)
-                                                             (number)))
-                                        tv))))
-   (cons 'memq (forall (lambda (tv)
-                         (procedure (convert-tvars (list tv
-                                                         (list-type tv)))
-                                    (boolean)))))
-   (cons 'memv (forall (lambda (tv)
-                         (procedure (convert-tvars (list tv
-                                                         (list-type tv)))
-                                    (boolean)))))
-   (cons 'member (forall (lambda (tv)
-                           (procedure (convert-tvars (list tv
-                                                           (list-type tv)))
-                                      (boolean)))))
-   (cons 'assq (forall2 (lambda (tv1 tv2)
-                          (procedure (convert-tvars
-                                      (list tv1
-                                            (list-type (pair tv1 tv2))))
-                                     (pair tv1 tv2)))))
-   (cons 'assv (forall2 (lambda (tv1 tv2)
-                          (procedure (convert-tvars
-                                      (list tv1
-                                            (list-type (pair tv1 tv2))))
-                                     (pair tv1 tv2)))))
-   (cons 'assoc (forall2 (lambda (tv1 tv2)
-                           (procedure (convert-tvars
-                                       (list tv1
-                                             (list-type (pair tv1 tv2))))
-                                      (pair tv1 tv2)))))
-   ))
-
-
-(define symbol-env
-  (list
-   (cons 'symbol? (forall (lambda (tv)
-                            (procedure (convert-tvars (list tv)) (boolean)))))
-   (cons 'symbol->string (procedure (convert-tvars (list (symbol))) (charseq)))
-   (cons 'string->symbol (procedure (convert-tvars (list (charseq))) (symbol)))
-   ))
-
-(define number-env
-  (list
-   (cons 'number? (forall (lambda (tv)
-                            (procedure (convert-tvars (list tv)) (boolean)))))
-   (cons '+ (procedure (convert-tvars (list (number) (number))) (number)))
-   (cons '- (procedure (convert-tvars (list (number) (number))) (number)))
-   (cons '* (procedure (convert-tvars (list (number) (number))) (number)))
-   (cons '/ (procedure (convert-tvars (list (number) (number))) (number)))
-   (cons 'number->string (procedure (convert-tvars (list (number))) (charseq)))
-   (cons 'string->number (procedure (convert-tvars (list (charseq))) (number)))
-   ))
-
-(define char-env
-  (list
-   (cons 'char? (forall (lambda (tv)
-                          (procedure (convert-tvars (list tv)) (boolean)))))
-   (cons 'char->integer (procedure (convert-tvars (list (character)))
-                                   (number)))
-   (cons 'integer->char (procedure (convert-tvars (list (number)))
-                                   (character)))
-   ))
-
-(define string-env
-  (list
-   (cons 'string? (forall (lambda (tv)
-                            (procedure (convert-tvars (list tv)) (boolean)))))
-   ))
-
-(define vector-env
-  (list
-   (cons 'vector? (forall (lambda (tv)
-                            (procedure (convert-tvars (list tv)) (boolean)))))
-   (cons 'make-vector (forall (lambda (tv)
-                                (procedure (convert-tvars (list (number)))
-                                           (array tv)))))
-   (cons 'vector-length (forall (lambda (tv)
-                                  (procedure (convert-tvars (list (array tv)))
-                                             (number)))))
-   (cons 'vector-ref (forall (lambda (tv)
-                               (procedure (convert-tvars (list (array tv)
-                                                               (number)))
-                                          tv))))
-   (cons 'vector-set! (forall (lambda (tv)
-                                (procedure (convert-tvars (list (array tv)
-                                                                (number)
-                                                                tv))
-                                           dynamic))))
-   ))
-
-(define procedure-env
-  (list
-   (cons 'procedure? (forall (lambda (tv)
-                               (procedure (convert-tvars (list tv)) (boolean)))))
-   (cons 'map (forall2 (lambda (tv1 tv2)
-                         (procedure (convert-tvars
-                                     (list (procedure (convert-tvars
-                                                       (list tv1)) tv2)
-                                           (list-type tv1)))
-                                    (list-type tv2)))))
-   (cons 'foreach (forall2 (lambda (tv1 tv2)
-                             (procedure (convert-tvars
-                                         (list (procedure (convert-tvars
-                                                           (list tv1)) tv2)
-                                               (list-type tv1)))
-                                        (list-type tv2)))))
-   (cons 'call-with-current-continuation
-         (forall2 (lambda (tv1 tv2) 
-                   (procedure (convert-tvars
-                               (list (procedure
-                                      (convert-tvars
-                                       (list (procedure (convert-tvars
-                                                         (list tv1)) tv2)))
-                                      tv2)))
-                              tv2))))
-   ))
-
-
-; global top level environment
-
-(define (global-env)
-  (append misc-env
-          io-env
-          boolean-env
-          symbol-env
-          number-env
-          char-env
-          string-env
-          vector-env
-          procedure-env
-          list-env))
-
-(define dynamic-top-level-env (global-env))
-
-(define (init-dynamic-top-level-env!)
-  (set! dynamic-top-level-env (global-env))
-  '())
-
-(define (dynamic-top-level-env-show)
-  ; displays the top level environment
-  (map (lambda (binding)
-         (cons (key-show (binding-key binding))
-               (cons ': (tvar-show (binding-value binding)))))
-       (env->list dynamic-top-level-env)))
-; ----------------------------------------------------------------------------
-; Dynamic type inference for Scheme
-; ----------------------------------------------------------------------------
-
-; Needed packages:
-
-(define (ic!) (init-global-constraints!))
-(define (pc) (glob-constr-show))
-(define (lc) (length global-constraints))
-(define (n!) (normalize-global-constraints!))
-(define (pt) (dynamic-top-level-env-show))
-(define (it!) (init-dynamic-top-level-env!))
-(define (io!) (set! tag-ops 0) (set! no-ops 0))
-(define (i!) (ic!) (it!) (io!) '())
-
-(define tag-ops 0)
-(define no-ops 0)
-
-
-(define doit 
-  (lambda ()
-    (i!)
-    (let ((foo (dynamic-parse-file "dynamic.scm")))
-      (normalize-global-constraints!)
-      (reset-counters!)
-      (tag-ast*-show foo)
-      (counters-show))))
-
-(let ((result (time (doit))))
-  (if (not (equal? result '((330 . 339) (6 . 1895) (2306 . 344))))
-      (error "wrong result" result) ) )
diff --git a/benchmarks/earley.scm b/benchmarks/earley.scm
deleted file mode 100644
index 163e57c5..00000000
--- a/benchmarks/earley.scm
+++ /dev/null
@@ -1,646 +0,0 @@
-;;; EARLEY -- Earley's parser, written by Marc Feeley.
-
-; (make-parser grammar lexer) is used to create a parser from the grammar
-; description `grammar' and the lexer function `lexer'.
-;
-; A grammar is a list of definitions.  Each definition defines a non-terminal
-; by a set of rules.  Thus a definition has the form: (nt rule1 rule2...).
-; A given non-terminal can only be defined once.  The first non-terminal
-; defined is the grammar's goal.  Each rule is a possibly empty list of
-; non-terminals.  Thus a rule has the form: (nt1 nt2...).  A non-terminal
-; can be any scheme value.  Note that all grammar symbols are treated as
-; non-terminals.  This is fine though because the lexer will be outputing
-; non-terminals.
-;
-; The lexer defines what a token is and the mapping between tokens and
-; the grammar's non-terminals.  It is a function of one argument, the input,
-; that returns the list of tokens corresponding to the input.  Each token is
-; represented by a list.  The first element is some `user-defined' information
-; associated with the token and the rest represents the token's class(es) (as a
-; list of non-terminals that this token corresponds to).
-;
-; The result of `make-parser' is a function that parses the single input it
-; is given into the grammar's goal.  The result is a `parse' which can be
-; manipulated with the procedures: `parse->parsed?', `parse->trees'
-; and `parse->nb-trees' (see below).
-;
-; Let's assume that we want a parser for the grammar
-;
-;  S -> x = E
-;  E -> E + E | V
-;  V -> V y |
-;
-; and that the input to the parser is a string of characters.  Also, assume we
-; would like to map the characters `x', `y', `+' and `=' into the corresponding
-; non-terminals in the grammar.  Such a parser could be created with
-;
-; (make-parser
-;   '(
-;      (s (x = e))
-;      (e (e + e) (v))
-;      (v (v y) ())
-;    )
-;   (lambda (str)
-;     (map (lambda (char)
-;            (list char ; user-info = the character itself
-;                  (case char
-;                    ((#\x) 'x)
-;                    ((#\y) 'y)
-;                    ((#\+) '+)
-;                    ((#\=) '=)
-;                    (else (fatal-error "lexer error")))))
-;          (string->list str)))
-; )
-;
-; An alternative definition (that does not check for lexical errors) is
-;
-; (make-parser
-;   '(
-;      (s (#\x #\= e))
-;      (e (e #\+ e) (v))
-;      (v (v #\y) ())
-;    )
-;   (lambda (str) (map (lambda (char) (list char char)) (string->list str)))
-; )
-;
-; To help with the rest of the discussion, here are a few definitions:
-;
-; An input pointer (for an input of `n' tokens) is a value between 0 and `n'.
-; It indicates a point between two input tokens (0 = beginning, `n' = end).
-; For example, if `n' = 4, there are 5 input pointers:
-;
-;   input                   token1     token2     token3     token4
-;   input pointers       0          1          2          3          4
-;
-; A configuration indicates the extent to which a given rule is parsed (this
-; is the common `dot notation').  For simplicity, a configuration is
-; represented as an integer, with successive configurations in the same
-; rule associated with successive integers.  It is assumed that the grammar
-; has been extended with rules to aid scanning.  These rules are of the
-; form `nt ->', and there is one such rule for every non-terminal.  Note
-; that these rules are special because they only apply when the corresponding
-; non-terminal is returned by the lexer.
-;
-; A configuration set is a configuration grouped with the set of input pointers
-; representing where the head non-terminal of the configuration was predicted.
-;
-; Here are the rules and configurations for the grammar given above:
-;
-;  S -> .         \
-;       0          |
-;  x -> .          |
-;       1          |
-;  = -> .          |
-;       2          |
-;  E -> .          |
-;       3           > special rules (for scanning)
-;  + -> .          |
-;       4          |
-;  V -> .          |
-;       5          |
-;  y -> .          |
-;       6         /
-;  S -> .  x  .  =  .  E  .
-;       7     8     9     10
-;  E -> .  E  .  +  .  E  .
-;       11    12    13    14
-;  E -> .  V  .
-;       15    16
-;  V -> .  V  .  y  .
-;       17    18    19
-;  V -> .
-;       20
-;
-; Starters of the non-terminal `nt' are configurations that are leftmost
-; in a non-special rule for `nt'.  Enders of the non-terminal `nt' are
-; configurations that are rightmost in any rule for `nt'.  Predictors of the
-; non-terminal `nt' are configurations that are directly to the left of `nt'
-; in any rule.
-;
-; For the grammar given above,
-;
-;   Starters of V   = (17 20)
-;   Enders of V     = (5 19 20)
-;   Predictors of V = (15 17)
-
-(define (make-parser grammar lexer)
-
-  (define (non-terminals grammar) ; return vector of non-terminals in grammar
-
-    (define (add-nt nt nts)
-      (if (member nt nts) nts (cons nt nts))) ; use equal? for equality tests
-
-    (let def-loop ((defs grammar) (nts '()))
-      (if (pair? defs)
-        (let* ((def (car defs))
-               (head (car def)))
-          (let rule-loop ((rules (cdr def))
-                          (nts (add-nt head nts)))
-            (if (pair? rules)
-              (let ((rule (car rules)))
-                (let loop ((l rule) (nts nts))
-                  (if (pair? l)
-                    (let ((nt (car l)))
-                      (loop (cdr l) (add-nt nt nts)))
-                    (rule-loop (cdr rules) nts))))
-              (def-loop (cdr defs) nts))))
-        (list->vector (reverse nts))))) ; goal non-terminal must be at index 0
-
-  (define (ind nt nts) ; return index of non-terminal `nt' in `nts'
-    (let loop ((i (- (vector-length nts) 1)))
-      (if (>= i 0)
-        (if (equal? (vector-ref nts i) nt) i (loop (- i 1)))
-        #f)))
-
-  (define (nb-configurations grammar) ; return nb of configurations in grammar
-    (let def-loop ((defs grammar) (nb-confs 0))
-      (if (pair? defs)
-        (let ((def (car defs)))
-          (let rule-loop ((rules (cdr def)) (nb-confs nb-confs))
-            (if (pair? rules)
-              (let ((rule (car rules)))
-                (let loop ((l rule) (nb-confs nb-confs))
-                  (if (pair? l)
-                    (loop (cdr l) (+ nb-confs 1))
-                    (rule-loop (cdr rules) (+ nb-confs 1)))))
-              (def-loop (cdr defs) nb-confs))))
-      nb-confs)))
-
-; First, associate a numeric identifier to every non-terminal in the
-; grammar (with the goal non-terminal associated with 0).
-;
-; So, for the grammar given above we get:
-;
-; s -> 0   x -> 1   = -> 4   e ->3    + -> 4   v -> 5   y -> 6
-
-  (let* ((nts (non-terminals grammar))          ; id map = list of non-terms
-         (nb-nts (vector-length nts))           ; the number of non-terms
-         (nb-confs (+ (nb-configurations grammar) nb-nts)) ; the nb of confs
-         (starters (make-vector nb-nts '()))    ; starters for every non-term
-         (enders (make-vector nb-nts '()))      ; enders for every non-term
-         (predictors (make-vector nb-nts '()))  ; predictors for every non-term
-         (steps (make-vector nb-confs #f))      ; what to do in a given conf
-         (names (make-vector nb-confs #f)))     ; name of rules
-
-    (define (setup-tables grammar nts starters enders predictors steps names)
-
-      (define (add-conf conf nt nts class)
-        (let ((i (ind nt nts)))
-          (vector-set! class i (cons conf (vector-ref class i)))))
-
-      (let ((nb-nts (vector-length nts)))
-
-        (let nt-loop ((i (- nb-nts 1)))
-          (if (>= i 0)
-            (begin
-              (vector-set! steps i (- i nb-nts))
-              (vector-set! names i (list (vector-ref nts i) 0))
-              (vector-set! enders i (list i))
-              (nt-loop (- i 1)))))
-
-        (let def-loop ((defs grammar) (conf (vector-length nts)))
-          (if (pair? defs)
-            (let* ((def (car defs))
-                   (head (car def)))
-              (let rule-loop ((rules (cdr def)) (conf conf) (rule-num 1))
-                (if (pair? rules)
-                  (let ((rule (car rules)))
-                    (vector-set! names conf (list head rule-num))
-                    (add-conf conf head nts starters)
-                    (let loop ((l rule) (conf conf))
-                      (if (pair? l)
-                        (let ((nt (car l)))
-                          (vector-set! steps conf (ind nt nts))
-                          (add-conf conf nt nts predictors)
-                          (loop (cdr l) (+ conf 1)))
-                        (begin
-                          (vector-set! steps conf (- (ind head nts) nb-nts))
-                          (add-conf conf head nts enders)
-                          (rule-loop (cdr rules) (+ conf 1) (+ rule-num 1))))))
-                  (def-loop (cdr defs) conf))))))))
-
-; Now, for each non-terminal, compute the starters, enders and predictors and
-; the names and steps tables.
-
-    (setup-tables grammar nts starters enders predictors steps names)
-
-; Build the parser description
-
-    (let ((parser-descr (vector lexer
-                                nts
-                                starters
-                                enders
-                                predictors
-                                steps
-                                names)))
-      (lambda (input)
-
-        (define (ind nt nts) ; return index of non-terminal `nt' in `nts'
-          (let loop ((i (- (vector-length nts) 1)))
-            (if (>= i 0)
-              (if (equal? (vector-ref nts i) nt) i (loop (- i 1)))
-              #f)))
-
-        (define (comp-tok tok nts) ; transform token to parsing format
-          (let loop ((l1 (cdr tok)) (l2 '()))
-            (if (pair? l1)
-              (let ((i (ind (car l1) nts)))
-                (if i
-                  (loop (cdr l1) (cons i l2))
-                  (loop (cdr l1) l2)))
-              (cons (car tok) (reverse l2)))))
-
-        (define (input->tokens input lexer nts)
-          (list->vector (map (lambda (tok) (comp-tok tok nts)) (lexer input))))
-
-        (define (make-states nb-toks nb-confs)
-          (let ((states (make-vector (+ nb-toks 1) #f)))
-            (let loop ((i nb-toks))
-              (if (>= i 0)
-                (let ((v (make-vector (+ nb-confs 1) #f)))
-                  (vector-set! v 0 -1)
-                  (vector-set! states i v)
-                  (loop (- i 1)))
-                states))))
-
-        (define (conf-set-get state conf)
-          (vector-ref state (+ conf 1)))
-
-        (define (conf-set-get* state state-num conf)
-          (let ((conf-set (conf-set-get state conf)))
-            (if conf-set
-              conf-set
-              (let ((conf-set (make-vector (+ state-num 6) #f)))
-                (vector-set! conf-set 1 -3) ; old elems tail (points to head)
-                (vector-set! conf-set 2 -1) ; old elems head
-                (vector-set! conf-set 3 -1) ; new elems tail (points to head)
-                (vector-set! conf-set 4 -1) ; new elems head
-                (vector-set! state (+ conf 1) conf-set)
-                conf-set))))
-
-        (define (conf-set-merge-new! conf-set)
-          (vector-set! conf-set
-            (+ (vector-ref conf-set 1) 5)
-            (vector-ref conf-set 4))
-          (vector-set! conf-set 1 (vector-ref conf-set 3))
-          (vector-set! conf-set 3 -1)
-          (vector-set! conf-set 4 -1))
-
-        (define (conf-set-head conf-set)
-          (vector-ref conf-set 2))
-
-        (define (conf-set-next conf-set i)
-          (vector-ref conf-set (+ i 5)))
-
-        (define (conf-set-member? state conf i)
-          (let ((conf-set (vector-ref state (+ conf 1))))
-            (if conf-set
-              (conf-set-next conf-set i)
-              #f)))
-
-        (define (conf-set-adjoin state conf-set conf i)
-          (let ((tail (vector-ref conf-set 3))) ; put new element at tail
-            (vector-set! conf-set (+ i 5) -1)
-            (vector-set! conf-set (+ tail 5) i)
-            (vector-set! conf-set 3 i)
-            (if (< tail 0)
-              (begin
-                (vector-set! conf-set 0 (vector-ref state 0))
-                (vector-set! state 0 conf)))))
-
-        (define (conf-set-adjoin* states state-num l i)
-          (let ((state (vector-ref states state-num)))
-            (let loop ((l1 l))
-              (if (pair? l1)
-                (let* ((conf (car l1))
-                       (conf-set (conf-set-get* state state-num conf)))
-                  (if (not (conf-set-next conf-set i))
-                    (begin
-                      (conf-set-adjoin state conf-set conf i)
-                      (loop (cdr l1)))
-                    (loop (cdr l1))))))))
-
-        (define (conf-set-adjoin** states states* state-num conf i)
-          (let ((state (vector-ref states state-num)))
-            (if (conf-set-member? state conf i)
-              (let* ((state* (vector-ref states* state-num))
-                     (conf-set* (conf-set-get* state* state-num conf)))
-                (if (not (conf-set-next conf-set* i))
-                  (conf-set-adjoin state* conf-set* conf i))
-                #t)
-              #f)))
-
-        (define (conf-set-union state conf-set conf other-set)
-          (let loop ((i (conf-set-head other-set)))
-            (if (>= i 0)
-              (if (not (conf-set-next conf-set i))
-                (begin
-                  (conf-set-adjoin state conf-set conf i)
-                  (loop (conf-set-next other-set i)))
-                (loop (conf-set-next other-set i))))))
-
-        (define (forw states state-num starters enders predictors steps nts)
-
-          (define (predict state state-num conf-set conf nt starters enders)
-
-            ; add configurations which start the non-terminal `nt' to the
-            ; right of the dot
-
-            (let loop1 ((l (vector-ref starters nt)))
-              (if (pair? l)
-                (let* ((starter (car l))
-                       (starter-set (conf-set-get* state state-num starter)))
-                  (if (not (conf-set-next starter-set state-num))
-                    (begin
-                      (conf-set-adjoin state starter-set starter state-num)
-                      (loop1 (cdr l)))
-                    (loop1 (cdr l))))))
-
-            ; check for possible completion of the non-terminal `nt' to the
-            ; right of the dot
-
-            (let loop2 ((l (vector-ref enders nt)))
-              (if (pair? l)
-                (let ((ender (car l)))
-                  (if (conf-set-member? state ender state-num)
-                    (let* ((next (+ conf 1))
-                           (next-set (conf-set-get* state state-num next)))
-                      (conf-set-union state next-set next conf-set)
-                      (loop2 (cdr l)))
-                    (loop2 (cdr l)))))))
-
-          (define (reduce states state state-num conf-set head preds)
-
-            ; a non-terminal is now completed so check for reductions that
-            ; are now possible at the configurations `preds'
-
-            (let loop1 ((l preds))
-              (if (pair? l)
-                (let ((pred (car l)))
-                  (let loop2 ((i head))
-                    (if (>= i 0)
-                      (let ((pred-set (conf-set-get (vector-ref states i) pred)))
-                        (if pred-set
-                          (let* ((next (+ pred 1))
-                                 (next-set (conf-set-get* state state-num next)))
-                            (conf-set-union state next-set next pred-set)))
-                        (loop2 (conf-set-next conf-set i)))
-                      (loop1 (cdr l))))))))
-
-          (let ((state (vector-ref states state-num))
-                (nb-nts (vector-length nts)))
-            (let loop ()
-              (let ((conf (vector-ref state 0)))
-                (if (>= conf 0)
-                  (let* ((step (vector-ref steps conf))
-                         (conf-set (vector-ref state (+ conf 1)))
-                         (head (vector-ref conf-set 4)))
-                    (vector-set! state 0 (vector-ref conf-set 0))
-                    (conf-set-merge-new! conf-set)
-                    (if (>= step 0)
-                      (predict state state-num conf-set conf step starters enders)
-                      (let ((preds (vector-ref predictors (+ step nb-nts))))
-                        (reduce states state state-num conf-set head preds)))
-                    (loop)))))))
-
-        (define (forward starters enders predictors steps nts toks)
-          (let* ((nb-toks (vector-length toks))
-                 (nb-confs (vector-length steps))
-                 (states (make-states nb-toks nb-confs))
-                 (goal-starters (vector-ref starters 0)))
-            (conf-set-adjoin* states 0 goal-starters 0) ; predict goal
-            (forw states 0 starters enders predictors steps nts)
-            (let loop ((i 0))
-              (if (< i nb-toks)
-                (let ((tok-nts (cdr (vector-ref toks i))))
-                  (conf-set-adjoin* states (+ i 1) tok-nts i) ; scan token
-                  (forw states (+ i 1) starters enders predictors steps nts)
-                  (loop (+ i 1)))))
-            states))
-
-        (define (produce conf i j enders steps toks states states* nb-nts)
-          (let ((prev (- conf 1)))
-            (if (and (>= conf nb-nts) (>= (vector-ref steps prev) 0))
-              (let loop1 ((l (vector-ref enders (vector-ref steps prev))))
-                (if (pair? l)
-                  (let* ((ender (car l))
-                         (ender-set (conf-set-get (vector-ref states j)
-                                                  ender)))
-                    (if ender-set
-                      (let loop2 ((k (conf-set-head ender-set)))
-                        (if (>= k 0)
-                          (begin
-                            (and (>= k i)
-                                 (conf-set-adjoin** states states* k prev i)
-                                 (conf-set-adjoin** states states* j ender k))
-                            (loop2 (conf-set-next ender-set k)))
-                          (loop1 (cdr l))))
-                      (loop1 (cdr l)))))))))
-
-        (define (back states states* state-num enders steps nb-nts toks)
-          (let ((state* (vector-ref states* state-num)))
-            (let loop1 ()
-              (let ((conf (vector-ref state* 0)))
-                (if (>= conf 0)
-                  (let* ((conf-set (vector-ref state* (+ conf 1)))
-                         (head (vector-ref conf-set 4)))
-                    (vector-set! state* 0 (vector-ref conf-set 0))
-                    (conf-set-merge-new! conf-set)
-                    (let loop2 ((i head))
-                      (if (>= i 0)
-                        (begin
-                          (produce conf i state-num enders steps
-                                   toks states states* nb-nts)
-                          (loop2 (conf-set-next conf-set i)))
-                        (loop1)))))))))
-
-        (define (backward states enders steps nts toks)
-          (let* ((nb-toks (vector-length toks))
-                 (nb-confs (vector-length steps))
-                 (nb-nts (vector-length nts))
-                 (states* (make-states nb-toks nb-confs))
-                 (goal-enders (vector-ref enders 0)))
-            (let loop1 ((l goal-enders))
-              (if (pair? l)
-                (let ((conf (car l)))
-                  (conf-set-adjoin** states states* nb-toks conf 0)
-                  (loop1 (cdr l)))))
-            (let loop2 ((i nb-toks))
-              (if (>= i 0)
-                (begin
-                  (back states states* i enders steps nb-nts toks)
-                  (loop2 (- i 1)))))
-            states*))
-
-        (define (parsed? nt i j nts enders states)
-          (let ((nt* (ind nt nts)))
-            (if nt*
-              (let ((nb-nts (vector-length nts)))
-                (let loop ((l (vector-ref enders nt*)))
-                  (if (pair? l)
-                    (let ((conf (car l)))
-                      (if (conf-set-member? (vector-ref states j) conf i)
-                        #t
-                        (loop (cdr l))))
-                    #f)))
-              #f)))
-
-        (define (deriv-trees conf i j enders steps names toks states nb-nts)
-          (let ((name (vector-ref names conf)))
-
-            (if name ; `conf' is at the start of a rule (either special or not)
-              (if (< conf nb-nts)
-                (list (list name (car (vector-ref toks i))))
-                (list (list name)))
-
-              (let ((prev (- conf 1)))
-                (let loop1 ((l1 (vector-ref enders (vector-ref steps prev)))
-                            (l2 '()))
-                  (if (pair? l1)
-                    (let* ((ender (car l1))
-                           (ender-set (conf-set-get (vector-ref states j)
-                                                    ender)))
-                      (if ender-set
-                        (let loop2 ((k (conf-set-head ender-set)) (l2 l2))
-                          (if (>= k 0)
-                            (if (and (>= k i)
-                                     (conf-set-member? (vector-ref states k)
-                                                       prev i))
-                              (let ((prev-trees
-                                      (deriv-trees prev i k enders steps names
-                                                   toks states nb-nts))
-                                    (ender-trees
-                                      (deriv-trees ender k j enders steps names
-                                                   toks states nb-nts)))
-                                (let loop3 ((l3 ender-trees) (l2 l2))
-                                  (if (pair? l3)
-                                    (let ((ender-tree (list (car l3))))
-                                      (let loop4 ((l4 prev-trees) (l2 l2))
-                                        (if (pair? l4)
-                                          (loop4 (cdr l4)
-                                                 (cons (append (car l4)
-                                                               ender-tree)
-                                                       l2))
-                                          (loop3 (cdr l3) l2))))
-                                    (loop2 (conf-set-next ender-set k) l2))))
-                              (loop2 (conf-set-next ender-set k) l2))
-                            (loop1 (cdr l1) l2)))
-                        (loop1 (cdr l1) l2)))
-                    l2))))))
-
-        (define (deriv-trees* nt i j nts enders steps names toks states)
-          (let ((nt* (ind nt nts)))
-            (if nt*
-              (let ((nb-nts (vector-length nts)))
-                (let loop ((l (vector-ref enders nt*)) (trees '()))
-                  (if (pair? l)
-                    (let ((conf (car l)))
-                      (if (conf-set-member? (vector-ref states j) conf i)
-                        (loop (cdr l)
-                              (append (deriv-trees conf i j enders steps names
-                                                   toks states nb-nts)
-                                      trees))
-                        (loop (cdr l) trees)))
-                    trees)))
-              #f)))
-
-        (define (nb-deriv-trees conf i j enders steps toks states nb-nts)
-          (let ((prev (- conf 1)))
-            (if (or (< conf nb-nts) (< (vector-ref steps prev) 0))
-              1
-              (let loop1 ((l (vector-ref enders (vector-ref steps prev)))
-                          (n 0))
-                (if (pair? l)
-                  (let* ((ender (car l))
-                         (ender-set (conf-set-get (vector-ref states j)
-                                                  ender)))
-                    (if ender-set
-                      (let loop2 ((k (conf-set-head ender-set)) (n n))
-                        (if (>= k 0)
-                          (if (and (>= k i)
-                                   (conf-set-member? (vector-ref states k)
-                                                     prev i))
-                            (let ((nb-prev-trees
-                                    (nb-deriv-trees prev i k enders steps
-                                                    toks states nb-nts))
-                                  (nb-ender-trees
-                                    (nb-deriv-trees ender k j enders steps
-                                                    toks states nb-nts)))
-                              (loop2 (conf-set-next ender-set k)
-                                     (+ n (* nb-prev-trees nb-ender-trees))))
-                            (loop2 (conf-set-next ender-set k) n))
-                          (loop1 (cdr l) n)))
-                      (loop1 (cdr l) n)))
-                  n)))))
-
-        (define (nb-deriv-trees* nt i j nts enders steps toks states)
-          (let ((nt* (ind nt nts)))
-            (if nt*
-              (let ((nb-nts (vector-length nts)))
-                (let loop ((l (vector-ref enders nt*)) (nb-trees 0))
-                  (if (pair? l)
-                    (let ((conf (car l)))
-                      (if (conf-set-member? (vector-ref states j) conf i)
-                        (loop (cdr l)
-                              (+ (nb-deriv-trees conf i j enders steps
-                                                 toks states nb-nts)
-                                 nb-trees))
-                        (loop (cdr l) nb-trees)))
-                    nb-trees)))
-              #f)))
-
-        (let* ((lexer      (vector-ref parser-descr 0))
-               (nts        (vector-ref parser-descr 1))
-               (starters   (vector-ref parser-descr 2))
-               (enders     (vector-ref parser-descr 3))
-               (predictors (vector-ref parser-descr 4))
-               (steps      (vector-ref parser-descr 5))
-               (names      (vector-ref parser-descr 6))
-               (toks       (input->tokens input lexer nts)))
-
-          (vector nts
-                  starters
-                  enders
-                  predictors
-                  steps
-                  names
-                  toks
-                  (backward (forward starters enders predictors steps nts toks)
-                            enders steps nts toks)
-                  parsed?
-                  deriv-trees*
-                  nb-deriv-trees*))))))
-
-(define (parse->parsed? parse nt i j)
-  (let* ((nts     (vector-ref parse 0))
-         (enders  (vector-ref parse 2))
-         (states  (vector-ref parse 7))
-         (parsed? (vector-ref parse 8)))
-    (parsed? nt i j nts enders states)))
-
-(define (parse->trees parse nt i j)
-  (let* ((nts          (vector-ref parse 0))
-         (enders       (vector-ref parse 2))
-         (steps        (vector-ref parse 4))
-         (names        (vector-ref parse 5))
-         (toks         (vector-ref parse 6))
-         (states       (vector-ref parse 7))
-         (deriv-trees* (vector-ref parse 9)))
-    (deriv-trees* nt i j nts enders steps names toks states)))
-
-(define (parse->nb-trees parse nt i j)
-  (let* ((nts             (vector-ref parse 0))
-         (enders          (vector-ref parse 2))
-         (steps           (vector-ref parse 4))
-         (toks            (vector-ref parse 6))
-         (states          (vector-ref parse 7))
-         (nb-deriv-trees* (vector-ref parse 10)))
-    (nb-deriv-trees* nt i j nts enders steps toks states)))
-
-(define (test)
-  (let ((p (make-parser '( (s (a) (s s)) )
-                        (lambda (l) (map (lambda (x) (list x x)) l)))))
-    (let ((x (p '(a a a a a a a a a))))
-      (length (parse->trees x 's 0 9)))))
-
-(time (test))
diff --git a/benchmarks/fft.scm b/benchmarks/fft.scm
deleted file mode 100644
index 53e02c07..00000000
--- a/benchmarks/fft.scm
+++ /dev/null
@@ -1,114 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         fft.sc
-;;; Description:  FFT benchmark from the Gabriel tests.
-;;; Author:       Harry Barrow
-;;; Created:      8-Apr-85
-;;; Modified:     6-May-85 09:29:22 (Bob Shaw)
-;;;               11-Aug-87 (Will Clinger)
-;;;               16-Nov-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(define pi (atan 0 -1))
-
-;;; FFT -- This is an FFT benchmark written by Harry Barrow.
-;;; It tests a variety of floating point operations,
-;;; including array references.
-
-(define *re* (make-vector 1025 0.0))
-
-(define *im* (make-vector 1025 0.0))
-
-(define (fft areal aimag)
- (let ((ar areal)			;Qobi
-       (ai aimag)			;Qobi
-       (i 0)
-       (j 0)
-       (k 0)
-       (m 0)
-       (n 0)
-       (le 0)
-       (le1 0)
-       (ip 0)
-       (nv2 0)
-       (nm1 0)
-       (ur 0.0)				;Qobi
-       (ui 0.0)				;Qobi
-       (wr 0.0)				;Qobi
-       (wi 0.0)				;Qobi
-       (tr 0.0)				;Qobi
-       (ti 0.0))			;Qobi
-  ;; initialize
-  (set! ar areal)
-  (set! ai aimag)
-  (set! n (vector-length ar))
-  (set! n (- n 1))
-  (set! nv2 (quotient n 2))
-  (set! nm1 (- n 1))
-  (set! m 0)				;compute m = log(n)
-  (set! i 1)
-  (let loop ()
-   (if (< i n)
-       (begin (set! m (+ m 1))
-	      (set! i (+ i i))
-	      (loop))))
-  (cond ((not (= n (let loop ((i m) (p 1)) ;Qobi
-		    (if (zero? i) p (loop (- i 1) (* 2 p))))))
-	 (display "array size not a power of two.")
-	 (newline)))
-  ;; interchange elements in bit-reversed order
-  (set! j 1)
-  (set! i 1)
-  (let l3 ()
-   (cond ((< i j)
-	  (set! tr (vector-ref ar j))
-	  (set! ti (vector-ref ai j))
-	  (vector-set! ar j (vector-ref ar i))
-	  (vector-set! ai j (vector-ref ai i))
-	  (vector-set! ar i tr)
-	  (vector-set! ai i ti)))
-   (set! k nv2)
-   (let l6 ()
-    (cond ((< k j)
-	   (set! j (- j k))
-	   (set! k (quotient k 2))	;Qobi: was / but this violates R4RS
-	   (l6))))
-   (set! j (+ j k))
-   (set! i (+ i 1))
-   (cond ((< i n) (l3))))
-  ;; loop thru stages (syntax converted from old MACLISP style \bs)
-  (do ((l 1 (+ l 1))) ((> l m))
-   (set! le (let loop ((i l) (p 1))	;Qobi
-	     (if (zero? i) p (loop (- i 1) (* 2 p)))))
-   (set! le1 (quotient le 2))
-   (set! ur 1.0)
-   (set! ui 0.0)
-   (set! wr (cos (/ pi le1)))
-   (set! wi (sin (/ pi le1)))
-   ;; loop thru butterflies
-   (do ((j 1 (+ j 1))) ((> j le1))
-    ;; do a butterfly
-    (do ((i j (+ i le))) ((> i n))
-     (set! ip (+ i le1))
-     (set! tr (- (* (vector-ref ar ip) ur) (* (vector-ref ai ip) ui)))
-     (set! ti (+ (* (vector-ref ar ip) ui) (* (vector-ref ai ip) ur)))
-     (vector-set! ar ip (- (vector-ref ar i) tr))
-     (vector-set! ai ip (- (vector-ref ai i) ti))
-     (vector-set! ar i (+ (vector-ref ar i) tr))
-     (vector-set! ai i (+ (vector-ref ai i) ti))))
-   (set! tr (- (* ur wr) (* ui wi)))
-   (set! ti (+ (* ur wi) (* ui wr)))
-   (set! ur tr)
-   (set! ui ti))
-  #t))
-
-;;; the timer which does 10 calls on fft
-
-(define (fft-bench)
- (do ((ntimes 0 (+ ntimes 1))) ((= ntimes 10))
-  (fft *re* *im*)))
-
-(time (fft-bench))
diff --git a/benchmarks/fib.scm b/benchmarks/fib.scm
deleted file mode 100644
index 22b4918d..00000000
--- a/benchmarks/fib.scm
+++ /dev/null
@@ -1,8 +0,0 @@
-;;; fib.scm
-
-(define (fib n)
-  (if (< n 2)
-      n
-      (+ (fib (- n 1)) (fib (- n 2))) ) )
-
-(time (print (fib 30)))
diff --git a/benchmarks/fibc.scm b/benchmarks/fibc.scm
deleted file mode 100644
index 017a2113..00000000
--- a/benchmarks/fibc.scm
+++ /dev/null
@@ -1,24 +0,0 @@
-;;; FIBC -- FIB using first-class continuations, written by Kent Dybvig
-
-;;; fib with peano arithmetic (using numbers) with call/cc
-
-(define (add1 x) (+ x 1))
-(define (sub1 x) (- x 1))
-
-(define (addc x y k)
-  (if (zero? y)
-    (k x)
-    (addc (add1 x) (sub1 y) k)))
-
-(define (fibc x c)
-  (if (zero? x)
-    (c 0)
-    (if (zero? (sub1 x))
-      (c 1)
-      (addc (call-with-current-continuation (lambda (c) (fibc (sub1 x) c)))
-            (call-with-current-continuation (lambda (c) (fibc (sub1 (sub1 x)) c)))
-            c))))
-
-(let ((x (time (fibc 30 (lambda (n) n)))))
-  (if (not (equal? x 832040))
-      (error "wrong result" x) ) )
diff --git a/benchmarks/fprint.scm b/benchmarks/fprint.scm
deleted file mode 100644
index 4346edd3..00000000
--- a/benchmarks/fprint.scm
+++ /dev/null
@@ -1,47 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         fprint.sc
-;;; Description:  FPRINT benchmark
-;;; Author:       Richard Gabriel
-;;; Created:      11-Apr-85
-;;; Modified:     9-Jul-85 21:11:33 (Bob Shaw)
-;;;               24-Jul-87 (Will Clinger)
-;;;               16-Nov-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; FPRINT -- Benchmark to print to a file.
-
-(define test-atoms '(abcdef12 cdefgh23 efghij34 ghijkl45 ijklmn56 klmnop67
-			      mnopqr78 opqrst89 qrstuv90 stuvwx01 uvwxyz12
-			      ;; Qobi: changed 123456AB to AB123456 etc. since
-			      ;;       Scheme->C can't READ original symbols
-			      wxyzab23 xyzabc34 ab123456 bc234567 cd345678
-			      de456789 ef567890 fg678901 gh789012 hi890123))
-
-(define (init-aux m n atoms)
- (cond ((= m 0) (car atoms))
-       (else (do ((i n (- i 2)) (a '())) ((< i 1) a)
-	      (set! a (cons (car atoms) a))
-	      (set! atoms (cdr atoms))
-	      (set! a (cons (init-aux (- m 1) n atoms) a))))))
-
-(define (init m n atoms)
- (define (copy x) (if (pair? x) (cons (copy (car x)) (copy (cdr x))) x))
- (let ((atoms (copy atoms)))
-  (do ((a atoms (cdr a))) ((null? (cdr a)) (set-cdr! a atoms)))
-  (init-aux m n atoms)))
-
-(define test-pattern (init 8 8 test-atoms))
-
-(define (fprint)
- (call-with-output-file "fprint.tst"
-  (lambda (stream)
-   (newline stream)
-   (write test-pattern stream))  ))
-
-;;; note: The INIT is not done multiple times.
-
-(time (fprint))
diff --git a/benchmarks/fread.scm b/benchmarks/fread.scm
deleted file mode 100644
index d326c4b6..00000000
--- a/benchmarks/fread.scm
+++ /dev/null
@@ -1,22 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         fread.sc
-;;; Description:  FREAD benchmark
-;;; Author:       Richard Gabriel
-;;; Created:      11-Apr-85
-;;; Modified:     11-Apr-85 20:39:09 (Bob Shaw)
-;;;               24-Jul-87 (Will Clinger)
-;;;               14-Jun-95 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; FREAD -- Benchmark to read from a file.
-;;; Requires the existence of FPRINT.TST which is created by FPRINT.
-
-(define (fread)
- (call-with-input-file "fprint.tst" (lambda (stream) (read stream))))
-
-(time (fread)
-)
diff --git a/benchmarks/hanoi.scm b/benchmarks/hanoi.scm
deleted file mode 100644
index 41dc0a0d..00000000
--- a/benchmarks/hanoi.scm
+++ /dev/null
@@ -1,13 +0,0 @@
-;;;; hanoi.scm
-
-(define hanoi 
-  (lambda (n)
-    (letrec ((move-them 
-              (lambda (n from to helper)
-                        (if (> n 1)
-                            (begin
-                              (move-them (- n 1) from helper to)
-                              (move-them (- n 1) helper to from))))))
-      (move-them n 0 1 2))))
-
-(time (do ((i 10 (- i 1))) ((zero? i)) (hanoi 20)))
diff --git a/benchmarks/lattice.scm b/benchmarks/lattice.scm
deleted file mode 100644
index 6bcb938c..00000000
--- a/benchmarks/lattice.scm
+++ /dev/null
@@ -1,217 +0,0 @@
-;;; LATTICE -- Obtained from Andrew Wright.
-;
-; 08/06/01 (felix): renamed "reverse!" to "reverse!2" because MZC doesn't like redefinitions.
-;
-; Given a comparison routine that returns one of
-;       less
-;       more
-;       equal
-;       uncomparable
-; return a new comparison routine that applies to sequences.
-(define lexico
-    (lambda (base)
-        (define lex-fixed
-            (lambda (fixed lhs rhs)
-                (define check
-                    (lambda (lhs rhs)
-                        (if (null? lhs)
-                            fixed
-                            (let ((probe
-                                        (base (car lhs)
-                                            (car rhs))))
-                                (if (or (eq? probe 'equal)
-                                        (eq? probe fixed))
-                                    (check (cdr lhs)
-                                        (cdr rhs))
-                                    'uncomparable)))))
-                (check lhs rhs)))
-        (define lex-first
-            (lambda (lhs rhs)
-                (if (null? lhs)
-                    'equal
-                    (let ((probe
-                                (base (car lhs)
-                                    (car rhs))))
-                        (case probe
-                            ((less more)
-                                (lex-fixed probe
-                                    (cdr lhs)
-                                    (cdr rhs)))
-                            ((equal)
-                                (lex-first (cdr lhs)
-                                    (cdr rhs)))
-                            ((uncomparable)
-                                'uncomparable))))))
-        lex-first))
-
-(define (make-lattice elem-list cmp-func)
-    (cons elem-list cmp-func))
-
-(define lattice->elements car)
-
-(define lattice->cmp cdr)
-
-; Select elements of a list which pass some test.
-(define zulu-select
-    (lambda (test lst)
-        (define select-a
-            (lambda (ac lst)
-                (if (null? lst)
-                    (reverse!2 ac)
-                    (select-a
-                        (let ((head (car lst)))
-                            (if (test head)
-                                (cons head ac)
-                                ac))
-                        (cdr lst)))))
-        (select-a '() lst)))
-
-(define reverse!2
-    (letrec ((rotate
-                (lambda (fo fum)
-                    (let ((next (cdr fo)))
-                        (set-cdr! fo fum)
-                        (if (null? next)
-                            fo
-                            (rotate next fo))))))
-        (lambda (lst)
-            (if (null? lst)
-                '()
-                (rotate lst '())))))
-
-; Select elements of a list which pass some test and map a function
-; over the result.  Note, only efficiency prevents this from being the
-; composition of select and map.
-(define select-map
-    (lambda (test func lst)
-        (define select-a
-            (lambda (ac lst)
-                (if (null? lst)
-                    (reverse!2 ac)
-                    (select-a
-                        (let ((head (car lst)))
-                            (if (test head)
-                                (cons (func head)
-                                    ac)
-                                ac))
-                        (cdr lst)))))
-        (select-a '() lst)))
-
-
-
-; This version of map-and tail-recurses on the last test.
-(define map-and
-    (lambda (proc lst)
-        (if (null? lst)
-            #t
-            (letrec ((drudge
-                        (lambda (lst)
-                            (let ((rest (cdr lst)))
-                                (if (null? rest)
-                                    (proc (car lst))
-                                    (and (proc (car lst))
-                                        (drudge rest)))))))
-                (drudge lst)))))
-
-(define (maps-1 source target pas new)
-    (let ((scmp (lattice->cmp source))
-            (tcmp (lattice->cmp target)))
-        (let ((less
-                    (select-map
-                        (lambda (p)
-                            (eq? 'less
-                                (scmp (car p) new)))
-                        cdr
-                        pas))
-                (more
-                    (select-map
-                        (lambda (p)
-                            (eq? 'more
-                                (scmp (car p) new)))
-                        cdr
-                        pas)))
-            (zulu-select
-                (lambda (t)
-                    (and
-                        (map-and
-                            (lambda (t2)
-                                (memq (tcmp t2 t) '(less equal)))
-                            less)
-                        (map-and
-                            (lambda (t2)
-                                (memq (tcmp t2 t) '(more equal)))
-                            more)))
-                (lattice->elements target)))))
-
-(define (maps-rest source target pas rest to-1 to-collect)
-    (if (null? rest)
-        (to-1 pas)
-        (let ((next (car rest))
-                (rest (cdr rest)))
-            (to-collect
-                (map
-                    (lambda (x)
-                        (maps-rest source target
-                            (cons
-                                (cons next x)
-                                pas)
-                            rest
-                            to-1
-                            to-collect))
-                    (maps-1 source target pas next))))))
-
-(define (maps source target)
-    (make-lattice
-        (maps-rest source
-            target
-            '()
-            (lattice->elements source)
-            (lambda (x) (list (map cdr x)))
-            (lambda (x) (apply append x)))
-        (lexico (lattice->cmp target))))
-
-(define (count-maps source target)
-  (maps-rest source
-             target
-             '()
-             (lattice->elements source)
-             (lambda (x) 1)
-             sum))
-
-(define (sum lst)
-  (if (null? lst)
-      0
-      (+ (car lst) (sum (cdr lst)))))
-
-(define (run)
-  (let* ((l2
-            (make-lattice '(low high)
-                (lambda (lhs rhs)
-                    (case lhs
-                        ((low)
-                            (case rhs
-                                ((low)
-                                    'equal)
-                                ((high)
-                                    'less)
-                                (else
-                                    (error 'make-lattice "base" rhs))))
-                        ((high)
-                            (case rhs
-                                ((low)
-                                    'more)
-                                ((high)
-                                    'equal)
-                                (else
-                                    (error 'make-lattice "base" rhs))))
-                        (else
-                            (error 'make-lattice "base" lhs))))))
-        (l3 (maps l2 l2))
-        (l4 (maps l3 l3)))
-    (count-maps l2 l2)
-    (count-maps l3 l3)
-    (count-maps l2 l3)
-    (count-maps l3 l2)
-    (count-maps l4 l4)))
-
-(time (run))
diff --git a/benchmarks/maze.scm b/benchmarks/maze.scm
deleted file mode 100644
index 3c5e1bf2..00000000
--- a/benchmarks/maze.scm
+++ /dev/null
@@ -1,726 +0,0 @@
-;;; MAZE -- Constructs a maze on a hexagonal grid, written by Olin Shivers.
-
-; 18/07/01 (felix): 100 iterations
-
-;------------------------------------------------------------------------------
-; Was file "rand.scm".
-
-; Minimal Standard Random Number Generator
-; Park & Miller, CACM 31(10), Oct 1988, 32 bit integer version.
-; better constants, as proposed by Park.
-; By Ozan Yigit
-
-;;; Rehacked by Olin 4/1995.
-
-(define (random-state n)
-  (cons n #f))
-
-(define (rand state)
-  (let ((seed (car state))
-        (A 2813) ; 48271
-        (M 8388607) ; 2147483647
-        (Q 2787) ; 44488
-        (R 2699)) ; 3399
-    (let* ((hi (quotient seed Q))
-           (lo (modulo seed Q))
-           (test (- (* A lo) (* R hi)))
-           (val (if (> test 0) test (+ test M))))
-      (set-car! state val)
-      val)))
-
-(define (random-int n state)
-  (modulo (rand state) n))
-
-; poker test
-; seed 1
-; cards 0-9 inclusive (random 10)
-; five cards per hand
-; 10000 hands
-;
-; Poker Hand     Example    Probability  Calculated
-; 5 of a kind    (aaaaa)      0.0001      0
-; 4 of a kind    (aaaab)      0.0045      0.0053
-; Full house     (aaabb)      0.009       0.0093
-; 3 of a kind    (aaabc)      0.072       0.0682
-; two pairs      (aabbc)      0.108       0.1104
-; Pair           (aabcd)      0.504       0.501
-; Bust           (abcde)      0.3024      0.3058
-
-; (define (random n)
-;   (let* ((M 2147483647)
-;        (slop (modulo M n)))
-;     (let loop ((r (rand)))
-;       (if (> r slop)
-;         (modulo r n)  
-;         (loop (rand))))))
-; 
-; (define (rngtest)
-;   (display "implementation ")
-;   (srand 1)
-;   (let loop ((n 0))
-;     (if (< n 10000)
-;         (begin
-;          (rand)
-;          (loop (1+ n)))))
-;   (if (= *seed* 399268537)
-;       (display "looks correct.")
-;       (begin
-;        (display "failed.")
-;        (newline)
-;        (display "   current seed ") (display *seed*)
-;        (newline)
-;        (display "   correct seed 399268537")))
-;   (newline))
-
-;------------------------------------------------------------------------------
-; Was file "uf.scm".
-
-;;; Tarjan's amortised union-find data structure.
-;;; Copyright (c) 1995 by Olin Shivers.
-
-;;; This data structure implements disjoint sets of elements.
-;;; Four operations are supported. The implementation is extremely
-;;; fast -- any sequence of N operations can be performed in time
-;;; so close to linear it's laughable how close it is. See your
-;;; intro data structures book for more. The operations are:
-;;;
-;;; - (base-set nelts) -> set
-;;;   Returns a new set, of size NELTS.
-;;;
-;;; - (set-size s) -> integer
-;;;   Returns the number of elements in set S.
-;;;
-;;; - (union! set1 set2)
-;;;   Unions the two sets -- SET1 and SET2 are now considered the same set
-;;;   by SET-EQUAL?.
-;;;
-;;; - (set-equal? set1 set2)
-;;;   Returns true <==> the two sets are the same.
-
-;;; Representation: a set is a cons cell. Every set has a "representative"
-;;; cons cell, reached by chasing cdr links until we find the cons with
-;;; cdr = (). Set equality is determined by comparing representatives using
-;;; EQ?. A representative's car contains the number of elements in the set.
-
-;;; The speed of the algorithm comes because when we chase links to find 
-;;; representatives, we collapse links by changing all the cells in the path
-;;; we followed to point directly to the representative, so that next time
-;;; we walk the cdr-chain, we'll go directly to the representative in one hop.
-
-
-(define (base-set nelts) (cons nelts '()))
-
-;;; Sets are chained together through cdr links. Last guy in the chain
-;;; is the root of the set.
-
-(define (get-set-root s)
-  (let lp ((r s))                       ; Find the last pair
-    (let ((next (cdr r)))               ; in the list. That's
-      (cond ((pair? next) (lp next))    ; the root r.
-
-            (else
-             (if (not (eq? r s))        ; Now zip down the list again,
-                 (let lp ((x s))        ; changing everyone's cdr to r.
-                   (let ((next (cdr x)))        
-                     (cond ((not (eq? r next))
-                            (set-cdr! x r)
-                            (lp next))))))
-             r)))))                     ; Then return r.
-
-(define (set-equal? s1 s2) (eq? (get-set-root s1) (get-set-root s2)))
-
-(define (set-size s) (car (get-set-root s)))
-
-(define (union! s1 s2)
-  (let* ((r1 (get-set-root s1))
-         (r2 (get-set-root s2))
-         (n1 (set-size r1))
-         (n2 (set-size r2))
-         (n  (+ n1 n2)))
-
-    (cond ((> n1 n2)
-           (set-cdr! r2 r1)
-           (set-car! r1 n))
-          (else
-           (set-cdr! r1 r2)
-           (set-car! r2 n)))))
-
-;------------------------------------------------------------------------------
-; Was file "maze.scm".
-
-;;; Building mazes with union/find disjoint sets.
-;;; Copyright (c) 1995 by Olin Shivers.
-
-;;; This is the algorithmic core of the maze constructor.
-;;; External dependencies:
-;;; - RANDOM-INT
-;;; - Union/find code
-;;; - bitwise logical functions
-
-; (define-record wall
-;   owner         ; Cell that owns this wall.
-;   neighbor      ; The other cell bordering this wall.
-;   bit)          ; Integer -- a bit identifying this wall in OWNER's cell.
-
-; (define-record cell
-;   reachable     ; Union/find set -- all reachable cells.
-;   id            ; Identifying info (e.g., the coords of the cell).
-;   (walls -1)    ; A bitset telling which walls are still standing.
-;   (parent #f)   ; For DFS spanning tree construction.
-;   (mark #f))    ; For marking the solution path.
-
-(define (make-wall owner neighbor bit)
-  (vector 'wall owner neighbor bit))
-
-(define (wall:owner o)          (vector-ref o 1))
-(define (set-wall:owner o v)    (vector-set! o 1 v))
-(define (wall:neighbor o)       (vector-ref o 2))
-(define (set-wall:neighbor o v) (vector-set! o 2 v))
-(define (wall:bit o)            (vector-ref o 3))
-(define (set-wall:bit o v)      (vector-set! o 3 v))
-
-(define (make-cell reachable id)
-  (vector 'cell reachable id -1 #f #f))
-
-(define (cell:reachable o)       (vector-ref o 1))
-(define (set-cell:reachable o v) (vector-set! o 1 v))
-(define (cell:id o)              (vector-ref o 2))
-(define (set-cell:id o v)        (vector-set! o 2 v))
-(define (cell:walls o)           (vector-ref o 3))
-(define (set-cell:walls o v)     (vector-set! o 3 v))
-(define (cell:parent o)          (vector-ref o 4))
-(define (set-cell:parent o v)    (vector-set! o 4 v))
-(define (cell:mark o)            (vector-ref o 5))
-(define (set-cell:mark o v)      (vector-set! o 5 v))
-
-;;; Iterates in reverse order.
-
-(define (vector-for-each proc v)
-  (let lp ((i (- (vector-length v) 1)))
-    (cond ((>= i 0)
-           (proc (vector-ref v i))
-           (lp (- i 1))))))
-
-
-;;; Randomly permute a vector.
-
-(define (permute-vec! v random-state)
-  (let lp ((i (- (vector-length v) 1)))
-    (cond ((> i 1)
-           (let ((elt-i (vector-ref v i))
-                 (j (random-int i random-state)))       ; j in [0,i)
-             (vector-set! v i (vector-ref v j))
-             (vector-set! v j elt-i))
-           (lp (- i 1)))))
-  v)
-
-
-;;; This is the core of the algorithm.
-
-(define (dig-maze walls ncells)
-  (call-with-current-continuation
-    (lambda (quit)
-      (vector-for-each
-       (lambda (wall)                   ; For each wall,
-         (let* ((c1   (wall:owner wall)) ; find the cells on
-                (set1 (cell:reachable c1))
-
-                (c2   (wall:neighbor wall)) ; each side of the wall
-                (set2 (cell:reachable c2)))
-
-           ;; If there is no path from c1 to c2, knock down the
-           ;; wall and union the two sets of reachable cells.
-           ;; If the new set of reachable cells is the whole set
-           ;; of cells, quit.
-           (if (not (set-equal? set1 set2))
-               (let ((walls (cell:walls c1))    
-                     (wall-mask (bitwise-not (wall:bit wall))))
-                 (union! set1 set2)
-                 (set-cell:walls c1 (bitwise-and walls wall-mask))
-                 (if (= (set-size set1) ncells) (quit #f))))))
-       walls))))
-
-
-;;; Some simple DFS routines useful for determining path length 
-;;; through the maze.
-
-;;; Build a DFS tree from ROOT. 
-;;; (DO-CHILDREN proc maze node) applies PROC to each of NODE's children.
-;;; We assume there are no loops in the maze; if this is incorrect, the
-;;; algorithm will diverge.
-
-(define (dfs-maze maze root do-children)
-  (let search ((node root) (parent #f))
-    (set-cell:parent node parent)
-    (do-children (lambda (child)
-                   (if (not (eq? child parent))
-                       (search child node)))
-                 maze node)))
-
-;;; Move the root to NEW-ROOT.
-
-(define (reroot-maze new-root)
-  (let lp ((node new-root) (new-parent #f))
-    (let ((old-parent (cell:parent node)))
-      (set-cell:parent node new-parent)
-      (if old-parent (lp old-parent node)))))
-
-;;; How far from CELL to the root?
-
-(define (path-length cell)
-  (do ((len 0 (+ len 1))
-       (node (cell:parent cell) (cell:parent node)))
-      ((not node) len)))
-
-;;; Mark the nodes from NODE back to root. Used to mark the winning path.
-
-(define (mark-path node)
-  (let lp ((node node))
-    (set-cell:mark node #t)
-    (cond ((cell:parent node) => lp))))
-
-;------------------------------------------------------------------------------
-; Was file "harr.scm".
-
-;;; Hex arrays
-;;; Copyright (c) 1995 by Olin Shivers.
-
-;;; External dependencies:
-;;; - define-record
-
-;;;        ___       ___       ___
-;;;       /   \     /   \     /   \
-;;;   ___/  A  \___/  A  \___/  A  \___
-;;;  /   \     /   \     /   \     /   \
-;;; /  A  \___/  A  \___/  A  \___/  A  \
-;;; \     /   \     /   \     /   \     /
-;;;  \___/     \___/     \___/     \___/
-;;;  /   \     /   \     /   \     /   \
-;;; /     \___/     \___/     \___/     \
-;;; \     /   \     /   \     /   \     /
-;;;  \___/     \___/     \___/     \___/
-;;;  /   \     /   \     /   \     /   \
-;;; /     \___/     \___/     \___/     \
-;;; \     /   \     /   \     /   \     /
-;;;  \___/     \___/     \___/     \___/
-
-;;; Hex arrays are indexed by the (x,y) coord of the center of the hexagonal
-;;; element. Hexes are three wide and two high; e.g., to get from the center
-;;; of an elt to its {NW, N, NE} neighbors, add {(-3,1), (0,2), (3,1)}
-;;; respectively.
-;;;
-;;; Hex arrays are represented with a matrix, essentially made by shoving the
-;;; odd columns down a half-cell so things line up. The mapping is as follows:
-;;;     Center coord      row/column
-;;;     ------------      ----------
-;;;     (x,  y)        -> (y/2, x/3)
-;;;     (3c, 2r + c&1) <- (r,   c)
-
-
-; (define-record harr
-;   nrows
-;   ncols
-;   elts)
-
-(define (make-harr nrows ncols elts)
-  (vector 'harr nrows ncols elts))
-
-(define (harr:nrows o)       (vector-ref o 1))
-(define (set-harr:nrows o v) (vector-set! o 1 v))
-(define (harr:ncols o)       (vector-ref o 2))
-(define (set-harr:ncols o v) (vector-set! o 2 v))
-(define (harr:elts o)        (vector-ref o 3))
-(define (set-harr:elts o v)  (vector-set! o 3 v))
-
-(define (harr r c)
-  (make-harr r c (make-vector (* r c))))
-
-
-
-(define (href ha x y)
-  (let ((r (quotient y 2))
-        (c (quotient x 3)))
-    (vector-ref (harr:elts ha)
-                (+ (* (harr:ncols ha) r) c))))
-
-(define (hset! ha x y val)
-  (let ((r (quotient y 2))
-        (c (quotient x 3)))
-    (vector-set! (harr:elts ha)
-                 (+ (* (harr:ncols ha) r) c)
-                 val)))
-
-(define (href/rc ha r c)
-    (vector-ref (harr:elts ha)
-                (+ (* (harr:ncols ha) r) c)))
-
-;;; Create a nrows x ncols hex array. The elt centered on coord (x, y)
-;;; is the value returned by (PROC x y).
-
-(define (harr-tabulate nrows ncols proc)
-  (let ((v (make-vector (* nrows ncols))))
-
-    (do ((r (- nrows 1) (- r 1)))
-        ((< r 0))
-      (do ((c 0 (+ c 1))
-           (i (* r ncols) (+ i 1)))
-          ((= c ncols))
-        (vector-set! v i (proc (* 3 c) (+ (* 2 r) (bitwise-and c 1))))))
-
-    (make-harr nrows ncols v)))
-
-
-(define (harr-for-each proc harr)
-  (vector-for-each proc (harr:elts harr)))
-
-;------------------------------------------------------------------------------
-; Was file "hex.scm".
-
-;;; Hexagonal hackery for maze generation.
-;;; Copyright (c) 1995 by Olin Shivers.
-
-;;; External dependencies:
-;;; - cell and wall records
-;;; - Functional Postscript for HEXES->PATH
-;;; - logical functions for bit hacking
-;;; - hex array code.
-
-;;; To have the maze span (0,0) to (1,1):
-;;; (scale (/ (+ 1 (* 3 ncols))) (/ (+ 1 (* 2 nrows)))
-;;;        (translate (point 2 1) maze))
-
-;;; Every elt of the hex array manages his SW, S, and SE wall.
-;;; Terminology: - An even column is one whose column index is even. That
-;;;                means the first, third, ... columns (indices 0, 2, ...).
-;;;              - An odd column is one whose column index is odd. That
-;;;                means the second, fourth... columns (indices 1, 3, ...).
-;;;              The even/odd flip-flop is confusing; be careful to keep it
-;;;              straight. The *even* columns are the low ones. The *odd*
-;;;              columns are the high ones.
-;;;    _   _
-;;;  _/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/
-;;;  0 1 2 3
-
-(define south-west 1)
-(define south      2)
-(define south-east 4)
-
-(define (gen-maze-array r c)
-  (harr-tabulate r c (lambda (x y) (make-cell (base-set 1) (cons x y)))))
-
-;;; This could be made more efficient.
-(define (make-wall-vec harr)
-  (let* ((nrows (harr:nrows harr))
-         (ncols (harr:ncols harr))
-         (xmax (* 3 (- ncols 1)))
-
-         ;; Accumulate walls.
-         (walls '())
-         (add-wall (lambda (o n b) ; owner neighbor bit
-                     (set! walls (cons (make-wall o n b) walls)))))
-        
-    ;; Do everything but the bottom row.
-    (do ((x (* (- ncols 1) 3) (- x 3)))
-        ((< x 0))
-      (do ((y (+ (* (- nrows 1) 2) (bitwise-and x 1))
-              (- y 2)))
-          ((<= y 1))    ; Don't do bottom row.
-          (let ((hex (href harr x y)))
-            (if (not (zero? x))
-                (add-wall hex (href harr (- x 3) (- y 1)) south-west))
-            (add-wall hex (href harr x (- y 2)) south)
-            (if (< x xmax)
-                (add-wall hex (href harr (+ x 3) (- y 1)) south-east)))))
-
-    ;; Do the SE and SW walls of the odd columns on the bottom row.
-    ;; If the rightmost bottom hex lies in an odd column, however,
-    ;; don't add it's SE wall -- it's a corner hex, and has no SE neighbor.
-    (if (> ncols 1)
-        (let ((rmoc-x (+ 3 (* 6 (quotient (- ncols 2) 2)))))
-          ;; Do rightmost odd col.
-          (let ((rmoc-hex (href harr rmoc-x 1)))
-            (if (< rmoc-x xmax) ; Not  a corner -- do E wall.
-                (add-wall rmoc-hex (href harr xmax 0) south-east))
-            (add-wall rmoc-hex (href harr (- rmoc-x 3) 0) south-west))
-
-          (do ((x (- rmoc-x 6) ; Do the rest of the bottom row's odd cols.
-                  (- x 6)))
-              ((< x 3)) ; 3 is X coord of leftmost odd column.
-            (add-wall (href harr x 1) (href harr (- x 3) 0) south-west)
-            (add-wall (href harr x 1) (href harr (+ x 3) 0) south-east))))
-
-    (list->vector walls)))
-
-
-;;; Find the cell ctop from the top row, and the cell cbot from the bottom
-;;; row such that cbot is furthest from ctop. 
-;;; Return [ctop-x, ctop-y, cbot-x, cbot-y].
-
-(define (pick-entrances harr)
-  (dfs-maze harr (href/rc harr 0 0) for-each-hex-child)
-  (let ((nrows (harr:nrows harr))
-        (ncols (harr:ncols harr)))
-    (let tp-lp ((max-len -1)
-                (entrance #f)
-                (exit #f)
-                (tcol (- ncols 1)))
-      (if (< tcol 0) (vector entrance exit)
-          (let ((top-cell (href/rc harr (- nrows 1) tcol)))
-            (reroot-maze top-cell)
-            (let ((result
-                    (let bt-lp ((max-len max-len)
-                                (entrance entrance)
-                                (exit exit)
-                                (bcol (- ncols 1)))
-;                     (format #t "~a ~a ~a ~a~%" max-len entrance exit bcol)
-                      (if (< bcol 0) (vector max-len entrance exit)
-                          (let ((this-len (path-length (href/rc harr 0 bcol))))
-                            (if (> this-len max-len)
-                                (bt-lp this-len tcol bcol (- bcol 1))
-                                (bt-lp max-len  entrance exit (- bcol 1))))))))
-              (let ((max-len (vector-ref result 0))
-                    (entrance (vector-ref result 1))
-                    (exit (vector-ref result 2)))
-                (tp-lp max-len entrance exit (- tcol 1)))))))))
-                
-
-
-;;; Apply PROC to each node reachable from CELL.
-(define (for-each-hex-child proc harr cell)
-  (let* ((walls (cell:walls cell))
-         (id (cell:id cell))
-         (x (car id))
-         (y (cdr id))
-         (nr (harr:nrows harr))
-         (nc (harr:ncols harr))
-         (maxy (* 2 (- nr 1)))
-         (maxx (* 3 (- nc 1))))
-    (if (not (bit-test walls south-west)) (proc (href harr (- x 3) (- y 1))))
-    (if (not (bit-test walls south))      (proc (href harr x       (- y 2))))
-    (if (not (bit-test walls south-east)) (proc (href harr (+ x 3) (- y 1))))
-
-    ;; NW neighbor, if there is one (we may be in col 1, or top row/odd col)
-    (if (and (> x 0)    ; Not in first column.
-             (or (<= y maxy)            ; Not on top row or
-                 (zero? (modulo x 6)))) ; not in an odd column.
-        (let ((nw (href harr (- x 3) (+ y 1))))
-          (if (not (bit-test (cell:walls nw) south-east)) (proc nw))))
-
-    ;; N neighbor, if there is one (we may be on top row).
-    (if (< y maxy)              ; Not on top row
-        (let ((n (href harr x (+ y 2))))
-          (if (not (bit-test (cell:walls n) south)) (proc n))))
-
-    ;; NE neighbor, if there is one (we may be in last col, or top row/odd col)
-    (if (and (< x maxx) ; Not in last column.
-             (or (<= y maxy)            ; Not on top row or
-                 (zero? (modulo x 6)))) ; not in an odd column.
-        (let ((ne (href harr (+ x 3) (+ y 1))))
-          (if (not (bit-test (cell:walls ne) south-west)) (proc ne))))))
-
-
-
-;;; The top-level
-(define (make-maze nrows ncols)
-  (let* ((cells (gen-maze-array nrows ncols))
-         (walls (permute-vec! (make-wall-vec cells) (random-state 20))))
-    (dig-maze walls (* nrows ncols))
-    (let ((result (pick-entrances cells)))
-      (let ((entrance (vector-ref result 0))
-            (exit (vector-ref result 1)))
-        (let* ((exit-cell (href/rc cells 0 exit))
-               (walls (cell:walls exit-cell)))
-          (reroot-maze (href/rc cells (- nrows 1) entrance))
-          (mark-path exit-cell)
-          (set-cell:walls exit-cell (bitwise-and walls (bitwise-not south)))
-          (vector cells entrance exit))))))
-
-
-(define (pmaze nrows ncols)
-  (let ((result (make-maze nrows ncols)))
-    (let ((cells (vector-ref result 0))
-          (entrance (vector-ref result 1))
-          (exit (vector-ref result 2)))
-      (print-hexmaze cells entrance))))
-
-;------------------------------------------------------------------------------
-; Was file "hexprint.scm".
-
-;;; Print out a hex array with characters.
-;;; Copyright (c) 1995 by Olin Shivers.
-
-;;; External dependencies:
-;;; - hex array code
-;;; - hex cell code
-
-;;;    _   _
-;;;  _/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ 
-
-;;; Top part of top row looks like this:
-;;;    _   _  _   _
-;;;  _/ \_/ \/ \_/ \
-;;; /        
-
-(define output #f) ; the list of all characters written out, in reverse order.
-
-(define (write-ch c)
-  (set! output (cons c output)))
-
-(define (print-hexmaze harr entrance)
-  (let* ((nrows  (harr:nrows harr))
-         (ncols  (harr:ncols harr))
-         (ncols2 (* 2 (quotient ncols 2))))
-
-    ;; Print out the flat tops for the top row's odd cols.
-    (do ((c 1 (+ c 2)))
-        ((>= c ncols))
-;     (display "   ")
-      (write-ch #\space)
-      (write-ch #\space)
-      (write-ch #\space)
-      (write-ch (if (= c entrance) #\space #\_)))
-;   (newline)
-    (write-ch #\newline)
-
-    ;; Print out the slanted tops for the top row's odd cols
-    ;; and the flat tops for the top row's even cols.
-    (write-ch #\space)
-    (do ((c 0 (+ c 2)))
-        ((>= c ncols2))
-;     (format #t "~a/~a\\"
-;             (if (= c entrance) #\space #\_)
-;             (dot/space harr (- nrows 1) (+ c 1)))
-      (write-ch (if (= c entrance) #\space #\_))
-      (write-ch #\/)
-      (write-ch (dot/space harr (- nrows 1) (+ c 1)))
-      (write-ch #\\))
-    (if (odd? ncols)
-        (write-ch (if (= entrance (- ncols 1)) #\space #\_)))
-;   (newline)
-    (write-ch #\newline)
-
-    (do ((r (- nrows 1) (- r 1)))
-        ((< r 0))
-
-      ;; Do the bottoms for row r's odd cols.
-      (write-ch #\/)
-      (do ((c 1 (+ c 2)))
-          ((>= c ncols2))
-        ;; The dot/space for the even col just behind c.
-        (write-ch (dot/space harr r (- c 1)))
-        (display-hexbottom (cell:walls (href/rc harr r c))))    
-
-      (cond ((odd? ncols)
-             (write-ch (dot/space harr r (- ncols 1)))
-             (write-ch #\\)))
-;     (newline)
-      (write-ch #\newline)
-
-      ;; Do the bottoms for row r's even cols.
-      (do ((c 0 (+ c 2)))
-          ((>= c ncols2))
-        (display-hexbottom (cell:walls (href/rc harr r c)))
-        ;; The dot/space is for the odd col just after c, on row below.
-        (write-ch (dot/space harr (- r 1) (+ c 1))))
-      
-      (cond ((odd? ncols)
-             (display-hexbottom (cell:walls (href/rc harr r (- ncols 1)))))
-            ((not (zero? r)) (write-ch #\\)))
-;     (newline)
-      (write-ch #\newline))))
-
-(define (bit-test j bit)
-  (not (zero? (bitwise-and j bit))))
-
-;;; Return a . if harr[r,c] is marked, otherwise a space.
-;;; We use the dot to mark the solution path.
-(define (dot/space harr r c)
-  (if (and (>= r 0) (cell:mark (href/rc harr r c))) #\. #\space))
-
-;;; Print a \_/ hex bottom.
-(define (display-hexbottom hexwalls)
-  (write-ch (if (bit-test hexwalls south-west) #\\ #\space))
-  (write-ch (if (bit-test hexwalls south     ) #\_ #\space))
-  (write-ch (if (bit-test hexwalls south-east) #\/ #\space)))
-
-;;;    _   _
-;;;  _/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \_/
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \
-;;; / \_/ \_/
-;;; \_/ \_/ \_/
-
-;------------------------------------------------------------------------------
-
-(define (run)
-  (do ((i 100 (- i 1)))
-      ((zero? i) (reverse output))
-    (set! output '())
-    (pmaze 20 7) ) )
-
-(let ((x (time (run))))
-;  (for-each display x)
-  (if (not (equal? x '
-(#\  #\  #\  #\_ #\  #\  #\  #\_ #\  #\  #\  #\_ #\newline
- #\  #\_ #\/ #\  #\\ #\_ #\/ #\  #\\ #\_ #\/ #\. #\\ #\  #\newline
- #\/ #\  #\\ #\  #\  #\  #\\ #\_ #\  #\. #\  #\  #\/ #\. #\\ #\newline
- #\\ #\  #\  #\  #\\ #\  #\/ #\. #\  #\_ #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\\ #\_ #\/ #\. #\  #\_ #\/ #\  #\\ #\_ #\  #\. #\\ #\newline
- #\\ #\  #\/ #\  #\\ #\  #\/ #\  #\  #\_ #\/ #\  #\\ #\_ #\/ #\newline
- #\/ #\  #\  #\_ #\/ #\. #\\ #\  #\/ #\  #\\ #\  #\/ #\  #\\ #\newline
- #\\ #\  #\/ #\  #\\ #\  #\/ #\  #\  #\_ #\/ #\  #\  #\  #\/ #\newline
- #\/ #\  #\\ #\  #\/ #\. #\\ #\  #\/ #\. #\\ #\_ #\/ #\  #\\ #\newline
- #\\ #\_ #\/ #\  #\\ #\  #\/ #\. #\  #\_ #\  #\. #\\ #\  #\/ #\newline
- #\/ #\  #\\ #\_ #\  #\. #\  #\_ #\/ #\  #\\ #\  #\  #\  #\\ #\newline
- #\\ #\_ #\  #\  #\\ #\_ #\/ #\  #\  #\_ #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\  #\_ #\/ #\  #\  #\  #\/ #\  #\\ #\  #\/ #\  #\\ #\newline
- #\\ #\_ #\  #\  #\\ #\  #\/ #\  #\\ #\_ #\  #\. #\\ #\_ #\/ #\newline
- #\/ #\  #\\ #\_ #\  #\  #\\ #\_ #\  #\  #\\ #\_ #\  #\. #\\ #\newline
- #\\ #\_ #\  #\  #\\ #\_ #\/ #\  #\  #\_ #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\\ #\_ #\  #\  #\\ #\  #\/ #\. #\\ #\  #\  #\. #\\ #\newline
- #\\ #\  #\/ #\. #\\ #\_ #\  #\. #\  #\  #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\  #\  #\  #\. #\  #\_ #\/ #\. #\\ #\  #\/ #\  #\\ #\newline
- #\\ #\  #\/ #\. #\\ #\_ #\/ #\. #\\ #\_ #\  #\. #\\ #\  #\/ #\newline
- #\/ #\  #\\ #\_ #\  #\. #\  #\  #\/ #\  #\  #\_ #\/ #\  #\\ #\newline
- #\\ #\_ #\  #\  #\\ #\_ #\/ #\. #\\ #\_ #\  #\  #\\ #\_ #\/ #\newline
- #\/ #\  #\  #\_ #\/ #\  #\\ #\  #\/ #\  #\\ #\_ #\  #\  #\\ #\newline
- #\\ #\_ #\/ #\  #\  #\_ #\/ #\. #\\ #\_ #\  #\  #\\ #\_ #\/ #\newline
- #\/ #\  #\\ #\  #\/ #\  #\  #\_ #\  #\. #\  #\_ #\  #\  #\\ #\newline
- #\\ #\  #\/ #\  #\\ #\_ #\/ #\. #\  #\_ #\  #\  #\\ #\_ #\/ #\newline
- #\/ #\  #\  #\_ #\  #\  #\\ #\  #\  #\  #\\ #\_ #\/ #\  #\\ #\newline
- #\\ #\_ #\/ #\. #\\ #\_ #\  #\. #\\ #\_ #\/ #\  #\  #\_ #\/ #\newline
- #\/ #\  #\\ #\  #\  #\. #\  #\_ #\/ #\  #\  #\  #\/ #\  #\\ #\newline
- #\\ #\  #\/ #\. #\\ #\_ #\/ #\  #\\ #\_ #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\\ #\_ #\  #\. #\  #\_ #\/ #\. #\  #\  #\  #\  #\\ #\newline
- #\\ #\  #\  #\  #\  #\  #\  #\. #\  #\  #\/ #\. #\\ #\_ #\/ #\newline
- #\/ #\  #\\ #\_ #\/ #\  #\\ #\_ #\/ #\  #\\ #\_ #\  #\. #\\ #\newline
- #\\ #\_ #\/ #\  #\  #\  #\/ #\  #\\ #\_ #\/ #\. #\  #\  #\/ #\newline
- #\/ #\  #\  #\  #\/ #\  #\  #\_ #\  #\  #\\ #\  #\/ #\  #\\ #\newline
- #\\ #\_ #\/ #\  #\\ #\_ #\/ #\  #\\ #\_ #\/ #\. #\\ #\_ #\/ #\newline
- #\/ #\  #\\ #\_ #\/ #\  #\  #\_ #\/ #\  #\\ #\_ #\  #\. #\\ #\newline
- #\\ #\  #\  #\  #\  #\_ #\/ #\. #\  #\  #\/ #\. #\  #\_ #\/ #\newline
- #\/ #\  #\\ #\  #\/ #\. #\  #\  #\/ #\  #\\ #\_ #\  #\. #\\ #\newline
- #\\ #\_ #\/ #\. #\  #\_ #\/ #\. #\\ #\_ #\/ #\. #\\ #\  #\/ #\newline
- #\/ #\  #\  #\_ #\  #\. #\\ #\_ #\  #\. #\  #\_ #\  #\. #\\ #\newline
- #\\ #\_ #\/ #\  #\\ #\  #\/ #\  #\\ #\_ #\/ #\  #\\ #\_ #\/ #\newline)))
-(error "wrong result") ) )
diff --git a/benchmarks/nbody.scm b/benchmarks/nbody.scm
deleted file mode 100644
index 78210f07..00000000
--- a/benchmarks/nbody.scm
+++ /dev/null
@@ -1,138 +0,0 @@
-;;; The Computer Language Benchmarks Game
-;;; http://shootout.alioth.debian.org/
-;;;
-;;; contributed by Anthony Borla
-;;; modified by Graham Fawcett
-
-;; define planetary masses, initial positions & velocity
-
-(define +pi+ 3.141592653589793)
-(define +days-per-year+ 365.24)
-
-(define +solar-mass+ (* 4 +pi+ +pi+))
-
-(define-record body x y z vx vy vz mass)
-
-(define *sun*
-  (make-body 0.0 0.0 0.0 0.0 0.0 0.0 +solar-mass+))
-
-(define *jupiter*
-  (make-body 4.84143144246472090
-             -1.16032004402742839
-             -1.03622044471123109e-1
-             (* 1.66007664274403694e-3 +days-per-year+)
-             (* 7.69901118419740425e-3 +days-per-year+)
-             (* -6.90460016972063023e-5 +days-per-year+)
-             (* 9.54791938424326609e-4 +solar-mass+)))
-
-(define *saturn*
-  (make-body 8.34336671824457987
-             4.12479856412430479
-             -4.03523417114321381e-1
-             (* -2.76742510726862411e-3 +days-per-year+)
-             (* 4.99852801234917238e-3 +days-per-year+)
-             (* 2.30417297573763929e-5 +days-per-year+)
-             (* 2.85885980666130812e-4 +solar-mass+)))
-
-(define *uranus*
-  (make-body 1.28943695621391310e1
-             -1.51111514016986312e1
-             -2.23307578892655734e-1
-             (* 2.96460137564761618e-03 +days-per-year+)
-             (* 2.37847173959480950e-03 +days-per-year+)
-             (* -2.96589568540237556e-05 +days-per-year+)
-             (*  4.36624404335156298e-05 +solar-mass+)))
-
-(define *neptune*
-  (make-body 1.53796971148509165e+01
-             -2.59193146099879641e+01
-             1.79258772950371181e-01
-             (* 2.68067772490389322e-03 +days-per-year+)
-             (* 1.62824170038242295e-03 +days-per-year+)
-             (* -9.51592254519715870e-05 +days-per-year+)
-             (* 5.15138902046611451e-05 +solar-mass+)))
-
-;; -------------------------------
-(define (offset-momentum system)
-  (let loop-i ((i system) (px 0.0) (py 0.0) (pz 0.0))
-    (if (null? i)
-        (begin
-          (body-vx-set! (car system) (/ (- px) +solar-mass+))
-          (body-vy-set! (car system) (/ (- py) +solar-mass+))
-          (body-vz-set! (car system) (/ (- pz) +solar-mass+)))
-        (loop-i (cdr i)
-      	  (+ px (* (body-vx (car i)) (body-mass (car i))))
-      	  (+ py (* (body-vy (car i)) (body-mass (car i))))
-      	  (+ pz (* (body-vz (car i)) (body-mass (car i))))))))
-
-;; -------------------------------
-(define (energy system)
-  (let loop-o ((o system) (e 0.0))
-      (if (null? o)
-          e
-          (let ([e (+ e (* 0.5 (body-mass (car o))
-      		     (+ (* (body-vx (car o)) (body-vx (car o)))
-      			(* (body-vy (car o)) (body-vy (car o)))
-      			(* (body-vz (car o)) (body-vz (car o))))))])
-
-            (let loop-i ((i (cdr o)) (e e))
-      	(if (null? i)
-      	    (loop-o (cdr o) e)
-      	    (let* ((dx (- (body-x (car o)) (body-x (car i))))
-      		   (dy (- (body-y (car o)) (body-y (car i))))
-      		   (dz (- (body-z (car o)) (body-z (car i))))
-      		   (distance (sqrt (+ (* dx dx) (* dy dy) (* dz dz)))))
-      	      (let ([e  (- e (/ (* (body-mass (car o)) (body-mass (car i))) distance))])
-      		(loop-i (cdr i) e)))))))))
-
-;; -------------------------------
-(define (advance system dt)
-  (let loop-o ((o system))
-    (unless (null? o)
-      (let loop-i ((i (cdr o)))
-        (unless (null? i)
-          (let* ((o1 (car o))
-      	   (i1 (car i))
-      	   (dx (- (body-x o1) (body-x i1)))
-      	   (dy (- (body-y o1) (body-y i1)))
-      	   (dz (- (body-z o1) (body-z i1)))
-      	   (distance (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))
-      	   (mag (/ dt (* distance distance distance)))
-      	   (dxmag (* dx mag))
-      	   (dymag (* dy mag))
-      	   (dzmag (* dz mag))
-      	   (om (body-mass o1))
-      	   (im (body-mass i1)))
-            (body-vx-set! o1 (- (body-vx o1) (* dxmag im)))
-            (body-vy-set! o1 (- (body-vy o1) (* dymag im)))
-            (body-vz-set! o1 (- (body-vz o1) (* dzmag im)))
-            (body-vx-set! i1 (+ (body-vx i1) (* dxmag om)))
-            (body-vy-set! i1 (+ (body-vy i1) (* dymag om)))
-            (body-vz-set! i1 (+ (body-vz i1) (* dzmag om)))
-            (loop-i (cdr i)))))
-      (loop-o (cdr o))))
-
-  (let loop-o ((o system))
-    (unless (null? o)
-      (let ([o1 (car o)])
-        (body-x-set! o1 (+ (body-x o1) (* dt (body-vx o1))))
-        (body-y-set! o1 (+ (body-y o1) (* dt (body-vy o1))))
-        (body-z-set! o1 (+ (body-z o1) (* dt (body-vz o1))))
-        (loop-o (cdr o))))))
-
-;; -------------------------------
-(define (main n)
-  (let ((system (list *sun* *jupiter* *saturn* *uranus* *neptune*)))
-
-    (offset-momentum system)
-    (print-float (energy system))
-
-    (do ((i 1 (+ i 1)))
-        ((< n i))
-      (advance system 0.01))
-    (print-float (energy system))))
-
-(define print-float
-  (foreign-lambda* void ((double f)) "printf(\"%2.9f\\n\", f);"))
-
-(time (main 100000))
diff --git a/benchmarks/nqueens.scm b/benchmarks/nqueens.scm
deleted file mode 100644
index 75df9ce2..00000000
--- a/benchmarks/nqueens.scm
+++ /dev/null
@@ -1,30 +0,0 @@
-;;; NQUEENS -- Compute number of solutions to 8-queens problem.
-
-(define trace? #f)
-
-(define (nqueens n)
-
-  (define (dec-to n)
-    (let loop ((i n) (l '()))
-      (if (= i 0) l (loop (- i 1) (cons i l)))))
-
-  (define (try x y z)
-    (if (null? x)
-      (if (null? y)
-        (begin (if trace? (begin (write z) (newline))) 1)
-        0)
-      (+ (if (ok? (car x) 1 z)
-           (try (append (cdr x) y) '() (cons (car x) z))
-           0)
-         (try (cdr x) (cons (car x) y) z))))
-
-  (define (ok? row dist placed)
-    (if (null? placed)
-      #t
-      (and (not (= (car placed) (+ row dist)))
-           (not (= (car placed) (- row dist)))
-           (ok? row (+ dist 1) (cdr placed)))))
-
-  (try (dec-to n) '() '()))
-
-(time (do ((i 1000 (- 1 1))) ((zero? i)) (nqueens 10)))
diff --git a/benchmarks/others/Makefile b/benchmarks/others/Makefile
deleted file mode 100644
index a231e053..00000000
--- a/benchmarks/others/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
-.PHONY: all clean
-
-all: exception except setlongjmp except-fast except2
-
-clean: 
-	rm -f *.o except exception except-fast except2 setlongjmp
-
-exception: exception.cpp
-	g++ $< -o $@ -O2
-
-except: except.scm
-	csc $< -o $@ -O2 -d0
-
-except-fast: except.scm
-	csc $< -o $@ -Ob
-
-except2: except2.scm
-	csc $< -o $@ -Ob
-
-setlongjmp: setlongjmp.c
-	gcc $< -o $@ -O2
diff --git a/benchmarks/others/except.scm b/benchmarks/others/except.scm
deleted file mode 100644
index 56c387d7..00000000
--- a/benchmarks/others/except.scm
+++ /dev/null
@@ -1,10 +0,0 @@
-(define n 0)
-
-(define (foo k) 
-  (set! n (+ n 1))
-  (k 123))
-
-(let ((count (string->number (:optional (command-line-arguments) "10000"))))
-  (do ((i count (- i 1)))
-      ((zero? i) (print n))
-    (call/cc (lambda (k) (foo k))) ) )
diff --git a/benchmarks/others/except2.scm b/benchmarks/others/except2.scm
deleted file mode 100644
index a83e0c2c..00000000
--- a/benchmarks/others/except2.scm
+++ /dev/null
@@ -1,10 +0,0 @@
-(define n 0)
-
-(define (foo k) 
-  (set! n (+ n 1))
-  (##sys#direct-return k 123))
-
-(let ((count (string->number (:optional (command-line-arguments) "10000"))))
-  (do ((i count (- i 1)))
-      ((zero? i) (print n))
-    (##sys#call-with-direct-continuation (lambda (k) (foo k))) ) )
diff --git a/benchmarks/others/exception.cpp b/benchmarks/others/exception.cpp
deleted file mode 100644
index a49f4ae5..00000000
--- a/benchmarks/others/exception.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-
-static void foo()
-{
-  throw 123;
-}
-
-int main(int argc, char *argv[])
-{
-  int count = argc == 1 ? 10000 : atoi(argv[ 1 ]);
-  int n = 0;
-
-  for(int i = 0; i < count; ++i) {
-    try {
-      foo();
-    }
-    catch(...) {
-      ++n;
-    }
-  }
-
-  printf("%d\n", n);
-  return 0;
-}
diff --git a/benchmarks/others/results.txt b/benchmarks/others/results.txt
deleted file mode 100644
index 8bd50f02..00000000
--- a/benchmarks/others/results.txt
+++ /dev/null
@@ -1,63 +0,0 @@
-Darwin o3215.o.pppool.de 8.0.0 Darwin Kernel Version 8.0.0: Sat Mar 26 14:15:22 PST 2005; root:xnu-792.obj~1/RELEASE_PPC Power Macintosh powerpc:
-% 
-% time exception 1000000
-1000000
-
-real	0m32.497s
-user	0m22.000s
-sys	0m0.119s
-% time exception 1000000
-1000000
-
-real	0m28.155s
-user	0m21.985s
-sys	0m0.090s
-% time setlongjmp 1000000
-1000000
-
-real	0m5.516s
-user	0m1.269s
-sys	0m2.680s
-% time setlongjmp 1000000
-1000000
-
-real	0m4.993s
-user	0m1.239s
-sys	0m2.636s
-% time except 1000000
-1000000
-
-real	0m2.392s
-user	0m1.646s
-sys	0m0.078s
-% time except 1000000
-1000000
-
-real	0m2.208s
-user	0m1.652s
-sys	0m0.076s
-% time except-fast 1000000
-1000000
-
-real	0m1.374s
-user	0m1.034s
-sys	0m0.063s
-% time except-fast 1000000
-1000000
-
-real	0m1.364s
-user	0m1.033s
-sys	0m0.061s
-% time except2 1000000
-1000000
-
-real	0m0.419s
-user	0m0.283s
-sys	0m0.026s
-% time except2 1000000
-1000000
-
-real	0m0.404s
-user	0m0.285s
-sys	0m0.024s
-% 
diff --git a/benchmarks/others/setlongjmp.c b/benchmarks/others/setlongjmp.c
deleted file mode 100644
index 355de55b..00000000
--- a/benchmarks/others/setlongjmp.c
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <setjmp.h>
-
-static int n = 0;
-static jmp_buf jb;
-
-static void foo()
-{
-  ++n;
-  longjmp(jb, 123);
-}
-
-int main(int argc, char *argv[])
-{
-  int count = argc == 1 ? 10000 : atoi(argv[ 1 ]);
-  int i;
-
-  for(i = 0; i < count; ++i) {
-    if(!setjmp(jb))
-      foo();
-  }
-
-  printf("%d\n", n);
-  return 0;
-}
diff --git a/benchmarks/puzzle.scm b/benchmarks/puzzle.scm
deleted file mode 100644
index 19bb73b8..00000000
--- a/benchmarks/puzzle.scm
+++ /dev/null
@@ -1,151 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         puzzle.sc
-;;; Description:  PUZZLE benchmark
-;;; Author:       Richard Gabriel, after Forrest Baskett
-;;; Created:      12-Apr-85
-;;; Modified:     12-Apr-85 14:20:23 (Bob Shaw)
-;;;               11-Aug-87 (Will Clinger)
-;;;               22-Jan-88 (Will Clinger)
-;;;                8-Oct-95 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(define (iota n)
-  (do ((n n (- n 1)) (list '() (cons (- n 1) list))) ((zero? n) list)))
-
-;; PUZZLE -- Forest Baskett's Puzzle benchmark, originally written in Pascal.
-
- (define size 511)
- (define classmax 3)
- (define typemax 12)
-
- (define *iii* 0)
- (define *kount* 0)
- (define *d* 8)
-
- (define *piececount* (make-vector (+ classmax 1) 0))
- (define *class* (make-vector (+ typemax 1) 0))
- (define *piecemax* (make-vector (+ typemax 1) 0))
- (define *puzzle* (make-vector (+ size 1)))
- (define *p* (make-vector (+ typemax 1)))
-
- (define (fit i j)
-  (let ((end (vector-ref *piecemax* i)))
-   (do ((k 0 (+ k 1)))
-     ((or (> k end)
-	  (and (vector-ref (vector-ref *p* i) k)
-	       (vector-ref *puzzle* (+ j k))))
-      (if (> k end) #t #f)))))		;Qobi: resist temptation to optimize
-
- (define (place i j)
-  (let ((end (vector-ref *piecemax* i)))
-   (do ((k 0 (+ k 1))) ((> k end))
-    (cond ((vector-ref (vector-ref *p* i) k)
-	   (vector-set! *puzzle* (+ j k) #t)
-	   #t)))
-   (vector-set! *piececount*
-		(vector-ref *class* i)
-		(- (vector-ref *piececount* (vector-ref *class* i)) 1))
-   (do ((k j (+ k 1)))
-     ((or (> k size) (not (vector-ref *puzzle* k)))
-      ;;(newline)
-      ;;(display "*Puzzle* filled")
-      (if (> k size) 0 k)))))
-
- (define (puzzle-remove i j)
-  (let ((end (vector-ref *piecemax* i)))
-   (do ((k 0 (+ k 1))) ((> k end))
-    (cond ((vector-ref (vector-ref *p* i) k)
-	   (vector-set! *puzzle* (+ j k) #f)
-	   #f)))
-   (vector-set! *piececount*
-		(vector-ref *class* i)
-		(+ (vector-ref *piececount* (vector-ref *class* i)) 1))))
-
- (define (trial j)
-  (let ((k 0))
-   (call-with-current-continuation
-    (lambda (return)
-     ;; Qobi: changed () to #F in the following
-     (do ((i 0 (+ i 1))) ((> i typemax) (set! *kount* (+ *kount* 1)) #f)
-      (cond ((not (zero? (vector-ref *piececount* (vector-ref *class* i))))
-	     (cond ((fit i j)
-		    (set! k (place i j))
-		    (cond ((or (trial k) (zero? k))
-			   ;;(trial-output (+ i 1) (+ k 1))
-			   (set! *kount* (+ *kount* 1))
-			   (return #t))
-			  (else (puzzle-remove i j))))))))))))
-
- (define (trial-output x y)		;Qobi: removed R3RS NUMBER->STRING
-  (newline)
-  (display "Piece ")
-  (display x)
-  (display " at ")
-  (display y)
-  (display "."))
-
- (define (definePiece iclass ii jj kk)
-  (let ((index 0))
-   (do ((i 0 (+ i 1))) ((> i ii))
-    (do ((j 0 (+ j 1))) ((> j jj))
-     (do ((k 0 (+ k 1))) ((> k kk))
-      (set! index (+ i (* *d* (+ j (* *d* k)))))
-      (vector-set! (vector-ref *p* *iii*) index  #t))))
-   (vector-set! *class* *iii* iclass)
-   (vector-set! *piecemax* *iii* index)
-   (cond ((not (= *iii* typemax)) (set! *iii* (+ *iii* 1))))))
-
- (define (start)
-  (do ((m 0 (+ m 1))) ((> m size)) (vector-set! *puzzle* m #t))
-  (do ((i 1 (+ i 1))) ((> i 5))
-   (do ((j 1 (+ j 1))) ((> j 5))
-    (do ((k 1 (+ k 1))) ((> k 5))
-     (vector-set! *puzzle* (+ i (* *d* (+ j (* *d* k)))) #f))))
-  (do ((i 0 (+ i 1))) ((> i typemax))
-   (do ((m 0 (+ m 1))) ((> m size))
-    (vector-set! (vector-ref *p* i) m #f)))
-  (set! *iii* 0)
-  (definePiece 0 3 1 0)
-  (definePiece 0 1 0 3)
-  (definePiece 0 0 3 1)
-  (definePiece 0 1 3 0)
-  (definePiece 0 3 0 1)
-  (definePiece 0 0 1 3)
-
-  (definePiece 1 2 0 0)
-  (definePiece 1 0 2 0)
-  (definePiece 1 0 0 2)
-
-  (definePiece 2 1 1 0)
-  (definePiece 2 1 0 1)
-  (definePiece 2 0 1 1)
-
-  (definePiece 3 1 1 1)
-
-  (vector-set! *piececount* 0 13)
-  (vector-set! *piececount* 1 3)
-  (vector-set! *piececount* 2 1)
-  (vector-set! *piececount* 3 1)
-  (let ((m (+ (* *d* (+ *d* 1)) 1))
-	(n 0))
-   (cond ((fit 0 m) (set! n (place 0 m)))
-	 (else (newline) (display "Error."))) ;Qobi: removed BEGIN
-   (cond ((trial n)			;Qobi: removed BEGIN
-	  (newline)
-	  (display "Success in ")
-	  (write *kount*)
-	  (display " trials."))
-	 (else (newline) (display "Failure."))))) ;Qobi: removed BEGIN
-
- ;; Qobi: moved
- (for-each (lambda (i) (vector-set! *p* i (make-vector (+ size 1))))
-	   (iota (+ typemax 1)))
-
-(time
- (begin
-   (start)
-   (newline) ) )				;Qobi: added
diff --git a/benchmarks/regex/benchmark.pl b/benchmarks/regex/benchmark.pl
deleted file mode 100644
index 261e0354..00000000
--- a/benchmarks/regex/benchmark.pl
+++ /dev/null
@@ -1,28 +0,0 @@
-#! /usr/bin/env perl
-
-use strict;
-
-sub bench ($$$) {
-  my ($name, $sub, $n) = @_;
-  my $start = times;
-  for (my $i=0; $i<$n; $i++) { $sub->(); }
-  print "$name: ".((times-$start)*1000)."\n";
-}
-
-open(IN, "< re-benchmarks.txt");
-while (<IN>) {
-  next if /^\s*#/;
-  my ($name, $pat, $str, $prefix, $compn, $execn) = split(/\t/);
-  bench("$name: compile-time", sub {eval "/$pat/"}, $compn);
-  my ($rx, $rxm, $str2);
-  eval "\$rx = qr/$pat/";
-  eval "\$rxm = qr/^$pat\$/";
-  bench("$name: match-time", sub {$str =~ $rxm}, $execn);
-  for (my $mult=1; $execn>=10; $mult*=10, $execn/=10) {
-    $str2 = (($prefix x $mult).$str);
-    bench("$name: search prefix x $mult", sub {$str2 =~ $rx}, $execn);
-  }
-}
-close(IN);
-
-
diff --git a/benchmarks/regex/benchmark.scm b/benchmarks/regex/benchmark.scm
deleted file mode 100644
index 3d2106dc..00000000
--- a/benchmarks/regex/benchmark.scm
+++ /dev/null
@@ -1,58 +0,0 @@
-
-(use chicken extras regex data-structures srfi-13)
-(import irregex)
-
-(define-syntax time-expr
-  (syntax-rules ()
-    ((time-expr expr)
-     (let ((start (nth-value 0 (cpu-time))))
-       expr
-       (- (nth-value 0 (cpu-time)) start)))))
-
-(define (string-replicate str reps)
-  (let lp ((ls '()) (reps reps))
-    (if (<= reps 0)
-        (string-concatenate-reverse ls)
-        (lp (cons str ls) (- reps 1)))))
-
-(define (run-bench name pat str prefix comp-count exec-count)
-  (let-syntax
-      ((bench (syntax-rules ()
-                ((bench variation expr count)
-                 (let ((time-taken
-                        (time-expr (do ((i count (- i 1)))
-                                       ((< i 0))
-                                     expr))))
-                   (display name) (display ": ")
-                   (display variation) (display ": ")
-                   (write time-taken) (newline))))))
-    (let ((comp-count (string->number comp-count))
-          (exec-count (string->number exec-count)))
-      ;; compile time
-      (bench "compile-time" (string->irregex pat) comp-count)
-      (let ((irx (string->irregex pat)))
-        ;; match time
-        (bench "match-time" (irregex-match irx str) exec-count)
-        ;; search times
-        (let lp ((mult 1) (reps exec-count))
-          (cond
-           ((>= reps 10)
-            (let ((str (string-append (string-replicate prefix mult) str)))
-              (bench (string-append "search prefix x " (number->string mult))
-                     (irregex-search irx str)
-                     reps)
-              (lp (* mult 10) (quotient reps 10))))))))))
-
-(call-with-input-file "re-benchmarks.txt"
-  (lambda (in)
-    (let lp ()
-      (let ((line (read-line in)))
-        (cond
-         ((eof-object? line))
-         ((string-match "^\\s*#.*" line)
-          (lp))
-         (else
-          (let ((ls (string-split line "\t")))
-            (apply run-bench ls)
-            (lp))))))))
-
diff --git a/benchmarks/regex/re-benchmarks.txt b/benchmarks/regex/re-benchmarks.txt
deleted file mode 100644
index b8f2acdb..00000000
--- a/benchmarks/regex/re-benchmarks.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-char literal	a	a	xxxxxxxxxx	1000	10000
-string literal	abccb	abccb	xxxxxxxxxx	1000	10000
-ci string literal	(?i:abccb)	aBCcB	xxxxxxxxxx	1000	10000
-best-case boyer-moore	abcdefghijklmnopq	abcdefghijklmnopq	xxxxxxxxxx	1000	10000
-worst-case boyer-moore	abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb	abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb	bbbbbbbbbb	1000	10000
-alternation	(?:asm|break|case|catch|const_cast|continue|default|delete|do|dynamic_cast|else|explicit|export|false|for|friend|goto|if|mutable|namespace|new|operator|private|protected|public|register|reinterpret_cast|return|sizeof|static_cast|switch|template|this|throw|true|try|typedef|typeid|typename|using|virtual|while)	virtual	aeiouaeiou	1	10000
-backtracker		a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa	x	100	100
-exponential dfa	a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab]	abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb	b	1	100
-# backtracker + exponential dfa	a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab]	aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbb	b	1	100
diff --git a/benchmarks/scheme.scm b/benchmarks/scheme.scm
deleted file mode 100644
index 8b28b3f9..00000000
--- a/benchmarks/scheme.scm
+++ /dev/null
@@ -1,1082 +0,0 @@
-;;; SCHEME -- A Scheme interpreter evaluating a sorting routine, written by Marc Feeley.
-;
-; 08/06/01 (felix): renamed "macro?" to "macro?2" because MZC can't
-; handle redefinitions of primitives.
-; 18/07/01 (felix): 100 iterations
-;
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (scheme-eval expr)
-  (let ((code (scheme-comp expr scheme-global-environment)))
-    (code #f)))
-
-(define scheme-global-environment
-  (cons '()   ; environment chain
-        '())) ; macros
-
-(define (scheme-add-macro name proc)
-  (set-cdr! scheme-global-environment
-    (cons (cons name proc) (cdr scheme-global-environment)))
-  name)
-
-(define (scheme-error msg . args)
-  (fatal-error msg args))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (lst->vector l)
-  (let* ((n (length l))
-         (v (make-vector n)))
-    (let loop ((l l) (i 0))
-      (if (pair? l)
-        (begin
-          (vector-set! v i (car l))
-          (loop (cdr l) (+ i 1)))
-        v))))
-
-(define (vector->lst v)
-  (let loop ((l '()) (i (- (vector-length v) 1)))
-    (if (< i 0)
-      l
-      (loop (cons (vector-ref v i) l) (- i 1)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define scheme-syntactic-keywords
-  '(quote quasiquote unquote unquote-splicing
-    lambda if set! cond => else and or
-    case let let* letrec begin do define
-    define-macro))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (push-frame frame env)
-  (if (null? frame)
-    env
-    (cons (cons (car env) frame) (cdr env))))
-
-(define (lookup-var name env)
-  (let loop1 ((chain (car env)) (up 0))
-    (if (null? chain)
-      name
-      (let loop2 ((chain chain)
-                  (up up)
-                  (frame (cdr chain))
-                  (over 1))
-        (cond ((null? frame)
-               (loop1 (car chain) (+ up 1)))
-              ((eq? (car frame) name)
-               (cons up over))
-              (else
-               (loop2 chain up (cdr frame) (+ over 1))))))))
-
-(define (macro?2 name env)
-  (assq name (cdr env)))
-
-(define (push-macro name proc env)
-  (cons (car env) (cons (cons name proc) (cdr env))))
-
-(define (lookup-macro name env)
-  (cdr (assq name (cdr env))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (variable x)
-  (if (not (symbol? x))
-    (scheme-error "Identifier expected" x))
-  (if (memq x scheme-syntactic-keywords)
-    (scheme-error "Variable name cannot be a syntactic keyword" x)))
-
-(define (shape form n)
-  (let loop ((form form) (n n) (l form))
-    (cond ((<= n 0))
-          ((pair? l)
-           (loop form (- n 1) (cdr l)))
-          (else
-           (scheme-error "Ill-constructed form" form)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (macro-expand expr env)
-  (apply (lookup-macro (car expr) env) (cdr expr)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-var expr env)
-  (variable expr)
-  (gen-var-ref (lookup-var expr env)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-self-eval expr env)
-  (gen-cst expr))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-quote expr env)
-  (shape expr 2)
-  (gen-cst (cadr expr)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-quasiquote expr env)
-  (comp-quasiquotation (cadr expr) 1 env))
-
-(define (comp-quasiquotation form level env)
-  (cond ((= level 0)
-         (scheme-comp form env))
-        ((pair? form)
-         (cond
-           ((eq? (car form) 'quasiquote)
-            (comp-quasiquotation-list form (+ level 1) env))
-           ((eq? (car form) 'unquote)
-            (if (= level 1)
-              (scheme-comp (cadr form) env)
-              (comp-quasiquotation-list form (- level 1) env)))
-           ((eq? (car form) 'unquote-splicing)
-            (if (= level 1)
-              (scheme-error "Ill-placed 'unquote-splicing'" form))
-            (comp-quasiquotation-list form (- level 1) env))
-           (else
-            (comp-quasiquotation-list form level env))))
-        ((vector? form)
-         (gen-vector-form
-           (comp-quasiquotation-list (vector->lst form) level env)))
-        (else
-         (gen-cst form))))
-
-(define (comp-quasiquotation-list l level env)
-  (if (pair? l)
-    (let ((first (car l)))
-      (if (= level 1)
-        (if (unquote-splicing? first)
-          (begin
-            (shape first 2)
-            (gen-append-form (scheme-comp (cadr first) env)
-                             (comp-quasiquotation (cdr l) 1 env)))
-          (gen-cons-form (comp-quasiquotation first level env)
-                         (comp-quasiquotation (cdr l) level env)))
-        (gen-cons-form (comp-quasiquotation first level env)
-                       (comp-quasiquotation (cdr l) level env))))
-    (comp-quasiquotation l level env)))
-
-(define (unquote-splicing? x)
-  (if (pair? x)
-    (if (eq? (car x) 'unquote-splicing) #t #f)
-    #f))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-unquote expr env)
-  (scheme-error "Ill-placed 'unquote'" expr))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-unquote-splicing expr env)
-  (scheme-error "Ill-placed 'unquote-splicing'" expr))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-set! expr env)
-  (shape expr 3)
-  (variable (cadr expr))
-  (gen-var-set (lookup-var (cadr expr) env) (scheme-comp (caddr expr) env)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-lambda expr env)
-  (shape expr 3)
-  (let ((parms (cadr expr)))
-    (let ((frame (parms->frame parms)))
-      (let ((nb-vars (length frame))
-            (code (comp-body (cddr expr) (push-frame frame env))))
-        (if (rest-param? parms)
-          (gen-lambda-rest nb-vars code)
-          (gen-lambda nb-vars code))))))
-
-(define (parms->frame parms)
-  (cond ((null? parms)
-         '())
-        ((pair? parms)
-         (let ((x (car parms)))
-           (variable x)
-           (cons x (parms->frame (cdr parms)))))
-        (else
-         (variable parms)
-         (list parms))))
-
-(define (rest-param? parms)
-  (cond ((pair? parms)
-         (rest-param? (cdr parms)))
-        ((null? parms)
-         #f)
-        (else
-         #t)))
-
-(define (comp-body body env)
-
-  (define (letrec-defines vars vals body env)
-    (if (pair? body)
-
-      (let ((expr (car body)))
-        (cond ((not (pair? expr))
-               (letrec-defines* vars vals body env))
-              ((macro?2 (car expr) env)
-               (letrec-defines vars
-                               vals
-                               (cons (macro-expand expr env) (cdr body))
-                               env))
-              (else
-               (cond
-                 ((eq? (car expr) 'begin)
-                  (letrec-defines vars
-                                  vals
-                                  (append (cdr expr) (cdr body))
-                                  env))
-                 ((eq? (car expr) 'define)
-                  (let ((x (definition-name expr)))
-                    (variable x)
-                    (letrec-defines (cons x vars)
-                                    (cons (definition-value expr) vals)
-                                    (cdr body)
-                                    env)))
-                 ((eq? (car expr) 'define-macro)
-                  (let ((x (definition-name expr)))
-                    (letrec-defines vars
-                                    vals
-                                    (cdr body)
-                                    (push-macro
-                                      x
-                                      (scheme-eval (definition-value expr))
-                                      env))))
-                 (else
-                  (letrec-defines* vars vals body env))))))
-
-      (scheme-error "Body must contain at least one evaluable expression")))
-
-  (define (letrec-defines* vars vals body env)
-    (if (null? vars)
-      (comp-sequence body env)
-      (comp-letrec-aux vars vals body env)))
-
-  (letrec-defines '() '() body env))
-
-(define (definition-name expr)
-  (shape expr 3)
-  (let ((pattern (cadr expr)))
-    (let ((name (if (pair? pattern) (car pattern) pattern)))
-      (if (not (symbol? name))
-        (scheme-error "Identifier expected" name))
-      name)))
-
-(define (definition-value expr)
-  (let ((pattern (cadr expr)))
-    (if (pair? pattern)
-      (cons 'lambda (cons (cdr pattern) (cddr expr)))
-      (caddr expr))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-if expr env)
-  (shape expr 3)
-  (let ((code1 (scheme-comp (cadr expr) env))
-        (code2 (scheme-comp (caddr expr) env)))
-    (if (pair? (cdddr expr))
-      (gen-if code1 code2 (scheme-comp (cadddr expr) env))
-      (gen-when code1 code2))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-cond expr env)
-  (comp-cond-aux (cdr expr) env))
-
-(define (comp-cond-aux clauses env)
-  (if (pair? clauses)
-    (let ((clause (car clauses)))
-      (shape clause 1)
-      (cond ((eq? (car clause) 'else)
-             (shape clause 2)
-             (comp-sequence (cdr clause) env))
-            ((not (pair? (cdr clause)))
-             (gen-or (scheme-comp (car clause) env)
-                     (comp-cond-aux (cdr clauses) env)))
-            ((eq? (cadr clause) '=>)
-             (shape clause 3)
-             (gen-cond-send (scheme-comp (car clause) env)
-                            (scheme-comp (caddr clause) env)
-                            (comp-cond-aux (cdr clauses) env)))
-            (else
-             (gen-if (scheme-comp (car clause) env)
-                     (comp-sequence (cdr clause) env)
-                     (comp-cond-aux (cdr clauses) env)))))
-    (gen-cst '())))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-and expr env)
-  (let ((rest (cdr expr)))
-    (if (pair? rest) (comp-and-aux rest env) (gen-cst #t))))
-
-(define (comp-and-aux l env)
-  (let ((code (scheme-comp (car l) env))
-        (rest (cdr l)))
-    (if (pair? rest) (gen-and code (comp-and-aux rest env)) code)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-or expr env)
-  (let ((rest (cdr expr)))
-    (if (pair? rest) (comp-or-aux rest env) (gen-cst #f))))
-
-(define (comp-or-aux l env)
-  (let ((code (scheme-comp (car l) env))
-        (rest (cdr l)))
-    (if (pair? rest) (gen-or code (comp-or-aux rest env)) code)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-case expr env)
-  (shape expr 3)
-  (gen-case (scheme-comp (cadr expr) env)
-            (comp-case-aux (cddr expr) env)))
-
-(define (comp-case-aux clauses env)
-  (if (pair? clauses)
-    (let ((clause (car clauses)))
-      (shape clause 2)
-      (if (eq? (car clause) 'else)
-        (gen-case-else (comp-sequence (cdr clause) env))
-        (gen-case-clause (car clause)
-                         (comp-sequence (cdr clause) env)
-                         (comp-case-aux (cdr clauses) env))))
-    (gen-case-else (gen-cst '()))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-let expr env)
-  (shape expr 3)
-  (let ((x (cadr expr)))
-    (cond ((symbol? x)
-           (shape expr 4)
-           (let ((y (caddr expr)))
-             (let ((proc (cons 'lambda (cons (bindings->vars y) (cdddr expr)))))
-               (scheme-comp (cons (list 'letrec (list (list x proc)) x)
-                                  (bindings->vals y))
-                            env))))
-          ((pair? x)
-           (scheme-comp (cons (cons 'lambda (cons (bindings->vars x) (cddr expr)))
-                              (bindings->vals x))
-                        env))
-          (else
-           (comp-body (cddr expr) env)))))
-
-(define (bindings->vars bindings)
-  (if (pair? bindings)
-    (let ((binding (car bindings)))
-      (shape binding 2)
-      (let ((x (car binding)))
-        (variable x)
-        (cons x (bindings->vars (cdr bindings)))))
-    '()))
-
-(define (bindings->vals bindings)
-  (if (pair? bindings)
-    (let ((binding (car bindings)))
-      (cons (cadr binding) (bindings->vals (cdr bindings))))
-    '()))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-let* expr env)
-  (shape expr 3)
-  (let ((bindings (cadr expr)))
-    (if (pair? bindings)
-      (scheme-comp (list 'let
-                         (list (car bindings))
-                         (cons 'let* (cons (cdr bindings) (cddr expr))))
-                   env)
-      (comp-body (cddr expr) env))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-letrec expr env)
-  (shape expr 3)
-  (let ((bindings (cadr expr)))
-    (comp-letrec-aux (bindings->vars bindings)
-                     (bindings->vals bindings)
-                     (cddr expr)
-                     env)))
-
-(define (comp-letrec-aux vars vals body env)
-  (if (pair? vars)
-    (let ((new-env (push-frame vars env)))
-      (gen-letrec (comp-vals vals new-env)
-                  (comp-body body new-env)))
-    (comp-body body env)))
-
-(define (comp-vals l env)
-  (if (pair? l)
-    (cons (scheme-comp (car l) env) (comp-vals (cdr l) env))
-    '()))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-begin expr env)
-  (shape expr 2)
-  (comp-sequence (cdr expr) env))
-
-(define (comp-sequence exprs env)
-  (if (pair? exprs)
-    (comp-sequence-aux exprs env)
-    (gen-cst '())))
-
-(define (comp-sequence-aux exprs env)
-  (let ((code (scheme-comp (car exprs) env))
-        (rest (cdr exprs)))
-    (if (pair? rest) (gen-sequence code (comp-sequence-aux rest env)) code)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-do expr env)
-  (shape expr 3)
-  (let ((bindings (cadr expr))
-        (exit (caddr expr)))
-    (shape exit 1)
-    (let* ((vars (bindings->vars bindings))
-           (new-env1 (push-frame '(#f) env))
-           (new-env2 (push-frame vars new-env1)))
-      (gen-letrec
-        (list
-          (gen-lambda
-            (length vars)
-            (gen-if
-              (scheme-comp (car exit) new-env2)
-              (comp-sequence (cdr exit) new-env2)
-              (gen-sequence
-                (comp-sequence (cdddr expr) new-env2)
-                (gen-combination
-                  (gen-var-ref '(1 . 1))
-                  (comp-vals (bindings->steps bindings) new-env2))))))
-        (gen-combination
-          (gen-var-ref '(0 . 1))
-          (comp-vals (bindings->vals bindings) new-env1))))))
-
-(define (bindings->steps bindings)
-  (if (pair? bindings)
-    (let ((binding (car bindings)))
-      (cons (if (pair? (cddr binding)) (caddr binding) (car binding))
-            (bindings->steps (cdr bindings))))
-    '()))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-define expr env)
-  (shape expr 3)
-  (let ((pattern (cadr expr)))
-    (let ((x (if (pair? pattern) (car pattern) pattern)))
-      (variable x)
-      (gen-sequence
-        (gen-var-set (lookup-var x env)
-                     (scheme-comp (if (pair? pattern)
-                                    (cons 'lambda (cons (cdr pattern) (cddr expr)))
-                                    (caddr expr))
-                                  env))
-        (gen-cst x)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-define-macro expr env)
-  (let ((x (definition-name expr)))
-    (gen-macro x (scheme-eval (definition-value expr)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (comp-combination expr env)
-  (gen-combination (scheme-comp (car expr) env) (comp-vals (cdr expr) env)))
-
-;------------------------------------------------------------------------------
-
-(define (gen-var-ref var)
-  (if (pair? var)
-    (gen-rte-ref (car var) (cdr var))
-    (gen-glo-ref (scheme-global-var var))))
-
-(define (gen-rte-ref up over)
-  (case up
-    ((0)  (gen-slot-ref-0 over))
-    ((1)  (gen-slot-ref-1 over))
-    (else (gen-slot-ref-up-2 (gen-rte-ref (- up 2) over)))))
-
-(define (gen-slot-ref-0 i)
-  (case i
-    ((0)  (lambda (rte) (vector-ref rte 0)))
-    ((1)  (lambda (rte) (vector-ref rte 1)))
-    ((2)  (lambda (rte) (vector-ref rte 2)))
-    ((3)  (lambda (rte) (vector-ref rte 3)))
-    (else (lambda (rte) (vector-ref rte i)))))
-
-(define (gen-slot-ref-1 i)
-  (case i
-    ((0)  (lambda (rte) (vector-ref (vector-ref rte 0) 0)))
-    ((1)  (lambda (rte) (vector-ref (vector-ref rte 0) 1)))
-    ((2)  (lambda (rte) (vector-ref (vector-ref rte 0) 2)))
-    ((3)  (lambda (rte) (vector-ref (vector-ref rte 0) 3)))
-    (else (lambda (rte) (vector-ref (vector-ref rte 0) i)))))
-
-(define (gen-slot-ref-up-2 code)
-  (lambda (rte) (code (vector-ref (vector-ref rte 0) 0))))
-
-(define (gen-glo-ref i)
-  (lambda (rte) (scheme-global-var-ref i)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-cst val)
-  (case val
-    ((()) (lambda (rte) '()))
-    ((#f) (lambda (rte) #f))
-    ((#t) (lambda (rte) #t))
-    ((-2) (lambda (rte) -2))
-    ((-1) (lambda (rte) -1))
-    ((0)  (lambda (rte) 0))
-    ((1)  (lambda (rte) 1))
-    ((2)  (lambda (rte) 2))
-    (else (lambda (rte) val))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-append-form code1 code2)
-  (lambda (rte) (append (code1 rte) (code2 rte))))
-
-(define (gen-cons-form code1 code2)
-  (lambda (rte) (cons (code1 rte) (code2 rte))))
-
-(define (gen-vector-form code)
-  (lambda (rte) (lst->vector (code rte))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-var-set var code)
-  (if (pair? var)
-    (gen-rte-set (car var) (cdr var) code)
-    (gen-glo-set (scheme-global-var var) code)))
-
-(define (gen-rte-set up over code)
-  (case up
-    ((0)  (gen-slot-set-0 over code))
-    ((1)  (gen-slot-set-1 over code))
-    (else (gen-slot-set-n (gen-rte-ref (- up 2) 0) over code))))
-
-(define (gen-slot-set-0 i code)
-  (case i
-    ((0)  (lambda (rte) (vector-set! rte 0 (code rte))))
-    ((1)  (lambda (rte) (vector-set! rte 1 (code rte))))
-    ((2)  (lambda (rte) (vector-set! rte 2 (code rte))))
-    ((3)  (lambda (rte) (vector-set! rte 3 (code rte))))
-    (else (lambda (rte) (vector-set! rte i (code rte))))))
-
-(define (gen-slot-set-1 i code)
-  (case i
-    ((0)  (lambda (rte) (vector-set! (vector-ref rte 0) 0 (code rte))))
-    ((1)  (lambda (rte) (vector-set! (vector-ref rte 0) 1 (code rte))))
-    ((2)  (lambda (rte) (vector-set! (vector-ref rte 0) 2 (code rte))))
-    ((3)  (lambda (rte) (vector-set! (vector-ref rte 0) 3 (code rte))))
-    (else (lambda (rte) (vector-set! (vector-ref rte 0) i (code rte))))))
-
-(define (gen-slot-set-n up i code)
-  (case i
-    ((0)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 0 (code rte))))
-    ((1)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 1 (code rte))))
-    ((2)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 2 (code rte))))
-    ((3)  (lambda (rte) (vector-set! (up (vector-ref rte 0)) 3 (code rte))))
-    (else (lambda (rte) (vector-set! (up (vector-ref rte 0)) i (code rte))))))
-
-(define (gen-glo-set i code)
-  (lambda (rte) (scheme-global-var-set! i (code rte))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-lambda-rest nb-vars body)
-  (case nb-vars
-    ((1)  (gen-lambda-1-rest body))
-    ((2)  (gen-lambda-2-rest body))
-    ((3)  (gen-lambda-3-rest body))
-    (else (gen-lambda-n-rest nb-vars body))))
-
-(define (gen-lambda-1-rest body)
-  (lambda (rte)
-    (lambda a
-      (body (vector rte a)))))
-
-(define (gen-lambda-2-rest body)
-  (lambda (rte)
-    (lambda (a . b)
-      (body (vector rte a b)))))
-
-(define (gen-lambda-3-rest body)
-  (lambda (rte)
-    (lambda (a b . c)
-      (body (vector rte a b c)))))
-
-(define (gen-lambda-n-rest nb-vars body)
-  (lambda (rte)
-    (lambda (a b c . d)
-      (let ((x (make-vector (+ nb-vars 1))))
-        (vector-set! x 0 rte)
-        (vector-set! x 1 a)
-        (vector-set! x 2 b)
-        (vector-set! x 3 c)
-        (let loop ((n nb-vars) (x x) (i 4) (l d))
-          (if (< i n)
-            (begin (vector-set! x i (car l)) (loop n x (+ i 1) (cdr l)))
-            (vector-set! x i l)))
-        (body x)))))
-
-(define (gen-lambda nb-vars body)
-  (case nb-vars
-    ((0)  (gen-lambda-0 body))
-    ((1)  (gen-lambda-1 body))
-    ((2)  (gen-lambda-2 body))
-    ((3)  (gen-lambda-3 body))
-    (else (gen-lambda-n nb-vars body))))
-
-(define (gen-lambda-0 body)
-  (lambda (rte)
-    (lambda ()
-      (body rte))))
-
-(define (gen-lambda-1 body)
-  (lambda (rte)
-    (lambda (a)
-      (body (vector rte a)))))
-
-(define (gen-lambda-2 body)
-  (lambda (rte)
-    (lambda (a b)
-      (body (vector rte a b)))))
-
-(define (gen-lambda-3 body)
-  (lambda (rte)
-    (lambda (a b c)
-      (body (vector rte a b c)))))
-
-(define (gen-lambda-n nb-vars body)
-  (lambda (rte)
-    (lambda (a b c . d)
-      (let ((x (make-vector (+ nb-vars 1))))
-        (vector-set! x 0 rte)
-        (vector-set! x 1 a)
-        (vector-set! x 2 b)
-        (vector-set! x 3 c)
-        (let loop ((n nb-vars) (x x) (i 4) (l d))
-          (if (<= i n)
-            (begin (vector-set! x i (car l)) (loop n x (+ i 1) (cdr l)))))
-        (body x)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-sequence code1 code2)
-  (lambda (rte) (code1 rte) (code2 rte)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-when code1 code2)
-  (lambda (rte)
-    (if (code1 rte)
-      (code2 rte)
-      '())))
-
-(define (gen-if code1 code2 code3)
-  (lambda (rte)
-    (if (code1 rte)
-      (code2 rte)
-      (code3 rte))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-cond-send code1 code2 code3)
-  (lambda (rte)
-    (let ((temp (code1 rte)))
-      (if temp
-        ((code2 rte) temp)
-        (code3 rte)))))
-              
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-and code1 code2)
-  (lambda (rte)
-    (let ((temp (code1 rte)))
-      (if temp
-        (code2 rte)
-        temp))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-or code1 code2)
-  (lambda (rte)
-    (let ((temp (code1 rte)))
-      (if temp
-        temp
-        (code2 rte)))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-case code1 code2)
-  (lambda (rte) (code2 rte (code1 rte))))
-
-(define (gen-case-clause datums code1 code2)
-  (lambda (rte key) (if (memv key datums) (code1 rte) (code2 rte key))))
-
-(define (gen-case-else code)
-  (lambda (rte key) (code rte)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-letrec vals body)
-  (let ((nb-vals (length vals)))
-    (case nb-vals
-      ((1)  (gen-letrec-1 (car vals) body))
-      ((2)  (gen-letrec-2 (car vals) (cadr vals) body))
-      ((3)  (gen-letrec-3 (car vals) (cadr vals) (caddr vals) body))
-      (else (gen-letrec-n nb-vals vals body)))))
-
-(define (gen-letrec-1 val1 body)
-  (lambda (rte)
-    (let ((x (vector rte #f)))
-      (vector-set! x 1 (val1 x))
-      (body x))))
-
-(define (gen-letrec-2 val1 val2 body)
-  (lambda (rte)
-    (let ((x (vector rte #f #f)))
-      (vector-set! x 1 (val1 x))
-      (vector-set! x 2 (val2 x))
-      (body x))))
-
-(define (gen-letrec-3 val1 val2 val3 body)
-  (lambda (rte)
-    (let ((x (vector rte #f #f #f)))
-      (vector-set! x 1 (val1 x))
-      (vector-set! x 2 (val2 x))
-      (vector-set! x 3 (val3 x))
-      (body x))))
-
-(define (gen-letrec-n nb-vals vals body)
-  (lambda (rte)
-    (let ((x (make-vector (+ nb-vals 1))))
-      (vector-set! x 0 rte)
-      (let loop ((x x) (i 1) (l vals))
-        (if (pair? l)
-          (begin (vector-set! x i ((car l) x)) (loop x (+ i 1) (cdr l)))))
-      (body x))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-macro name proc)
-  (lambda (rte) (scheme-add-macro name proc)))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (gen-combination oper args)
-  (case (length args)
-    ((0)  (gen-combination-0 oper))
-    ((1)  (gen-combination-1 oper (car args)))
-    ((2)  (gen-combination-2 oper (car args) (cadr args)))
-    ((3)  (gen-combination-3 oper (car args) (cadr args) (caddr args)))
-    (else (gen-combination-n oper args))))
-
-(define (gen-combination-0 oper)
-  (lambda (rte) ((oper rte))))
-
-(define (gen-combination-1 oper arg1)
-  (lambda (rte) ((oper rte) (arg1 rte))))
-
-(define (gen-combination-2 oper arg1 arg2)
-  (lambda (rte) ((oper rte) (arg1 rte) (arg2 rte))))
-
-(define (gen-combination-3 oper arg1 arg2 arg3)
-  (lambda (rte) ((oper rte) (arg1 rte) (arg2 rte) (arg3 rte))))
-
-(define (gen-combination-n oper args)
-  (lambda (rte)
-    (define (evaluate l rte)
-      (if (pair? l)
-        (cons ((car l) rte) (evaluate (cdr l) rte))
-        '()))
-    (apply (oper rte) (evaluate args rte))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (scheme-comp expr env)
-  (cond ((symbol? expr)
-         (comp-var expr env))
-        ((not (pair? expr))
-         (comp-self-eval expr env))
-        ((macro?2 (car expr) env)
-         (scheme-comp (macro-expand expr env) env))
-        (else
-         (cond
-           ((eq? (car expr) 'quote)            (comp-quote expr env))
-           ((eq? (car expr) 'quasiquote)       (comp-quasiquote expr env))
-           ((eq? (car expr) 'unquote)          (comp-unquote expr env))
-           ((eq? (car expr) 'unquote-splicing) (comp-unquote-splicing expr env))
-           ((eq? (car expr) 'set!)             (comp-set! expr env))
-           ((eq? (car expr) 'lambda)           (comp-lambda expr env))
-           ((eq? (car expr) 'if)               (comp-if expr env))
-           ((eq? (car expr) 'cond)             (comp-cond expr env))
-           ((eq? (car expr) 'and)              (comp-and expr env))
-           ((eq? (car expr) 'or)               (comp-or expr env))
-           ((eq? (car expr) 'case)             (comp-case expr env))
-           ((eq? (car expr) 'let)              (comp-let expr env))
-           ((eq? (car expr) 'let*)             (comp-let* expr env))
-           ((eq? (car expr) 'letrec)           (comp-letrec expr env))
-           ((eq? (car expr) 'begin)            (comp-begin expr env))
-           ((eq? (car expr) 'do)               (comp-do expr env))
-           ((eq? (car expr) 'define)           (comp-define expr env))
-           ((eq? (car expr) 'define-macro)     (comp-define-macro expr env))
-           (else                               (comp-combination expr env))))))
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (scheme-global-var name)
-  (let ((x (assq name scheme-global-variables)))
-    (if x
-      x
-      (let ((y (cons name '())))
-        (set! scheme-global-variables (cons y scheme-global-variables))
-        y))))
-
-(define (scheme-global-var-ref i)
-  (cdr i))
-
-(define (scheme-global-var-set! i val)
-  (set-cdr! i val)
-  '())
-
-(define scheme-global-variables '())
-
-(define (def-proc name value)
-  (scheme-global-var-set!
-    (scheme-global-var name)
-    value))
-
-(def-proc 'not                            (lambda (x) (not x)))
-(def-proc 'boolean?                       boolean?)
-(def-proc 'eqv?                           eqv?)
-(def-proc 'eq?                            eq?)
-(def-proc 'equal?                         equal?)
-(def-proc 'pair?                          pair?)
-(def-proc 'cons                           cons)
-(def-proc 'car                            (lambda (x) (car x)))
-(def-proc 'cdr                            (lambda (x) (cdr x)))
-(def-proc 'set-car!                       set-car!)
-(def-proc 'set-cdr!                       set-cdr!)
-(def-proc 'caar                           caar)
-(def-proc 'cadr                           cadr)
-(def-proc 'cdar                           cdar)
-(def-proc 'cddr                           cddr)
-(def-proc 'caaar                          caaar)
-(def-proc 'caadr                          caadr)
-(def-proc 'cadar                          cadar)
-(def-proc 'caddr                          caddr)
-(def-proc 'cdaar                          cdaar)
-(def-proc 'cdadr                          cdadr)
-(def-proc 'cddar                          cddar)
-(def-proc 'cdddr                          cdddr)
-(def-proc 'caaaar                         caaaar)
-(def-proc 'caaadr                         caaadr)
-(def-proc 'caadar                         caadar)
-(def-proc 'caaddr                         caaddr)
-(def-proc 'cadaar                         cadaar)
-(def-proc 'cadadr                         cadadr)
-(def-proc 'caddar                         caddar)
-(def-proc 'cadddr                         cadddr)
-(def-proc 'cdaaar                         cdaaar)
-(def-proc 'cdaadr                         cdaadr)
-(def-proc 'cdadar                         cdadar)
-(def-proc 'cdaddr                         cdaddr)
-(def-proc 'cddaar                         cddaar)
-(def-proc 'cddadr                         cddadr)
-(def-proc 'cdddar                         cdddar)
-(def-proc 'cddddr                         cddddr)
-(def-proc 'null?                          (lambda (x) (null? x)))
-(def-proc 'list?                          list?)
-(def-proc 'list                           list)
-(def-proc 'length                         length)
-(def-proc 'append                         append)
-(def-proc 'reverse                        reverse)
-(def-proc 'list-ref                       list-ref)
-(def-proc 'memq                           memq)
-(def-proc 'memv                           memv)
-(def-proc 'member                         member)
-(def-proc 'assq                           assq)
-(def-proc 'assv                           assv)
-(def-proc 'assoc                          assoc)
-(def-proc 'symbol?                        symbol?)
-(def-proc 'symbol->string                 symbol->string)
-(def-proc 'string->symbol                 string->symbol)
-(def-proc 'number?                        number?)
-(def-proc 'complex?                       complex?)
-(def-proc 'real?                          real?)
-(def-proc 'rational?                      rational?)
-(def-proc 'integer?                       integer?)
-(def-proc 'exact?                         exact?)
-(def-proc 'inexact?                       inexact?)
-;(def-proc '=                              =)
-;(def-proc '<                              <)
-;(def-proc '>                              >)
-;(def-proc '<=                             <=)
-;(def-proc '>=                             >=)
-;(def-proc 'zero?                          zero?)
-;(def-proc 'positive?                      positive?)
-;(def-proc 'negative?                      negative?)
-;(def-proc 'odd?                           odd?)
-;(def-proc 'even?                          even?)
-(def-proc 'max                            max)
-(def-proc 'min                            min)
-;(def-proc '+                              +)
-;(def-proc '*                              *)
-;(def-proc '-                              -)
-(def-proc '/                              /)
-(def-proc 'abs                            abs)
-;(def-proc 'quotient                       quotient)
-;(def-proc 'remainder                      remainder)
-;(def-proc 'modulo                         modulo)
-(def-proc 'gcd                            gcd)
-(def-proc 'lcm                            lcm)
-;(def-proc 'numerator                      numerator)
-;(def-proc 'denominator                    denominator)
-(def-proc 'floor                          floor)
-(def-proc 'ceiling                        ceiling)
-(def-proc 'truncate                       truncate)
-(def-proc 'round                          round)
-;(def-proc 'rationalize                    rationalize)
-(def-proc 'exp                            exp)
-(def-proc 'log                            log)
-(def-proc 'sin                            sin)
-(def-proc 'cos                            cos)
-(def-proc 'tan                            tan)
-(def-proc 'asin                           asin)
-(def-proc 'acos                           acos)
-(def-proc 'atan                           atan)
-(def-proc 'sqrt                           sqrt)
-(def-proc 'expt                           expt)
-;(def-proc 'make-rectangular               make-rectangular)
-;(def-proc 'make-polar                     make-polar)
-;(def-proc 'real-part                      real-part)
-;(def-proc 'imag-part                      imag-part)
-;(def-proc 'magnitude                      magnitude)
-;(def-proc 'angle                          angle)
-(def-proc 'exact->inexact                 exact->inexact)
-(def-proc 'inexact->exact                 inexact->exact)
-(def-proc 'number->string                 number->string)
-(def-proc 'string->number                 string->number)
-(def-proc 'char?                          char?)
-(def-proc 'char=?                         char=?)
-(def-proc 'char<?                         char<?)
-(def-proc 'char>?                         char>?)
-(def-proc 'char<=?                        char<=?)
-(def-proc 'char>=?                        char>=?)
-(def-proc 'char-ci=?                      char-ci=?)
-(def-proc 'char-ci<?                      char-ci<?)
-(def-proc 'char-ci>?                      char-ci>?)
-(def-proc 'char-ci<=?                     char-ci<=?)
-(def-proc 'char-ci>=?                     char-ci>=?)
-(def-proc 'char-alphabetic?               char-alphabetic?)
-(def-proc 'char-numeric?                  char-numeric?)
-(def-proc 'char-whitespace?               char-whitespace?)
-(def-proc 'char-lower-case?               char-lower-case?)
-(def-proc 'char->integer                  char->integer)
-(def-proc 'integer->char                  integer->char)
-(def-proc 'char-upcase                    char-upcase)
-(def-proc 'char-downcase                  char-downcase)
-(def-proc 'string?                        string?)
-(def-proc 'make-string                    make-string)
-(def-proc 'string                         string)
-(def-proc 'string-length                  string-length)
-(def-proc 'string-ref                     string-ref)
-(def-proc 'string-set!                    string-set!)
-(def-proc 'string=?                       string=?)
-(def-proc 'string<?                       string<?)
-(def-proc 'string>?                       string>?)
-(def-proc 'string<=?                      string<=?)
-(def-proc 'string>=?                      string>=?)
-(def-proc 'string-ci=?                    string-ci=?)
-(def-proc 'string-ci<?                    string-ci<?)
-(def-proc 'string-ci>?                    string-ci>?)
-(def-proc 'string-ci<=?                   string-ci<=?)
-(def-proc 'string-ci>=?                   string-ci>=?)
-(def-proc 'substring                      substring)
-(def-proc 'string-append                  string-append)
-(def-proc 'vector?                        vector?)
-(def-proc 'make-vector                    make-vector)
-(def-proc 'vector                         vector)
-(def-proc 'vector-length                  vector-length)
-(def-proc 'vector-ref                     vector-ref)
-(def-proc 'vector-set!                    vector-set!)
-(def-proc 'procedure?                     procedure?)
-(def-proc 'apply                          apply)
-(def-proc 'map                            map)
-(def-proc 'for-each                       for-each)
-(def-proc 'call-with-current-continuation call-with-current-continuation)
-(def-proc 'call-with-input-file           call-with-input-file)
-(def-proc 'call-with-output-file          call-with-output-file)
-(def-proc 'input-port?                    input-port?)
-(def-proc 'output-port?                   output-port?)
-(def-proc 'current-input-port             current-input-port)
-(def-proc 'current-output-port            current-output-port)
-(def-proc 'open-input-file                open-input-file)
-(def-proc 'open-output-file               open-output-file)
-(def-proc 'close-input-port               close-input-port)
-(def-proc 'close-output-port              close-output-port)
-(def-proc 'eof-object?                    eof-object?)
-(def-proc 'read                           read)
-(def-proc 'read-char                      read-char)
-(def-proc 'peek-char                      peek-char)
-(def-proc 'write                          write)
-(def-proc 'display                        display)
-(def-proc 'newline                        newline)
-(def-proc 'write-char                     write-char)
-
-; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-(define (run)
-  (let ((result #f))
-    (do ((i 100 (- i 1)))
-	((zero? i) result)
-      (set! result
-	(scheme-eval
-	 '(let ()
-
-	    (define (sort-list obj pred)
-
-	      (define (loop l)
-		(if (and (pair? l) (pair? (cdr l)))
-		    (split l '() '())
-		    l))
-
-	      (define (split l one two)
-		(if (pair? l)
-		    (split (cdr l) two (cons (car l) one))
-		    (merge (loop one) (loop two))))
-
-	      (define (merge one two)
-		(cond ((null? one) two)
-		      ((pred (car two) (car one))
-		       (cons (car two)
-			     (merge (cdr two) one)))
-		      (else
-		       (cons (car one)
-			     (merge (cdr one) two)))))
-
-	      (loop obj))
-
-	    (sort-list '("one" "two" "three" "four" "five" "six"
-			 "seven" "eight" "nine" "ten" "eleven" "twelve")
-		       string<?)))))))
-
-(let ((r (time (run))))
-  (if (not (equal? r '("eight" "eleven" "five" "four" "nine" "one" "seven" "six" "ten" "three" "twelve" "two")))
-      (error "wrong result" r) ) )
-
diff --git a/benchmarks/tak.scm b/benchmarks/tak.scm
deleted file mode 100644
index 48d2e40d..00000000
--- a/benchmarks/tak.scm
+++ /dev/null
@@ -1,11 +0,0 @@
-;;;; tak.scm
-
-
-(define (tak x y z)
-  (if (not (< y x))
-      z
-      (tak (tak (- x 1) y z)
-	   (tak (- y 1) z x)
-	   (tak (- z 1) x y) ) ) )
-
-(time (do ((i 100 (- i 1))) ((zero? i)) (tak 18 12 6)))
diff --git a/benchmarks/takl.scm b/benchmarks/takl.scm
deleted file mode 100644
index e467756a..00000000
--- a/benchmarks/takl.scm
+++ /dev/null
@@ -1,30 +0,0 @@
-;;;; takl.scm
-
- 
-(define (listn n)
-  (if (= 0 n)
-      '()
-      (cons n (listn (- n 1)))) )
- 
-(define 18l (listn 18))
-(define 12l (listn 12))
-(define  6l (listn 6))
- 
-(define (mas x y z)
-  (if (not (shorterp y x))
-      z
-      (mas (mas (cdr x)
-		y z)
-	   (mas (cdr y)
-		z x)
-	   (mas (cdr z)
-		x y))))
- 
-(define (shorterp x y)
-  (and (pair? y)
-       (or (null? x)
-	   (shorterp (cdr x)
-		     (cdr y)))) )
- 
-(time (do ((i 10 (- i 1))) ((zero? i)) (mas 18l 12l 6l)))
-
diff --git a/benchmarks/takr.scm b/benchmarks/takr.scm
deleted file mode 100644
index 7f378f82..00000000
--- a/benchmarks/takr.scm
+++ /dev/null
@@ -1,507 +0,0 @@
-;;; takr.scm
-
-
-(define (tak0 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak1 (tak37 (- x 1) y z)
-                 (tak11 (- y 1) z x)
-                 (tak17 (- z 1) x y)))))
-(define (tak1 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak2 (tak74 (- x 1) y z)
-                 (tak22 (- y 1) z x)
-                 (tak34 (- z 1) x y)))))
-(define (tak2 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak3 (tak11 (- x 1) y z)
-                 (tak33 (- y 1) z x)
-                 (tak51 (- z 1) x y)))))
-(define (tak3 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak4 (tak48 (- x 1) y z)
-                 (tak44 (- y 1) z x)
-                 (tak68 (- z 1) x y)))))
-(define (tak4 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak5 (tak85 (- x 1) y z)
-                 (tak55 (- y 1) z x)
-                 (tak85 (- z 1) x y)))))
-(define (tak5 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak6 (tak22 (- x 1) y z)
-                 (tak66 (- y 1) z x)
-                 (tak2 (- z 1) x y)))))
-(define (tak6 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak7 (tak59 (- x 1) y z)
-                 (tak77 (- y 1) z x)
-                 (tak19 (- z 1) x y)))))
-(define (tak7 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak8 (tak96 (- x 1) y z)
-                 (tak88 (- y 1) z x)
-                 (tak36 (- z 1) x y)))))
-(define (tak8 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak9 (tak33 (- x 1) y z)
-                 (tak99 (- y 1) z x)
-                 (tak53 (- z 1) x y)))))
-(define (tak9 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak10 (tak70 (- x 1) y z)
-                  (tak10 (- y 1) z x)
-                  (tak70 (- z 1) x y)))))
-(define (tak10 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak11 (tak7 (- x 1) y z)
-                  (tak21 (- y 1) z x)
-                  (tak87 (- z 1) x y)))))
-(define (tak11 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak12 (tak44 (- x 1) y z)
-                  (tak32 (- y 1) z x)
-                  (tak4 (- z 1) x y)))))
-(define (tak12 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak13 (tak81 (- x 1) y z)
-                  (tak43 (- y 1) z x)
-                  (tak21 (- z 1) x y)))))
- 
-(define (tak13 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak14 (tak18 (- x 1) y z)
-                  (tak54 (- y 1) z x)
-                  (tak38 (- z 1) x y)))))
-(define (tak14 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak15 (tak55 (- x 1) y z)
-                  (tak65 (- y 1) z x)
-                  (tak55 (- z 1) x y)))))
-(define (tak15 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak16 (tak92 (- x 1) y z)
-                  (tak76 (- y 1) z x)
-                  (tak72 (- z 1) x y)))))
-(define (tak16 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak17 (tak29 (- x 1) y z)
-                  (tak87 (- y 1) z x)
-                  (tak89 (- z 1) x y)))))
-(define (tak17 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak18 (tak66 (- x 1) y z)
-                  (tak98 (- y 1) z x)
-                  (tak6 (- z 1) x y)))))
-(define (tak18 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak19 (tak3 (- x 1) y z)
-                  (tak9 (- y 1) z x)
-                  (tak23 (- z 1) x y)))))
-(define (tak19 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak20 (tak40 (- x 1) y z)
-                  (tak20 (- y 1) z x)
-                  (tak40 (- z 1) x y)))))
-(define (tak20 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak21 (tak77 (- x 1) y z)
-                  (tak31 (- y 1) z x)
-                  (tak57 (- z 1) x y)))))
-(define (tak21 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak22 (tak14 (- x 1) y z)
-                  (tak42 (- y 1) z x)
-                  (tak74 (- z 1) x y)))))
-(define (tak22 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak23 (tak51 (- x 1) y z)
-                  (tak53 (- y 1) z x)
-                  (tak91 (- z 1) x y)))))
-(define (tak23 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak24 (tak88 (- x 1) y z)
-                  (tak64 (- y 1) z x)
-                  (tak8 (- z 1) x y)))))
-(define (tak24 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak25 (tak25 (- x 1) y z)
-                  (tak75 (- y 1) z x)
-                  (tak25 (- z 1) x y)))))
-(define (tak25 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak26 (tak62 (- x 1) y z)
-                  (tak86 (- y 1) z x)
-                  (tak42 (- z 1) x y)))))
-(define (tak26 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak27 (tak99 (- x 1) y z)
-                  (tak97 (- y 1) z x)
-                  (tak59 (- z 1) x y)))))
-(define (tak27 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak28 (tak36 (- x 1) y z)
-                  (tak8 (- y 1) z x)
-                  (tak76 (- z 1) x y)))))
-(define (tak28 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak29 (tak73 (- x 1) y z)
-                  (tak19 (- y 1) z x)
-                  (tak93 (- z 1) x y)))))
-(define (tak29 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak30 (tak10 (- x 1) y z)
-                  (tak30 (- y 1) z x)
-                  (tak10 (- z 1) x y)))))
-(define (tak30 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak31 (tak47 (- x 1) y z)
-                  (tak41 (- y 1) z x)
-                  (tak27 (- z 1) x y)))))
-(define (tak31 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak32 (tak84 (- x 1) y z)
-                  (tak52 (- y 1) z x)
-                  (tak44 (- z 1) x y)))))
-(define (tak32 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak33 (tak21 (- x 1) y z)
-                  (tak63 (- y 1) z x)
-                  (tak61 (- z 1) x y)))))
-(define (tak33 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak34 (tak58 (- x 1) y z)
-                  (tak74 (- y 1) z x)
-                  (tak78 (- z 1) x y)))))
-(define (tak34 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak35 (tak95 (- x 1) y z)
-                  (tak85 (- y 1) z x)
-                  (tak95 (- z 1) x y)))))
-(define (tak35 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak36 (tak32 (- x 1) y z)
-                  (tak96 (- y 1) z x)
-                  (tak12 (- z 1) x y)))))
-(define (tak36 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak37 (tak69 (- x 1) y z)
-                  (tak7 (- y 1) z x)
-                  (tak29 (- z 1) x y)))))
-(define (tak37 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak38 (tak6 (- x 1) y z)
-                  (tak18 (- y 1) z x)
-                  (tak46 (- z 1) x y)))))
-(define (tak38 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak39 (tak43 (- x 1) y z)
-                  (tak29 (- y 1) z x)
-                  (tak63 (- z 1) x y)))))
-(define (tak39 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak40 (tak80 (- x 1) y z)
-                  (tak40 (- y 1) z x)
-                  (tak80 (- z 1) x y)))))
-(define (tak40 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak41 (tak17 (- x 1) y z)
-                  (tak51 (- y 1) z x)
-                  (tak97 (- z 1) x y)))))
-(define (tak41 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak42 (tak54 (- x 1) y z)
-                  (tak62 (- y 1) z x)
-                  (tak14 (- z 1) x y)))))
-(define (tak42 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak43 (tak91 (- x 1) y z)
-                  (tak73 (- y 1) z x)
-                  (tak31 (- z 1) x y)))))
-(define (tak43 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak44 (tak28 (- x 1) y z)
-                  (tak84 (- y 1) z x)
-                  (tak48 (- z 1) x y)))))
-(define (tak44 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak45 (tak65 (- x 1) y z)
-                  (tak95 (- y 1) z x)
-                  (tak65 (- z 1) x y)))))
-(define (tak45 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak46 (tak2 (- x 1) y z)
-                  (tak6 (- y 1) z x)
-                  (tak82 (- z 1) x y)))))
-(define (tak46 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak47 (tak39 (- x 1) y z)
-                  (tak17 (- y 1) z x)
-                  (tak99 (- z 1) x y)))))
-(define (tak47 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak48 (tak76 (- x 1) y z)
-                  (tak28 (- y 1) z x)
-                  (tak16 (- z 1) x y)))))
-(define (tak48 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak49 (tak13 (- x 1) y z)
-                  (tak39 (- y 1) z x)
-                  (tak33 (- z 1) x y)))))
-(define (tak49 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak50 (tak50 (- x 1) y z)
-                  (tak50 (- y 1) z x)
-                  (tak50 (- z 1) x y)))))
-(define (tak50 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak51 (tak87 (- x 1) y z)
-                  (tak61 (- y 1) z x)
-                  (tak67 (- z 1) x y)))))
-(define (tak51 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak52 (tak24 (- x 1) y z)
-                  (tak72 (- y 1) z x)
-                  (tak84 (- z 1) x y)))))
-(define (tak52 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak53 (tak61 (- x 1) y z)
-                  (tak83 (- y 1) z x)
-                  (tak1 (- z 1) x y)))))
-(define (tak53 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak54 (tak98 (- x 1) y z)
-                  (tak94 (- y 1) z x)
-                  (tak18 (- z 1) x y)))))
-(define (tak54 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak55 (tak35 (- x 1) y z)
-                  (tak5 (- y 1) z x)
-                  (tak35 (- z 1) x y)))))
-(define (tak55 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak56 (tak72 (- x 1) y z)
-                  (tak16 (- y 1) z x)
-                  (tak52 (- z 1) x y)))))
-(define (tak56 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak57 (tak9 (- x 1) y z)
-                  (tak27 (- y 1) z x)
-                  (tak69 (- z 1) x y)))))
-(define (tak57 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak58 (tak46 (- x 1) y z)
-                  (tak38 (- y 1) z x)
-                  (tak86 (- z 1) x y)))))
-(define (tak58 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak59 (tak83 (- x 1) y z)
-                  (tak49 (- y 1) z x)
-                  (tak3 (- z 1) x y)))))
-(define (tak59 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak60 (tak20 (- x 1) y z)
-                  (tak60 (- y 1) z x)
-                  (tak20 (- z 1) x y)))))
-(define (tak60 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak61 (tak57 (- x 1) y z)
-                  (tak71 (- y 1) z x)
-                  (tak37 (- z 1) x y)))))
-(define (tak61 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak62 (tak94 (- x 1) y z)
-                  (tak82 (- y 1) z x)
-                  (tak54 (- z 1) x y)))))
-(define (tak62 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak63 (tak31 (- x 1) y z)
-                  (tak93 (- y 1) z x)
-                  (tak71 (- z 1) x y)))))
-(define (tak63 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak64 (tak68 (- x 1) y z)
-                  (tak4 (- y 1) z x)
-                  (tak88 (- z 1) x y)))))
-(define (tak64 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak65 (tak5 (- x 1) y z)
-                  (tak15 (- y 1) z x)
-                  (tak5 (- z 1) x y)))))
-(define (tak65 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak66 (tak42 (- x 1) y z)
-                  (tak26 (- y 1) z x)
-                  (tak22 (- z 1) x y)))))
-(define (tak66 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak67 (tak79 (- x 1) y z)
-                  (tak37 (- y 1) z x)
-                  (tak39 (- z 1) x y)))))
-(define (tak67 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak68 (tak16 (- x 1) y z)
-                  (tak48 (- y 1) z x)
-                  (tak56 (- z 1) x y)))))
-(define (tak68 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak69 (tak53 (- x 1) y z)
-                  (tak59 (- y 1) z x)
-                  (tak73 (- z 1) x y)))))
-(define (tak69 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak70 (tak90 (- x 1) y z)
-                  (tak70 (- y 1) z x)
-                  (tak90 (- z 1) x y)))))
-(define (tak70 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak71 (tak27 (- x 1) y z)
-                  (tak81 (- y 1) z x)
-                  (tak7 (- z 1) x y)))))
-(define (tak71 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak72 (tak64 (- x 1) y z)
-                  (tak92 (- y 1) z x)
-                  (tak24 (- z 1) x y)))))
-(define (tak72 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak73 (tak1 (- x 1) y z)
-                  (tak3 (- y 1) z x)
-                  (tak41 (- z 1) x y)))))
-(define (tak73 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak74 (tak38 (- x 1) y z)
-                  (tak14 (- y 1) z x)
-                  (tak58 (- z 1) x y)))))
-(define (tak74 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak75 (tak75 (- x 1) y z)
-                  (tak25 (- y 1) z x)
-                  (tak75 (- z 1) x y)))))
-(define (tak75 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak76 (tak12 (- x 1) y z)
-                  (tak36 (- y 1) z x)
-                  (tak92 (- z 1) x y)))))
-(define (tak76 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak77 (tak49 (- x 1) y z)
-                  (tak47 (- y 1) z x)
-                  (tak9 (- z 1) x y)))))
-(define (tak77 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak78 (tak86 (- x 1) y z)
-                  (tak58 (- y 1) z x)
-                  (tak26 (- z 1) x y)))))
-(define (tak78 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak79 (tak23 (- x 1) y z)
-                  (tak69 (- y 1) z x)
-                  (tak43 (- z 1) x y)))))
-(define (tak79 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak80 (tak60 (- x 1) y z)
-                  (tak80 (- y 1) z x)
-                  (tak60 (- z 1) x y)))))
-(define (tak80 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak81 (tak97 (- x 1) y z)
-                  (tak91 (- y 1) z x)
-                  (tak77 (- z 1) x y)))))
-(define (tak81 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak82 (tak34 (- x 1) y z)
-                  (tak2 (- y 1) z x)
-                  (tak94 (- z 1) x y)))))
-(define (tak82 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak83 (tak71 (- x 1) y z)
-                  (tak13 (- y 1) z x)
-                  (tak11 (- z 1) x y)))))
-(define (tak83 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak84 (tak8 (- x 1) y z)
-                  (tak24 (- y 1) z x)
-                  (tak28 (- z 1) x y)))))
-(define (tak84 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak85 (tak45 (- x 1) y z)
-                  (tak35 (- y 1) z x)
-                  (tak45 (- z 1) x y)))))
-(define (tak85 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak86 (tak82 (- x 1) y z)
-                  (tak46 (- y 1) z x)
-                  (tak62 (- z 1) x y)))))
-(define (tak86 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak87 (tak19 (- x 1) y z)
-                  (tak57 (- y 1) z x)
-                  (tak79 (- z 1) x y)))))
-(define (tak87 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak88 (tak56 (- x 1) y z)
-                  (tak68 (- y 1) z x)
-                  (tak96 (- z 1) x y)))))
-(define (tak88 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak89 (tak93 (- x 1) y z)
-                  (tak79 (- y 1) z x)
-                  (tak13 (- z 1) x y)))))
-(define (tak89 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak90 (tak30 (- x 1) y z)
-                  (tak90 (- y 1) z x)
-                  (tak30 (- z 1) x y)))))
-(define (tak90 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak91 (tak67 (- x 1) y z)
-                  (tak1 (- y 1) z x)
-                  (tak47 (- z 1) x y)))))
-(define (tak91 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak92 (tak4 (- x 1) y z)
-                  (tak12 (- y 1) z x)
-                  (tak64 (- z 1) x y)))))
-(define (tak92 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak93 (tak41 (- x 1) y z)
-                  (tak23 (- y 1) z x)
-                  (tak81 (- z 1) x y)))))
-(define (tak93 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak94 (tak78 (- x 1) y z)
-                  (tak34 (- y 1) z x)
-                  (tak98 (- z 1) x y)))))
-(define (tak94 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak95 (tak15 (- x 1) y z)
-                  (tak45 (- y 1) z x)
-                  (tak15 (- z 1) x y)))))
-(define (tak95 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak96 (tak52 (- x 1) y z)
-                  (tak56 (- y 1) z x)
-                  (tak32 (- z 1) x y)))))
-(define (tak96 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak97 (tak89 (- x 1) y z)
-                  (tak67 (- y 1) z x)
-                  (tak49 (- z 1) x y)))))
-(define (tak97 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak98 (tak26 (- x 1) y z)
-                  (tak78 (- y 1) z x)
-                  (tak66 (- z 1) x y)))))
-(define (tak98 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak99 (tak63 (- x 1) y z)
-                  (tak89 (- y 1) z x)
-                  (tak83 (- z 1) x y)))))
-(define (tak99 x y z)
-  (cond ((not (< y x)) z)
-        (else (tak0 (tak0 (- x 1) y z)
-                 (tak0 (- y 1) z x)
-                 (tak0 (- z 1) x y)))))
- 
-(time (do ((i 100 (- i 1))) ((zero? i)) (tak0 18 12 6)))
-
diff --git a/benchmarks/traverse.scm b/benchmarks/traverse.scm
deleted file mode 100644
index fe9d5099..00000000
--- a/benchmarks/traverse.scm
+++ /dev/null
@@ -1,145 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         traverse.sc
-;;; Description:  TRAVERSE benchmark
-;;; Author:       Richard Gabriel
-;;; Created:      12-Apr-85
-;;; Modified:     12-Apr-85 10:24:04 (Bob Shaw)
-;;;               9-Aug-87 (Will Clinger)
-;;;               20-Nov-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; TRAVERSE --  Benchmark which creates and traverses a tree structure.
-
-(define (make-node)
-  (let ((node (make-vector 11 '())))
-   (vector-set! node 0 'node)
-   (vector-set! node 3 (snb))
-   (vector-set! node 4 #f)		;Qobi
-   (vector-set! node 5 #f)		;Qobi
-   (vector-set! node 6 #f)		;Qobi
-   (vector-set! node 7 #f)		;Qobi
-   (vector-set! node 8 #f)		;Qobi
-   (vector-set! node 9 #f)		;Qobi
-   (vector-set! node 10 #f)		;Qobi
-   node))
-
- (define (node-parents node) (vector-ref node 1))
- (define (node-sons node) (vector-ref node 2))
- (define (node-sn node) (vector-ref node 3))
- (define (node-entry1 node) (vector-ref node 4))
- (define (node-entry2 node) (vector-ref node 5))
- (define (node-entry3 node) (vector-ref node 6))
- (define (node-entry4 node) (vector-ref node 7))
- (define (node-entry5 node) (vector-ref node 8))
- (define (node-entry6 node) (vector-ref node 9))
- (define (node-mark node) (vector-ref node 10))
-
- (define (node-parents-set! node v) (vector-set! node 1 v))
- (define (node-sons-set! node v) (vector-set! node 2 v))
- (define (node-sn-set! node v) (vector-set! node 3 v))
- (define (node-entry1-set! node v) (vector-set! node 4 v))
- (define (node-entry2-set! node v) (vector-set! node 5 v))
- (define (node-entry3-set! node v) (vector-set! node 6 v))
- (define (node-entry4-set! node v) (vector-set! node 7 v))
- (define (node-entry5-set! node v) (vector-set! node 8 v))
- (define (node-entry6-set! node v) (vector-set! node 9 v))
- (define (node-mark-set! node v) (vector-set! node 10 v))
-
- (define *sn* 0)
- (define *rand* 21)
- (define *count* 0)
- (define *marker* #f)
- (define *root* '())
-
- (define (snb)
-  (set! *sn* (+ 1 *sn*))
-  *sn*)
-
- (define (seed)
-  (set! *rand* 21)
-  *rand*)
-
- (define (traverse-random)
-  (set! *rand* (remainder (* *rand* 17) 251))
-  *rand*)
-
- (define (traverse-remove n q)
-  (cond ((eq? (cdr (car q)) (car q)) (let ((x (caar q))) (set-car! q '()) x))
-	((zero? n)
-	 (let ((x (caar q)))
-	  (do ((p (car q) (cdr p)))
-	    ((eq? (cdr p) (car q))
-	     (set-cdr! p (cdr (car q)))
-	     (set-car! q p)))
-	  x))
-	(else (do ((n n (- n 1)) (q (car q) (cdr q)) (p (cdr (car q)) (cdr p)))
-		((zero? n) (let ((x (car q))) (set-cdr! q p) x))))))
-
- (define (traverse-select n q)
-  (do ((n n (- n 1)) (q (car q) (cdr q))) ((zero? n) (car q))))
-
- (define (add a q)
-  (cond ((null? q) `(,(let ((x `(,a))) (set-cdr! x x) x)))
-	((null? (car q))
-	 (let ((x `(,a)))
-	  (set-cdr! x x)
-	  (set-car! q x)
-	  q))
-	;; the CL version had a useless set-car! in the next line (wc)
-	(else (set-cdr! (car q) `(,a . ,(cdr (car q)))) q)))
-
- (define (create-structure n)
-  (let ((a `(,(make-node))))
-   (do ((m (- n 1) (- m 1)) (p a))
-     ((zero? m)
-      (set! a `(,(begin (set-cdr! p a) p)))
-      (do ((unused a) (used (add (traverse-remove 0 a) '())) (x 0) (y 0))
-	((null? (car unused)) (find-root (traverse-select 0 used) n))
-       (set! x (traverse-remove (remainder (traverse-random) n) unused))
-       (set! y (traverse-select (remainder (traverse-random) n) used))
-       (add x used)
-       (node-sons-set! y `(,x . ,(node-sons y)))
-       (node-parents-set! x `(,y . ,(node-parents x))) ))
-    (set! a (cons (make-node) a)))))
-
- (define (find-root node n)
-  (do ((n n (- n 1))) ((or (zero? n) (null? (node-parents node))) node)
-   (set! node (car (node-parents node)))))
-
- (define (travers node mark)
-  (cond ((eq? (node-mark node) mark) #f)
-	(else (node-mark-set! node mark)
-	      (set! *count* (+ 1 *count*))
-	      (node-entry1-set! node (not (node-entry1 node)))
-	      (node-entry2-set! node (not (node-entry2 node)))
-	      (node-entry3-set! node (not (node-entry3 node)))
-	      (node-entry4-set! node (not (node-entry4 node)))
-	      (node-entry5-set! node (not (node-entry5 node)))
-	      (node-entry6-set! node (not (node-entry6 node)))
-	      (do ((sons (node-sons node) (cdr sons))) ((null? sons) #f)
-	       (travers (car sons) mark)))))
-
- (define (traverse root)
-  (let ((*count* 0))
-   (travers root (begin (set! *marker* (not *marker*)) *marker*))
-   *count*))
-
- (define (init-traverse)		; Changed from defmacro to defun \bs
-  (set! *root* (create-structure 100))
-  #f)
-
- (define (run-traverse)			; Changed from defmacro to defun \bs
-  (do ((i 50 (- i 1))) ((zero? i))
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)))
-
-(init-traverse)
-
-(time (run-traverse))
diff --git a/benchmarks/travinit.scm b/benchmarks/travinit.scm
deleted file mode 100644
index 7a853bf1..00000000
--- a/benchmarks/travinit.scm
+++ /dev/null
@@ -1,143 +0,0 @@
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;; File:         traverse-init.sc
-;;; Description:  TRAVERSE benchmark
-;;; Author:       Richard Gabriel
-;;; Created:      12-Apr-85
-;;; Modified:     12-Apr-85 10:24:04 (Bob Shaw)
-;;;               9-Aug-87 (Will Clinger)
-;;;               20-Nov-94 (Qobi)
-;;;               31-Mar-98 (Qobi)
-;;;               26-Mar-00 (flw)
-;;; Language:     Scheme
-;;; Status:       Public Domain
-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-;;; TRAVERSE --  Benchmark which creates and traverses a tree structure.
-
-(define (make-node)
-  (let ((node (make-vector 11 '())))
-   (vector-set! node 0 'node)
-   (vector-set! node 3 (snb))
-   (vector-set! node 4 #f)		;Qobi
-   (vector-set! node 5 #f)		;Qobi
-   (vector-set! node 6 #f)		;Qobi
-   (vector-set! node 7 #f)		;Qobi
-   (vector-set! node 8 #f)		;Qobi
-   (vector-set! node 9 #f)		;Qobi
-   (vector-set! node 10 #f)		;Qobi
-   node))
-
- (define (node-parents node) (vector-ref node 1))
- (define (node-sons node) (vector-ref node 2))
- (define (node-sn node) (vector-ref node 3))
- (define (node-entry1 node) (vector-ref node 4))
- (define (node-entry2 node) (vector-ref node 5))
- (define (node-entry3 node) (vector-ref node 6))
- (define (node-entry4 node) (vector-ref node 7))
- (define (node-entry5 node) (vector-ref node 8))
- (define (node-entry6 node) (vector-ref node 9))
- (define (node-mark node) (vector-ref node 10))
-
- (define (node-parents-set! node v) (vector-set! node 1 v))
- (define (node-sons-set! node v) (vector-set! node 2 v))
- (define (node-sn-set! node v) (vector-set! node 3 v))
- (define (node-entry1-set! node v) (vector-set! node 4 v))
- (define (node-entry2-set! node v) (vector-set! node 5 v))
- (define (node-entry3-set! node v) (vector-set! node 6 v))
- (define (node-entry4-set! node v) (vector-set! node 7 v))
- (define (node-entry5-set! node v) (vector-set! node 8 v))
- (define (node-entry6-set! node v) (vector-set! node 9 v))
- (define (node-mark-set! node v) (vector-set! node 10 v))
-
- (define *sn* 0)
- (define *rand* 21)
- (define *count* 0)
- (define *marker* #f)
- (define *root* '())
-
- (define (snb)
-  (set! *sn* (+ 1 *sn*))
-  *sn*)
-
- (define (seed)
-  (set! *rand* 21)
-  *rand*)
-
- (define (traverse-random)
-  (set! *rand* (remainder (* *rand* 17) 251))
-  *rand*)
-
- (define (traverse-remove n q)
-  (cond ((eq? (cdr (car q)) (car q)) (let ((x (caar q))) (set-car! q '()) x))
-	((zero? n)
-	 (let ((x (caar q)))
-	  (do ((p (car q) (cdr p)))
-	    ((eq? (cdr p) (car q))
-	     (set-cdr! p (cdr (car q)))
-	     (set-car! q p)))
-	  x))
-	(else (do ((n n (- n 1)) (q (car q) (cdr q)) (p (cdr (car q)) (cdr p)))
-		((zero? n) (let ((x (car q))) (set-cdr! q p) x))))))
-
- (define (traverse-select n q)
-  (do ((n n (- n 1)) (q (car q) (cdr q))) ((zero? n) (car q))))
-
- (define (add a q)
-  (cond ((null? q) `(,(let ((x `(,a))) (set-cdr! x x) x)))
-	((null? (car q))
-	 (let ((x `(,a)))
-	  (set-cdr! x x)
-	  (set-car! q x)
-	  q))
-	;; the CL version had a useless set-car! in the next line (wc)
-	(else (set-cdr! (car q) `(,a . ,(cdr (car q)))) q)))
-
- (define (create-structure n)
-  (let ((a `(,(make-node))))
-   (do ((m (- n 1) (- m 1)) (p a))
-     ((zero? m)
-      (set! a `(,(begin (set-cdr! p a) p)))
-      (do ((unused a) (used (add (traverse-remove 0 a) '())) (x 0) (y 0))
-	((null? (car unused)) (find-root (traverse-select 0 used) n))
-       (set! x (traverse-remove (remainder (traverse-random) n) unused))
-       (set! y (traverse-select (remainder (traverse-random) n) used))
-       (add x used)
-       (node-sons-set! y `(,x . ,(node-sons y)))
-       (node-parents-set! x `(,y . ,(node-parents x))) ))
-    (set! a (cons (make-node) a)))))
-
- (define (find-root node n)
-  (do ((n n (- n 1))) ((or (zero? n) (null? (node-parents node))) node)
-   (set! node (car (node-parents node)))))
-
- (define (travers node mark)
-  (cond ((eq? (node-mark node) mark) #f)
-	(else (node-mark-set! node mark)
-	      (set! *count* (+ 1 *count*))
-	      (node-entry1-set! node (not (node-entry1 node)))
-	      (node-entry2-set! node (not (node-entry2 node)))
-	      (node-entry3-set! node (not (node-entry3 node)))
-	      (node-entry4-set! node (not (node-entry4 node)))
-	      (node-entry5-set! node (not (node-entry5 node)))
-	      (node-entry6-set! node (not (node-entry6 node)))
-	      (do ((sons (node-sons node) (cdr sons))) ((null? sons) #f)
-	       (travers (car sons) mark)))))
-
- (define (traverse root)
-  (let ((*count* 0))
-   (travers root (begin (set! *marker* (not *marker*)) *marker*))
-   *count*))
-
- (define (init-traverse)		; Changed from defmacro to defun \bs
-  (set! *root* (create-structure 100))
-  #f)
-
- (define (run-traverse)			; Changed from defmacro to defun \bs
-  (do ((i 50 (- i 1))) ((zero? i))
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)
-   (traverse *root*)))
-
-(time (init-traverse))
diff --git a/benchmarks/triangl.scm b/benchmarks/triangl.scm
deleted file mode 100644
index 7935c2d3..00000000
--- a/benchmarks/triangl.scm
+++ /dev/null
@@ -1,57 +0,0 @@
-;;; TRIANGL -- Board game benchmark.
- 
-(define *board*
-  (list->vector '(1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1)))
-
-(define *sequence*
-  (list->vector '(0 0 0 0 0 0 0 0 0 0 0 0 0 0)))
-
-(define *a*
-  (list->vector '(1 2 4 3 5 6 1 3 6 2 5 4 11 12
-                  13 7 8 4 4 7 11 8 12 13 6 10
-                  15 9 14 13 13 14 15 9 10
-                  6 6)))
-
-(define *b*
-  (list->vector '(2 4 7 5 8 9 3 6 10 5 9 8
-                  12 13 14 8 9 5 2 4 7 5 8
-                  9 3 6 10 5 9 8 12 13 14
-                  8 9 5 5)))
-
-(define *c*
-  (list->vector '(4 7 11 8 12 13 6 10 15 9 14 13
-                  13 14 15 9 10 6 1 2 4 3 5 6 1
-                  3 6 2 5 4 11 12 13 7 8 4 4)))
-
-(define *answer* '())
- 
-(define (attempt i depth)
-  (cond ((= depth 14)
-         (set! *answer*
-               (cons (cdr (vector->list *sequence*)) *answer*))
-         #t)
-        ((and (= 1 (vector-ref *board* (vector-ref *a* i)))
-              (= 1 (vector-ref *board* (vector-ref *b* i)))
-              (= 0 (vector-ref *board* (vector-ref *c* i))))
-         (vector-set! *board* (vector-ref *a* i) 0)
-         (vector-set! *board* (vector-ref *b* i) 0)
-         (vector-set! *board* (vector-ref *c* i) 1)
-         (vector-set! *sequence* depth i)
-         (do ((j 0 (+ j 1))
-              (depth (+ depth 1)))
-             ((or (= j 36) (attempt j depth)) #f))
-         (vector-set! *board* (vector-ref *a* i) 1)
-         (vector-set! *board* (vector-ref *b* i) 1)
-         (vector-set! *board* (vector-ref *c* i) 0) #f)
-        (else #f)))
- 
-(define (test)
-  (set! *answer* '())
-  (attempt 22 1)
-  (car *answer*))
-
-(let ((result (time (test))))
-  (if (not (equal? result
-		   '(22 34 31 15 7 1 20 17 25 6 5 13 32)))
-      (error "wrong result" result) ) )
-
diff --git a/distribution/manifest b/distribution/manifest
index 97505e2e..ca3d97c4 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -8,48 +8,6 @@ README
 config-arch.sh
 banner.scm
 batch-driver.scm
-benchmarks/0.scm
-benchmarks/cscbench.scm
-benchmarks/nbody.scm
-benchmarks/binarytrees.scm
-benchmarks/boyer.scm
-benchmarks/browse.scm
-benchmarks/conform.scm
-benchmarks/cpstak.scm
-benchmarks/ctak.scm
-benchmarks/dderiv.scm
-benchmarks/deriv.scm
-benchmarks/destructive.scm
-benchmarks/div-iter.scm
-benchmarks/div-rec.scm
-benchmarks/dynamic.scm
-benchmarks/earley.scm
-benchmarks/fft.scm
-benchmarks/fib.scm
-benchmarks/fibc.scm
-benchmarks/fprint.scm
-benchmarks/fread.scm
-benchmarks/hanoi.scm
-benchmarks/lattice.scm
-benchmarks/maze.scm
-benchmarks/nqueens.scm
-benchmarks/others/Makefile
-benchmarks/others/except.scm
-benchmarks/others/except2.scm
-benchmarks/others/exception.cpp
-benchmarks/others/results.txt
-benchmarks/others/setlongjmp.c
-benchmarks/puzzle.scm
-benchmarks/scheme.scm
-benchmarks/tak.scm
-benchmarks/takl.scm
-benchmarks/takr.scm
-benchmarks/traverse.scm
-benchmarks/travinit.scm
-benchmarks/triangl.scm
-benchmarks/regex/benchmark.pl
-benchmarks/regex/re-benchmarks.txt
-benchmarks/regex/benchmark.scm
 batch-driver.c
 c-backend.c
 c-platform.c
@@ -107,8 +65,6 @@ buildversion
 c-backend.scm
 c-platform.scm
 chicken-ffi-syntax.scm
-chicken-primitive-object-inlines.scm
-chicken-thread-object-inlines.scm
 chicken-profile.1
 chicken-profile.scm
 chicken.1
@@ -130,8 +86,6 @@ files.scm
 chicken-bug.1
 chicken-bug.scm
 chicken-bug.c
-hen.el
-scheme-complete.el
 html/Accessing external objects.html
 html/Acknowledgements.html
 html/Basic mode of operation.html
@@ -245,6 +199,7 @@ tests/re-tests.txt
 tests/lolevel-tests.scm
 tests/feeley-dynwind.scm
 tests/compiler-syntax-tests.scm
+tests/silex.scm
 tweaks.scm
 utils.scm
 apply-hack.x86.S
diff --git a/tests/fft.scm b/tests/fft.scm
new file mode 100644
index 00000000..787fcebb
--- /dev/null
+++ b/tests/fft.scm
@@ -0,0 +1,2071 @@
+(declare (standard-bindings)
+	 (extended-bindings)
+	 (block)
+	 (not safe)
+	 )
+
+;;; All the following redefinitions are *ignored* by the Gambit compiler
+;;; because of the declarations above.
+
+(cond-expand
+ (chicken
+  (begin
+    (use srfi-4)
+    (define-syntax defalias
+      (syntax-rules ()
+	((_ one two) 
+	 (define-syntax one
+	   (syntax-rules ()
+	     ((_ . args) (two . args))))))) 
+    (defalias fixnum->flonum exact->inexact)
+    (defalias fxodd? odd?)
+    (defalias fxeven? even?)
+    (defalias fxarithmetic-shift-right fxshr)
+    (defalias fxarithmetic-shift-left  fxshl)
+    (defalias fl* fp*)
+    (defalias fl/ fp/)
+    (defalias fl+ fp+)
+    (defalias fl- fp-)
+    (defalias flsqrt sqrt)))
+ (else))
+
+(cond-expand
+ ((and chicken (not unboxed))
+  (begin
+    (defalias make-f64vector make-vector)
+    (defalias f64vector vector)
+    (defalias f64vector-set! vector-set!)
+    (defalias f64vector-ref vector-ref)
+    (defalias list->f64vector list->vector)
+    (defalias f64vector-length vector-length)) )
+ (else) )
+
+;;; end of *ignored* definitions
+
+(define lut-table-size 512)
+(define lut-table-size^2 262144)
+(define lut-table-size^3 134217728)
+(define log-lut-table-size 9)
+
+(define low-lut
+  (list->f64vector '(1. 0.
+	   .7071067811865476 .7071067811865476
+	   .9238795325112867 .3826834323650898
+	   .3826834323650898 .9238795325112867
+	   .9807852804032304 .19509032201612828
+	   .5555702330196022 .8314696123025452
+	   .8314696123025452 .5555702330196022
+	   .19509032201612828 .9807852804032304
+	   .9951847266721969 .0980171403295606
+	   .6343932841636455 .773010453362737
+	   .881921264348355 .47139673682599764
+	   .2902846772544624 .9569403357322088
+	   .9569403357322088 .2902846772544624
+	   .47139673682599764 .881921264348355
+	   .773010453362737 .6343932841636455
+	   .0980171403295606 .9951847266721969
+	   .9987954562051724 .049067674327418015
+	   .6715589548470184 .7409511253549591
+	   .9039892931234433 .4275550934302821
+	   .33688985339222005 .9415440651830208
+	   .970031253194544 .2429801799032639
+	   .5141027441932218 .8577286100002721
+	   .8032075314806449 .5956993044924334
+	   .14673047445536175 .989176509964781
+	   .989176509964781 .14673047445536175
+	   .5956993044924334 .8032075314806449
+	   .8577286100002721 .5141027441932218
+	   .2429801799032639 .970031253194544
+	   .9415440651830208 .33688985339222005
+	   .4275550934302821 .9039892931234433
+	   .7409511253549591 .6715589548470184
+	   .049067674327418015 .9987954562051724
+	   .9996988186962042 .024541228522912288
+	   .6895405447370669 .7242470829514669
+	   .9142097557035307 .40524131400498986
+	   .35989503653498817 .9329927988347388
+	   .9757021300385286 .2191012401568698
+	   .5349976198870973 .8448535652497071
+	   .8175848131515837 .5758081914178453
+	   .17096188876030122 .9852776423889412
+	   .99247953459871 .1224106751992162
+	   .6152315905806268 .7883464276266062
+	   .8700869911087115 .49289819222978404
+	   .26671275747489837 .9637760657954398
+	   .9495281805930367 .31368174039889146
+	   .4496113296546066 .8932243011955153
+	   .7572088465064846 .6531728429537768
+	   .07356456359966743 .9972904566786902
+	   .9972904566786902 .07356456359966743
+	   .6531728429537768 .7572088465064846
+	   .8932243011955153 .4496113296546066
+	   .31368174039889146 .9495281805930367
+	   .9637760657954398 .26671275747489837
+	   .49289819222978404 .8700869911087115
+	   .7883464276266062 .6152315905806268
+	   .1224106751992162 .99247953459871
+	   .9852776423889412 .17096188876030122
+	   .5758081914178453 .8175848131515837
+	   .8448535652497071 .5349976198870973
+	   .2191012401568698 .9757021300385286
+	   .9329927988347388 .35989503653498817
+	   .40524131400498986 .9142097557035307
+	   .7242470829514669 .6895405447370669
+	   .024541228522912288 .9996988186962042
+	   .9999247018391445 .012271538285719925
+	   .6983762494089728 .7157308252838187
+	   .9191138516900578 .3939920400610481
+	   .37131719395183754 .9285060804732156
+	   .9783173707196277 .20711137619221856
+	   .5453249884220465 .8382247055548381
+	   .8245893027850253 .5657318107836132
+	   .18303988795514095 .9831054874312163
+	   .9939069700023561 .11022220729388306
+	   .6248594881423863 .7807372285720945
+	   .8760700941954066 .4821837720791228
+	   .2785196893850531 .9604305194155658
+	   .9533060403541939 .3020059493192281
+	   .46053871095824 .8876396204028539
+	   .765167265622459 .6438315428897915
+	   .0857973123444399 .996312612182778
+	   .9981181129001492 .06132073630220858
+	   .6624157775901718 .7491363945234594
+	   .8986744656939538 .43861623853852766
+	   .3253102921622629 .9456073253805213
+	   .9669764710448521 .25486565960451457
+	   .5035383837257176 .8639728561215867
+	   .7958369046088836 .6055110414043255
+	   .1345807085071262 .99090263542778
+	   .9873014181578584 .15885814333386145
+	   .5857978574564389 .8104571982525948
+	   .8513551931052652 .524589682678469
+	   .2310581082806711 .9729399522055602
+	   .937339011912575 .34841868024943456
+	   .4164295600976372 .9091679830905224
+	   .7326542716724128 .680600997795453
+	   .03680722294135883 .9993223845883495
+	   .9993223845883495 .03680722294135883
+	   .680600997795453 .7326542716724128
+	   .9091679830905224 .4164295600976372
+	   .34841868024943456 .937339011912575
+	   .9729399522055602 .2310581082806711
+	   .524589682678469 .8513551931052652
+	   .8104571982525948 .5857978574564389
+	   .15885814333386145 .9873014181578584
+	   .99090263542778 .1345807085071262
+	   .6055110414043255 .7958369046088836
+	   .8639728561215867 .5035383837257176
+	   .25486565960451457 .9669764710448521
+	   .9456073253805213 .3253102921622629
+	   .43861623853852766 .8986744656939538
+	   .7491363945234594 .6624157775901718
+	   .06132073630220858 .9981181129001492
+	   .996312612182778 .0857973123444399
+	   .6438315428897915 .765167265622459
+	   .8876396204028539 .46053871095824
+	   .3020059493192281 .9533060403541939
+	   .9604305194155658 .2785196893850531
+	   .4821837720791228 .8760700941954066
+	   .7807372285720945 .6248594881423863
+	   .11022220729388306 .9939069700023561
+	   .9831054874312163 .18303988795514095
+	   .5657318107836132 .8245893027850253
+	   .8382247055548381 .5453249884220465
+	   .20711137619221856 .9783173707196277
+	   .9285060804732156 .37131719395183754
+	   .3939920400610481 .9191138516900578
+	   .7157308252838187 .6983762494089728
+	   .012271538285719925 .9999247018391445
+	   .9999811752826011 .006135884649154475
+	   .7027547444572253 .7114321957452164
+	   .9215140393420419 .3883450466988263
+	   .37700741021641826 .9262102421383114
+	   .9795697656854405 .2011046348420919
+	   .5504579729366048 .83486287498638
+	   .8280450452577558 .560661576197336
+	   .18906866414980622 .9819638691095552
+	   .9945645707342554 .10412163387205457
+	   .629638238914927 .7768884656732324
+	   .8790122264286335 .47679923006332214
+	   .2844075372112718 .9587034748958716
+	   .9551411683057707 .29615088824362384
+	   .4659764957679662 .8847970984309378
+	   .7691033376455796 .6391244448637757
+	   .09190895649713272 .9957674144676598
+	   .9984755805732948 .05519524434968994
+	   .6669999223036375 .745057785441466
+	   .901348847046022 .43309381885315196
+	   .33110630575987643 .9435934581619604
+	   .9685220942744173 .24892760574572018
+	   .508830142543107 .8608669386377673
+	   .799537269107905 .600616479383869
+	   .14065823933284924 .9900582102622971
+	   .9882575677307495 .15279718525844344
+	   .5907597018588743 .8068475535437992
+	   .8545579883654005 .5193559901655896
+	   .2370236059943672 .9715038909862518
+	   .9394592236021899 .3426607173119944
+	   .4220002707997997 .9065957045149153
+	   .7368165688773699 .6760927035753159
+	   .04293825693494082 .9990777277526454
+	   .9995294175010931 .030674803176636626
+	   .6850836677727004 .7284643904482252
+	   .9117060320054299 .41084317105790397
+	   .3541635254204904 .9351835099389476
+	   .9743393827855759 .22508391135979283
+	   .5298036246862947 .8481203448032972
+	   .8140363297059484 .5808139580957645
+	   .16491312048996992 .9863080972445987
+	   .9917097536690995 .12849811079379317
+	   .6103828062763095 .7921065773002124
+	   .8670462455156926 .49822766697278187
+	   .2607941179152755 .9653944416976894
+	   .9475855910177411 .3195020308160157
+	   .44412214457042926 .8959662497561851
+	   .7531867990436125 .6578066932970786
+	   .06744391956366406 .9977230666441916
+	   .9968202992911657 .07968243797143013
+	   .6485144010221124 .7612023854842618
+	   .8904487232447579 .45508358712634384
+	   .30784964004153487 .9514350209690083
+	   .9621214042690416 .272621355449949
+	   .48755016014843594 .8730949784182901
+	   .7845565971555752 .6200572117632892
+	   .11631863091190477 .9932119492347945
+	   .984210092386929 .17700422041214875
+	   .5707807458869673 .8211025149911046
+	   .8415549774368984 .5401714727298929
+	   .21311031991609136 .9770281426577544
+	   .9307669610789837 .36561299780477385
+	   .39962419984564684 .9166790599210427
+	   .7200025079613817 .693971460889654
+	   .01840672990580482 .9998305817958234
+	   .9998305817958234 .01840672990580482
+	   .693971460889654 .7200025079613817
+	   .9166790599210427 .39962419984564684
+	   .36561299780477385 .9307669610789837
+	   .9770281426577544 .21311031991609136
+	   .5401714727298929 .8415549774368984
+	   .8211025149911046 .5707807458869673
+	   .17700422041214875 .984210092386929
+	   .9932119492347945 .11631863091190477
+	   .6200572117632892 .7845565971555752
+	   .8730949784182901 .48755016014843594
+	   .272621355449949 .9621214042690416
+	   .9514350209690083 .30784964004153487
+	   .45508358712634384 .8904487232447579
+	   .7612023854842618 .6485144010221124
+	   .07968243797143013 .9968202992911657
+	   .9977230666441916 .06744391956366406
+	   .6578066932970786 .7531867990436125
+	   .8959662497561851 .44412214457042926
+	   .3195020308160157 .9475855910177411
+	   .9653944416976894 .2607941179152755
+	   .49822766697278187 .8670462455156926
+	   .7921065773002124 .6103828062763095
+	   .12849811079379317 .9917097536690995
+	   .9863080972445987 .16491312048996992
+	   .5808139580957645 .8140363297059484
+	   .8481203448032972 .5298036246862947
+	   .22508391135979283 .9743393827855759
+	   .9351835099389476 .3541635254204904
+	   .41084317105790397 .9117060320054299
+	   .7284643904482252 .6850836677727004
+	   .030674803176636626 .9995294175010931
+	   .9990777277526454 .04293825693494082
+	   .6760927035753159 .7368165688773699
+	   .9065957045149153 .4220002707997997
+	   .3426607173119944 .9394592236021899
+	   .9715038909862518 .2370236059943672
+	   .5193559901655896 .8545579883654005
+	   .8068475535437992 .5907597018588743
+	   .15279718525844344 .9882575677307495
+	   .9900582102622971 .14065823933284924
+	   .600616479383869 .799537269107905
+	   .8608669386377673 .508830142543107
+	   .24892760574572018 .9685220942744173
+	   .9435934581619604 .33110630575987643
+	   .43309381885315196 .901348847046022
+	   .745057785441466 .6669999223036375
+	   .05519524434968994 .9984755805732948
+	   .9957674144676598 .09190895649713272
+	   .6391244448637757 .7691033376455796
+	   .8847970984309378 .4659764957679662
+	   .29615088824362384 .9551411683057707
+	   .9587034748958716 .2844075372112718
+	   .47679923006332214 .8790122264286335
+	   .7768884656732324 .629638238914927
+	   .10412163387205457 .9945645707342554
+	   .9819638691095552 .18906866414980622
+	   .560661576197336 .8280450452577558
+	   .83486287498638 .5504579729366048
+	   .2011046348420919 .9795697656854405
+	   .9262102421383114 .37700741021641826
+	   .3883450466988263 .9215140393420419
+	   .7114321957452164 .7027547444572253
+	   .006135884649154475 .9999811752826011
+	   .9999952938095762 .003067956762965976
+	   .7049340803759049 .7092728264388657
+	   .9227011283338785 .38551605384391885
+	   .37984720892405116 .9250492407826776
+	   .9801821359681174 .1980984107179536
+	   .5530167055800276 .8331701647019132
+	   .829761233794523 .5581185312205561
+	   .19208039704989244 .9813791933137546
+	   .9948793307948056 .10106986275482782
+	   .6320187359398091 .7749531065948739
+	   .8804708890521608 .47410021465055
+	   .2873474595447295 .9578264130275329
+	   .9560452513499964 .29321916269425863
+	   .46868882203582796 .8833633386657316
+	   .7710605242618138 .6367618612362842
+	   .094963495329639 .9954807554919269
+	   .9986402181802653 .052131704680283324
+	   .6692825883466361 .7430079521351217
+	   .9026733182372588 .4303264813400826
+	   .3339996514420094 .9425731976014469
+	   .9692812353565485 .24595505033579462
+	   .5114688504379704 .8593018183570084
+	   .8013761717231402 .5981607069963423
+	   .14369503315029444 .9896220174632009
+	   .9887216919603238 .1497645346773215
+	   .5932322950397998 .8050313311429635
+	   .8561473283751945 .5167317990176499
+	   .2400030224487415 .9707721407289504
+	   .9405060705932683 .33977688440682685
+	   .4247796812091088 .9052967593181188
+	   .7388873244606151 .673829000378756
+	   .04600318213091463 .9989412931868569
+	   .9996188224951786 .027608145778965743
+	   .6873153408917592 .726359155084346
+	   .9129621904283982 .4080441628649787
+	   .35703096123343003 .9340925504042589
+	   .9750253450669941 .22209362097320354
+	   .532403127877198 .8464909387740521
+	   .8158144108067338 .5783137964116556
+	   .16793829497473117 .9857975091675675
+	   .9920993131421918 .12545498341154623
+	   .6128100824294097 .79023022143731
+	   .8685707059713409 .49556526182577254
+	   .2637546789748314 .9645897932898128
+	   .9485613499157303 .31659337555616585
+	   .4468688401623742 .8945994856313827
+	   .7552013768965365 .6554928529996153
+	   .07050457338961387 .9975114561403035
+	   .997060070339483 .07662386139203149
+	   .6508466849963809 .7592091889783881
+	   .8918407093923427 .4523495872337709
+	   .3107671527496115 .9504860739494817
+	   .9629532668736839 .2696683255729151
+	   .49022648328829116 .8715950866559511
+	   .7864552135990858 .617647307937804
+	   .11936521481099137 .9928504144598651
+	   .9847485018019042 .17398387338746382
+	   .5732971666980422 .819347520076797
+	   .8432082396418454 .5375870762956455
+	   .21610679707621952 .9763697313300211
+	   .9318842655816681 .3627557243673972
+	   .40243465085941843 .9154487160882678
+	   .7221281939292153 .6917592583641577
+	   .021474080275469508 .9997694053512153
+	   .9998823474542126 .015339206284988102
+	   .696177131491463 .7178700450557317
+	   .9179007756213905 .3968099874167103
+	   .3684668299533723 .9296408958431812
+	   .9776773578245099 .2101118368804696
+	   .5427507848645159 .8398937941959995
+	   .8228497813758263 .5682589526701316
+	   .18002290140569951 .9836624192117303
+	   .9935641355205953 .11327095217756435
+	   .62246127937415 .7826505961665757
+	   .8745866522781761 .4848692480007911
+	   .27557181931095814 .9612804858113206
+	   .9523750127197659 .30492922973540243
+	   .45781330359887723 .8890483558546646
+	   .7631884172633813 .6461760129833164
+	   .08274026454937569 .9965711457905548
+	   .997925286198596 .06438263092985747
+	   .6601143420674205 .7511651319096864
+	   .8973245807054183 .44137126873171667
+	   .32240767880106985 .9466009130832835
+	   .9661900034454125 .257831102162159
+	   .5008853826112408 .8655136240905691
+	   .7939754775543372 .6079497849677736
+	   .13154002870288312 .9913108598461154
+	   .9868094018141855 .16188639378011183
+	   .5833086529376983 .8122505865852039
+	   .8497417680008524 .5271991347819014
+	   .22807208317088573 .973644249650812
+	   .9362656671702783 .35129275608556715
+	   .41363831223843456 .9104412922580672
+	   .7305627692278276 .6828455463852481
+	   .03374117185137759 .9994306045554617
+	   .9992047586183639 .03987292758773981
+	   .6783500431298615 .7347388780959635
+	   .9078861164876663 .41921688836322396
+	   .34554132496398904 .9384035340631081
+	   .9722264970789363 .23404195858354343
+	   .5219752929371544 .8529606049303636
+	   .808656181588175 .5882815482226453
+	   .15582839765426523 .9877841416445722
+	   .9904850842564571 .13762012158648604
+	   .6030665985403482 .7976908409433912
+	   .8624239561110405 .5061866453451553
+	   .25189781815421697 .9677538370934755
+	   .9446048372614803 .32820984357909255
+	   .4358570799222555 .9000158920161603
+	   .7471006059801801 .6647109782033449
+	   .05825826450043576 .9983015449338929
+	   .996044700901252 .0888535525825246
+	   .6414810128085832 .7671389119358204
+	   .8862225301488806 .4632597835518602
+	   .2990798263080405 .9542280951091057
+	   .9595715130819845 .281464937925758
+	   .479493757660153 .8775452902072612
+	   .778816512381476 .6272518154951441
+	   .10717242495680884 .9942404494531879
+	   .9825393022874412 .18605515166344666
+	   .5631993440138341 .8263210628456635
+	   .836547727223512 .5478940591731002
+	   .20410896609281687 .9789481753190622
+	   .9273625256504011 .374164062971458
+	   .39117038430225387 .9203182767091106
+	   .7135848687807936 .7005687939432483
+	   .00920375478205982 .9999576445519639
+	   .9999576445519639 .00920375478205982
+	   .7005687939432483 .7135848687807936
+	   .9203182767091106 .39117038430225387
+	   .374164062971458 .9273625256504011
+	   .9789481753190622 .20410896609281687
+	   .5478940591731002 .836547727223512
+	   .8263210628456635 .5631993440138341
+	   .18605515166344666 .9825393022874412
+	   .9942404494531879 .10717242495680884
+	   .6272518154951441 .778816512381476
+	   .8775452902072612 .479493757660153
+	   .281464937925758 .9595715130819845
+	   .9542280951091057 .2990798263080405
+	   .4632597835518602 .8862225301488806
+	   .7671389119358204 .6414810128085832
+	   .0888535525825246 .996044700901252
+	   .9983015449338929 .05825826450043576
+	   .6647109782033449 .7471006059801801
+	   .9000158920161603 .4358570799222555
+	   .32820984357909255 .9446048372614803
+	   .9677538370934755 .25189781815421697
+	   .5061866453451553 .8624239561110405
+	   .7976908409433912 .6030665985403482
+	   .13762012158648604 .9904850842564571
+	   .9877841416445722 .15582839765426523
+	   .5882815482226453 .808656181588175
+	   .8529606049303636 .5219752929371544
+	   .23404195858354343 .9722264970789363
+	   .9384035340631081 .34554132496398904
+	   .41921688836322396 .9078861164876663
+	   .7347388780959635 .6783500431298615
+	   .03987292758773981 .9992047586183639
+	   .9994306045554617 .03374117185137759
+	   .6828455463852481 .7305627692278276
+	   .9104412922580672 .41363831223843456
+	   .35129275608556715 .9362656671702783
+	   .973644249650812 .22807208317088573
+	   .5271991347819014 .8497417680008524
+	   .8122505865852039 .5833086529376983
+	   .16188639378011183 .9868094018141855
+	   .9913108598461154 .13154002870288312
+	   .6079497849677736 .7939754775543372
+	   .8655136240905691 .5008853826112408
+	   .257831102162159 .9661900034454125
+	   .9466009130832835 .32240767880106985
+	   .44137126873171667 .8973245807054183
+	   .7511651319096864 .6601143420674205
+	   .06438263092985747 .997925286198596
+	   .9965711457905548 .08274026454937569
+	   .6461760129833164 .7631884172633813
+	   .8890483558546646 .45781330359887723
+	   .30492922973540243 .9523750127197659
+	   .9612804858113206 .27557181931095814
+	   .4848692480007911 .8745866522781761
+	   .7826505961665757 .62246127937415
+	   .11327095217756435 .9935641355205953
+	   .9836624192117303 .18002290140569951
+	   .5682589526701316 .8228497813758263
+	   .8398937941959995 .5427507848645159
+	   .2101118368804696 .9776773578245099
+	   .9296408958431812 .3684668299533723
+	   .3968099874167103 .9179007756213905
+	   .7178700450557317 .696177131491463
+	   .015339206284988102 .9998823474542126
+	   .9997694053512153 .021474080275469508
+	   .6917592583641577 .7221281939292153
+	   .9154487160882678 .40243465085941843
+	   .3627557243673972 .9318842655816681
+	   .9763697313300211 .21610679707621952
+	   .5375870762956455 .8432082396418454
+	   .819347520076797 .5732971666980422
+	   .17398387338746382 .9847485018019042
+	   .9928504144598651 .11936521481099137
+	   .617647307937804 .7864552135990858
+	   .8715950866559511 .49022648328829116
+	   .2696683255729151 .9629532668736839
+	   .9504860739494817 .3107671527496115
+	   .4523495872337709 .8918407093923427
+	   .7592091889783881 .6508466849963809
+	   .07662386139203149 .997060070339483
+	   .9975114561403035 .07050457338961387
+	   .6554928529996153 .7552013768965365
+	   .8945994856313827 .4468688401623742
+	   .31659337555616585 .9485613499157303
+	   .9645897932898128 .2637546789748314
+	   .49556526182577254 .8685707059713409
+	   .79023022143731 .6128100824294097
+	   .12545498341154623 .9920993131421918
+	   .9857975091675675 .16793829497473117
+	   .5783137964116556 .8158144108067338
+	   .8464909387740521 .532403127877198
+	   .22209362097320354 .9750253450669941
+	   .9340925504042589 .35703096123343003
+	   .4080441628649787 .9129621904283982
+	   .726359155084346 .6873153408917592
+	   .027608145778965743 .9996188224951786
+	   .9989412931868569 .04600318213091463
+	   .673829000378756 .7388873244606151
+	   .9052967593181188 .4247796812091088
+	   .33977688440682685 .9405060705932683
+	   .9707721407289504 .2400030224487415
+	   .5167317990176499 .8561473283751945
+	   .8050313311429635 .5932322950397998
+	   .1497645346773215 .9887216919603238
+	   .9896220174632009 .14369503315029444
+	   .5981607069963423 .8013761717231402
+	   .8593018183570084 .5114688504379704
+	   .24595505033579462 .9692812353565485
+	   .9425731976014469 .3339996514420094
+	   .4303264813400826 .9026733182372588
+	   .7430079521351217 .6692825883466361
+	   .052131704680283324 .9986402181802653
+	   .9954807554919269 .094963495329639
+	   .6367618612362842 .7710605242618138
+	   .8833633386657316 .46868882203582796
+	   .29321916269425863 .9560452513499964
+	   .9578264130275329 .2873474595447295
+	   .47410021465055 .8804708890521608
+	   .7749531065948739 .6320187359398091
+	   .10106986275482782 .9948793307948056
+	   .9813791933137546 .19208039704989244
+	   .5581185312205561 .829761233794523
+	   .8331701647019132 .5530167055800276
+	   .1980984107179536 .9801821359681174
+	   .9250492407826776 .37984720892405116
+	   .38551605384391885 .9227011283338785
+	   .7092728264388657 .7049340803759049
+	   .003067956762965976 .9999952938095762
+	   )))
+
+(define med-lut
+  (list->f64vector '(1. 0.
+	   .9999999999820472 5.9921124526424275e-6
+	   .9999999999281892 1.1984224905069707e-5
+	   .9999999998384257 1.7976337357066685e-5
+	   .9999999997127567 2.396844980841822e-5
+	   .9999999995511824 2.9960562258909154e-5
+	   .9999999993537025 3.5952674708324344e-5
+	   .9999999991203175 4.1944787156448635e-5
+	   .9999999988510269 4.793689960306688e-5
+	   .9999999985458309 5.3929012047963936e-5
+	   .9999999982047294 5.992112449092465e-5
+	   .9999999978277226 6.591323693173387e-5
+	   .9999999974148104 7.190534937017645e-5
+	   .9999999969659927 7.789746180603723e-5
+	   .9999999964812697 8.388957423910108e-5
+	   .9999999959606412 8.988168666915283e-5
+	   .9999999954041073 9.587379909597734e-5
+	   .999999994811668 1.0186591151935948e-4
+	   .9999999941833233 1.0785802393908407e-4
+	   .9999999935190732 1.1385013635493597e-4
+	   .9999999928189177 1.1984224876670004e-4
+	   .9999999920828567 1.2583436117416112e-4
+	   .9999999913108903 1.3182647357710405e-4
+	   .9999999905030187 1.3781858597531374e-4
+	   .9999999896592414 1.4381069836857496e-4
+	   .9999999887795589 1.498028107566726e-4
+	   .9999999878639709 1.5579492313939151e-4
+	   .9999999869124775 1.6178703551651655e-4
+	   .9999999859250787 1.6777914788783258e-4
+	   .9999999849017744 1.737712602531244e-4
+	   .9999999838425648 1.797633726121769e-4
+	   .9999999827474497 1.8575548496477492e-4
+	   .9999999816164293 1.9174759731070332e-4
+	   .9999999804495034 1.9773970964974692e-4
+	   .9999999792466722 2.037318219816906e-4
+	   .9999999780079355 2.0972393430631923e-4
+	   .9999999767332933 2.1571604662341763e-4
+	   .9999999754227459 2.2170815893277063e-4
+	   .9999999740762929 2.2770027123416315e-4
+	   .9999999726939346 2.3369238352737996e-4
+	   .9999999712756709 2.3968449581220595e-4
+	   .9999999698215016 2.45676608088426e-4
+	   .9999999683314271 2.5166872035582493e-4
+	   .9999999668054471 2.5766083261418755e-4
+	   .9999999652435617 2.636529448632988e-4
+	   .9999999636457709 2.696450571029434e-4
+	   .9999999620120748 2.756371693329064e-4
+	   .9999999603424731 2.8162928155297243e-4
+	   .9999999586369661 2.876213937629265e-4
+	   .9999999568955537 2.936135059625534e-4
+	   .9999999551182358 2.99605618151638e-4
+	   .9999999533050126 3.055977303299651e-4
+	   .9999999514558838 3.115898424973196e-4
+	   .9999999495708498 3.1758195465348636e-4
+	   .9999999476499103 3.235740667982502e-4
+	   .9999999456930654 3.2956617893139595e-4
+	   .9999999437003151 3.3555829105270853e-4
+	   .9999999416716594 3.4155040316197275e-4
+	   .9999999396070982 3.475425152589734e-4
+	   .9999999375066316 3.535346273434955e-4
+	   .9999999353702598 3.595267394153237e-4
+	   .9999999331979824 3.6551885147424295e-4
+	   .9999999309897996 3.7151096352003814e-4
+	   .9999999287457114 3.7750307555249406e-4
+	   .9999999264657179 3.8349518757139556e-4
+	   .9999999241498189 3.8948729957652753e-4
+	   .9999999217980144 3.954794115676748e-4
+	   .9999999194103046 4.0147152354462224e-4
+	   .9999999169866894 4.0746363550715466e-4
+	   .9999999145271687 4.134557474550569e-4
+	   .9999999120317428 4.194478593881139e-4
+	   .9999999095004113 4.2543997130611036e-4
+	   .9999999069331744 4.314320832088313e-4
+	   .9999999043300322 4.3742419509606144e-4
+	   .9999999016909845 4.4341630696758576e-4
+	   .9999998990160315 4.4940841882318896e-4
+	   .9999998963051729 4.55400530662656e-4
+	   .999999893558409 4.613926424857717e-4
+	   .9999998907757398 4.673847542923209e-4
+	   .9999998879571651 4.7337686608208844e-4
+	   .9999998851026849 4.793689778548592e-4
+	   .9999998822122994 4.8536108961041806e-4
+	   .9999998792860085 4.913532013485497e-4
+	   .9999998763238122 4.973453130690393e-4
+	   .9999998733257104 5.033374247716714e-4
+	   .9999998702917032 5.09329536456231e-4
+	   .9999998672217907 5.153216481225028e-4
+	   .9999998641159727 5.213137597702719e-4
+	   .9999998609742493 5.27305871399323e-4
+	   .9999998577966206 5.332979830094408e-4
+	   .9999998545830864 5.392900946004105e-4
+	   .9999998513336468 5.452822061720168e-4
+	   .9999998480483018 5.512743177240444e-4
+	   .9999998447270514 5.572664292562783e-4
+	   .9999998413698955 5.632585407685033e-4
+	   .9999998379768343 5.692506522605043e-4
+	   .9999998345478677 5.752427637320661e-4
+	   .9999998310829956 5.812348751829735e-4
+	   .9999998275822183 5.872269866130116e-4
+	   .9999998240455354 5.93219098021965e-4
+	   .9999998204729471 5.992112094096185e-4
+	   .9999998168644535 6.052033207757572e-4
+	   .9999998132200545 6.111954321201659e-4
+	   .99999980953975 6.171875434426292e-4
+	   .9999998058235401 6.231796547429323e-4
+	   .9999998020714248 6.291717660208597e-4
+	   .9999997982834041 6.351638772761965e-4
+	   .9999997944594781 6.411559885087275e-4
+	   .9999997905996466 6.471480997182375e-4
+	   .9999997867039097 6.531402109045114e-4
+	   .9999997827722674 6.591323220673341e-4
+	   .9999997788047197 6.651244332064902e-4
+	   .9999997748012666 6.711165443217649e-4
+	   .9999997707619082 6.771086554129428e-4
+	   .9999997666866443 6.83100766479809e-4
+	   .9999997625754748 6.89092877522148e-4
+	   .9999997584284002 6.950849885397449e-4
+	   .9999997542454201 7.010770995323844e-4
+	   .9999997500265345 7.070692104998515e-4
+	   .9999997457717437 7.130613214419311e-4
+	   .9999997414810473 7.190534323584079e-4
+	   .9999997371544456 7.250455432490666e-4
+	   .9999997327919384 7.310376541136925e-4
+	   .9999997283935259 7.3702976495207e-4
+	   .999999723959208 7.430218757639842e-4
+	   .9999997194889846 7.490139865492199e-4
+	   .9999997149828559 7.55006097307562e-4
+	   .9999997104408218 7.609982080387952e-4
+	   .9999997058628822 7.669903187427045e-4
+	   .9999997012490373 7.729824294190747e-4
+	   .9999996965992869 7.789745400676906e-4
+	   .9999996919136313 7.849666506883372e-4
+	   .99999968719207 7.909587612807992e-4
+	   .9999996824346035 7.969508718448614e-4
+	   .9999996776412315 8.029429823803089e-4
+	   .9999996728119542 8.089350928869263e-4
+	   .9999996679467715 8.149272033644986e-4
+	   .9999996630456833 8.209193138128106e-4
+	   .9999996581086897 8.269114242316472e-4
+	   .9999996531357909 8.329035346207931e-4
+	   .9999996481269865 8.388956449800333e-4
+	   .9999996430822767 8.448877553091527e-4
+	   .9999996380016616 8.508798656079359e-4
+	   .999999632885141 8.56871975876168e-4
+	   .9999996277327151 8.628640861136338e-4
+	   .9999996225443838 8.68856196320118e-4
+	   .9999996173201471 8.748483064954056e-4
+	   .999999612060005 8.808404166392814e-4
+	   .9999996067639574 8.868325267515304e-4
+	   .9999996014320045 8.928246368319371e-4
+	   .9999995960641462 8.988167468802867e-4
+	   .9999995906603825 9.048088568963639e-4
+	   .9999995852207133 9.108009668799535e-4
+	   .9999995797451389 9.167930768308405e-4
+	   .9999995742336589 9.227851867488095e-4
+	   .9999995686862736 9.287772966336457e-4
+	   .9999995631029829 9.347694064851338e-4
+	   .9999995574837868 9.407615163030585e-4
+	   .9999995518286853 9.467536260872047e-4
+	   .9999995461376784 9.527457358373575e-4
+	   .9999995404107661 9.587378455533015e-4
+	   .9999995346479484 9.647299552348216e-4
+	   .9999995288492254 9.707220648817027e-4
+	   .9999995230145969 9.767141744937296e-4
+	   .9999995171440631 9.827062840706872e-4
+	   .9999995112376238 9.886983936123602e-4
+	   .9999995052952791 9.946905031185337e-4
+	   .9999994993170291 .0010006826125889925
+	   .9999994933028736 .0010066747220235214
+	   .9999994872528128 .001012666831421905
+	   .9999994811668466 .0010186589407839286
+	   .999999475044975 .0010246510501093766
+	   .9999994688871979 .0010306431593980344
+	   .9999994626935156 .0010366352686496862
+	   .9999994564639277 .0010426273778641173
+	   .9999994501984345 .0010486194870411127
+	   .999999443897036 .0010546115961804568
+	   .999999437559732 .0010606037052819344
+	   .9999994311865227 .0010665958143453308
+	   .9999994247774079 .0010725879233704307
+	   .9999994183323877 .0010785800323570187
+	   .9999994118514622 .0010845721413048801
+	   .9999994053346313 .0010905642502137994
+	   .9999993987818949 .0010965563590835613
+	   .9999993921932533 .0011025484679139511
+	   .9999993855687062 .0011085405767047535
+	   .9999993789082536 .0011145326854557532
+	   .9999993722118957 .001120524794166735
+	   .9999993654796325 .0011265169028374842
+	   .9999993587114638 .0011325090114677853
+	   .9999993519073898 .001138501120057423
+	   .9999993450674104 .0011444932286061825
+	   .9999993381915255 .0011504853371138485
+	   .9999993312797354 .0011564774455802057
+	   .9999993243320398 .0011624695540050393
+	   .9999993173484387 .001168461662388134
+	   .9999993103289324 .0011744537707292742
+	   .9999993032735206 .0011804458790282454
+	   .9999992961822035 .0011864379872848323
+	   .9999992890549809 .0011924300954988195
+	   .999999281891853 .001198422203669992
+	   .9999992746928197 .0012044143117981348
+	   .999999267457881 .0012104064198830327
+	   .999999260187037 .0012163985279244702
+	   .9999992528802875 .0012223906359222325
+	   .9999992455376326 .0012283827438761045
+	   .9999992381590724 .0012343748517858707
+	   .9999992307446068 .0012403669596513162
+	   .9999992232942359 .001246359067472226
+	   .9999992158079595 .0012523511752483847
+	   .9999992082857777 .001258343282979577
+	   .9999992007276906 .001264335390665588
+	   .999999193133698 .0012703274983062026
+	   .9999991855038001 .0012763196059012057
+	   .9999991778379967 .001282311713450382
+	   .9999991701362881 .0012883038209535163
+	   .999999162398674 .0012942959284103935
+	   .9999991546251547 .0013002880358207985
+	   .9999991468157298 .001306280143184516
+	   .9999991389703996 .001312272250501331
+	   .999999131089164 .0013182643577710285
+	   .999999123172023 .0013242564649933932
+	   .9999991152189767 .0013302485721682098
+	   .9999991072300249 .001336240679295263
+	   .9999990992051678 .0013422327863743383
+	   .9999990911444054 .0013482248934052201
+	   .9999990830477375 .0013542170003876934
+	   .9999990749151643 .001360209107321543
+	   .9999990667466857 .0013662012142065536
+	   .9999990585423016 .0013721933210425101
+	   .9999990503020123 .0013781854278291975
+	   .9999990420258176 .0013841775345664006
+	   .9999990337137175 .0013901696412539043
+	   .999999025365712 .0013961617478914935
+	   .999999016981801 .0014021538544789526
+	   .9999990085619848 .001408145961016067
+	   .9999990001062631 .0014141380675026214
+	   .9999989916146361 .0014201301739384005
+	   .9999989830871038 .0014261222803231893
+	   .9999989745236659 .0014321143866567725
+	   .9999989659243228 .001438106492938935
+	   .9999989572890743 .0014440985991694619
+	   .9999989486179204 .0014500907053481378
+	   .9999989399108612 .0014560828114747475
+	   .9999989311678965 .0014620749175490758
+	   .9999989223890265 .001468067023570908
+	   .9999989135742512 .0014740591295400284
+	   .9999989047235704 .0014800512354562223
+	   .9999988958369843 .0014860433413192743
+	   .9999988869144928 .0014920354471289693
+	   .9999988779560959 .0014980275528850922
+	   .9999988689617937 .0015040196585874275
+	   .9999988599315861 .0015100117642357607
+	   .999998850865473 .0015160038698298762
+	   .9999988417634548 .001521995975369559
+	   .999998832625531 .0015279880808545937
+	   .9999988234517019 .0015339801862847657
+	   .9999988142419675 .0015399722916598592
+	   .9999988049963277 .0015459643969796596
+	   .9999987957147825 .0015519565022439512
+	   .9999987863973319 .0015579486074525195
+	   .9999987770439759 .001563940712605149
+	   .9999987676547146 .0015699328177016243
+	   .999998758229548 .0015759249227417307
+	   .9999987487684759 .0015819170277252528
+	   .9999987392714985 .0015879091326519755
+	   .9999987297386157 .0015939012375216837
+	   .9999987201698276 .0015998933423341623
+	   .9999987105651341 .001605885447089196
+	   .9999987009245352 .0016118775517865696
+	   .999998691248031 .0016178696564260683
+	   .9999986815356214 .0016238617610074765
+	   .9999986717873064 .0016298538655305794
+	   .9999986620030861 .0016358459699951618
+	   .9999986521829605 .0016418380744010084
+	   .9999986423269294 .0016478301787479041
+	   .999998632434993 .0016538222830356339
+	   .9999986225071512 .0016598143872639823
+	   .999998612543404 .0016658064914327345
+	   .9999986025437515 .0016717985955416754
+	   .9999985925081937 .0016777906995905894
+	   .9999985824367305 .0016837828035792617
+	   .9999985723293618 .0016897749075074774
+	   .999998562186088 .0016957670113750207
+	   .9999985520069086 .0017017591151816769
+	   .9999985417918239 .0017077512189272307
+	   .999998531540834 .001713743322611467
+	   .9999985212539385 .0017197354262341706
+	   .9999985109311378 .0017257275297951264
+	   .9999985005724317 .0017317196332941192
+	   .9999984901778203 .0017377117367309341
+	   .9999984797473034 .0017437038401053556
+	   .9999984692808812 .0017496959434171687
+	   .9999984587785538 .0017556880466661582
+	   .9999984482403208 .001761680149852109
+	   .9999984376661826 .0017676722529748061
+	   .999998427056139 .0017736643560340342
+	   .99999841641019 .001779656459029578
+	   .9999984057283358 .0017856485619612225
+	   .9999983950105761 .0017916406648287528
+	   .999998384256911 .0017976327676319532
+	   .9999983734673407 .001803624870370609
+	   .9999983626418649 .0018096169730445048
+	   .9999983517804839 .0018156090756534257
+	   .9999983408831975 .0018216011781971562
+	   .9999983299500057 .0018275932806754815
+	   .9999983189809085 .0018335853830881864
+	   .999998307975906 .0018395774854350557
+	   .9999982969349982 .001845569587715874
+	   .9999982858581851 .0018515616899304264
+	   .9999982747454665 .001857553792078498
+	   .9999982635968426 .001863545894159873
+	   .9999982524123134 .0018695379961743367
+	   .9999982411918789 .001875530098121674
+	   .9999982299355389 .0018815222000016696
+	   .9999982186432936 .0018875143018141083
+	   .999998207315143 .0018935064035587748
+	   .999998195951087 .0018994985052354545
+	   .9999981845511257 .0019054906068439318
+	   .9999981731152591 .0019114827083839918
+	   .999998161643487 .001917474809855419
+	   .9999981501358096 .0019234669112579987
+	   .999998138592227 .0019294590125915154
+	   .9999981270127389 .0019354511138557542
+	   .9999981153973455 .0019414432150504997
+	   .9999981037460468 .0019474353161755369
+	   .9999980920588427 .001953427417230651
+	   .9999980803357332 .001959419518215626
+	   .9999980685767185 .0019654116191302473
+	   .9999980567817984 .0019714037199743
+	   .9999980449509729 .0019773958207475683
+	   .9999980330842422 .0019833879214498375
+	   .999998021181606 .001989380022080892
+	   .9999980092430646 .0019953721226405176
+	   .9999979972686177 .002001364223128498
+	   .9999979852582656 .002007356323544619
+	   .9999979732120081 .002013348423888665
+	   .9999979611298453 .002019340524160421
+	   .9999979490117771 .0020253326243596715
+	   .9999979368578036 .0020313247244862017
+	   .9999979246679247 .002037316824539796
+	   .9999979124421405 .00204330892452024
+	   .999997900180451 .002049301024427318
+	   .9999978878828562 .0020552931242608153
+	   .9999978755493559 .002061285224020516
+	   .9999978631799504 .0020672773237062057
+	   .9999978507746395 .002073269423317669
+	   .9999978383334234 .0020792615228546903
+	   .9999978258563018 .002085253622317055
+	   .999997813343275 .0020912457217045484
+	   .9999978007943428 .002097237821016954
+	   .9999977882095052 .0021032299202540577
+	   .9999977755887623 .0021092220194156444
+	   .9999977629321142 .0021152141185014984
+	   .9999977502395607 .0021212062175114043
+	   .9999977375111019 .002127198316445148
+	   .9999977247467376 .0021331904153025134
+	   .9999977119464681 .002139182514083286
+	   .9999976991102932 .0021451746127872503
+	   .9999976862382131 .002151166711414191
+	   .9999976733302276 .0021571588099638934
+	   .9999976603863368 .0021631509084361423
+	   .9999976474065406 .002169143006830722
+	   .9999976343908391 .002175135105147418
+	   .9999976213392323 .0021811272033860148
+	   .9999976082517201 .002187119301546297
+	   .9999975951283027 .00219311139962805
+	   .9999975819689799 .0021991034976310588
+	   .9999975687737518 .0022050955955551076
+	   .9999975555426184 .0022110876933999816
+	   .9999975422755796 .0022170797911654654
+	   .9999975289726355 .002223071888851344
+	   .9999975156337861 .0022290639864574026
+	   .9999975022590314 .0022350560839834253
+	   .9999974888483714 .002241048181429198
+	   .999997475401806 .0022470402787945045
+	   .9999974619193353 .00225303237607913
+	   .9999974484009593 .0022590244732828596
+	   .9999974348466779 .0022650165704054784
+	   .9999974212564913 .0022710086674467703
+	   .9999974076303992 .002277000764406521
+	   .9999973939684019 .002282992861284515
+	   .9999973802704993 .0022889849580805368
+	   .9999973665366915 .0022949770547943723
+	   .9999973527669782 .0023009691514258054
+	   .9999973389613596 .002306961247974621
+	   .9999973251198357 .0023129533444406045
+	   .9999973112424065 .0023189454408235406
+	   .999997297329072 .0023249375371232135
+	   .9999972833798322 .002330929633339409
+	   .999997269394687 .0023369217294719113
+	   .9999972553736366 .0023429138255205055
+	   .9999972413166809 .0023489059214849765
+	   .9999972272238198 .002354898017365109
+	   .9999972130950534 .0023608901131606883
+	   .9999971989303816 .0023668822088714985
+	   .9999971847298047 .0023728743044973246
+	   .9999971704933224 .0023788664000379523
+	   .9999971562209347 .0023848584954931653
+	   .9999971419126418 .0023908505908627493
+	   .9999971275684435 .0023968426861464883
+	   .99999711318834 .002402834781344168
+	   .9999970987723311 .0024088268764555732
+	   .9999970843204169 .002414818971480488
+	   .9999970698325974 .002420811066418698
+	   .9999970553088726 .0024268031612699878
+	   .9999970407492426 .002432795256034142
+	   .9999970261537071 .002438787350710946
+	   .9999970115222664 .002444779445300184
+	   .9999969968549204 .0024507715398016418
+	   .9999969821516691 .002456763634215103
+	   .9999969674125124 .002462755728540353
+	   .9999969526374506 .0024687478227771774
+	   .9999969378264834 .00247473991692536
+	   .9999969229796108 .002480732010984686
+	   .999996908096833 .0024867241049549406
+	   .9999968931781499 .002492716198835908
+	   .9999968782235614 .0024987082926273734
+	   .9999968632330677 .002504700386329122
+	   .9999968482066687 .002510692479940938
+	   .9999968331443644 .0025166845734626068
+	   .9999968180461547 .0025226766668939127
+	   .9999968029120399 .002528668760234641
+	   .9999967877420196 .002534660853484576
+	   .9999967725360941 .0025406529466435036
+	   .9999967572942633 .002546645039711208
+	   .9999967420165272 .002552637132687474
+	   .9999967267028858 .002558629225572086
+	   .9999967113533391 .0025646213183648297
+	   .9999966959678871 .0025706134110654896
+	   .9999966805465298 .002576605503673851
+	   .9999966650892672 .0025825975961896977
+	   .9999966495960994 .0025885896886128153
+	   .9999966340670262 .0025945817809429885
+	   .9999966185020478 .0026005738731800024
+	   .9999966029011641 .0026065659653236417
+	   .999996587264375 .002612558057373691
+	   .9999965715916808 .002618550149329935
+	   .9999965558830811 .0026245422411921592
+	   .9999965401385762 .002630534332960148
+	   .9999965243581661 .002636526424633687
+	   .9999965085418506 .0026425185162125596
+	   .9999964926896299 .0026485106076965517
+	   .9999964768015038 .0026545026990854484
+	   .9999964608774725 .0026604947903790337
+	   .9999964449175359 .0026664868815770926
+	   .999996428921694 .0026724789726794104
+	   .9999964128899468 .002678471063685772
+	   .9999963968222944 .0026844631545959617
+	   .9999963807187366 .002690455245409765
+	   .9999963645792737 .002696447336126966
+	   .9999963484039053 .00270243942674735
+	   .9999963321926317 .002708431517270702
+	   .9999963159454529 .0027144236076968066
+	   .9999962996623687 .0027204156980254485
+	   .9999962833433793 .002726407788256413
+	   .9999962669884847 .002732399878389485
+	   .9999962505976846 .0027383919684244484
+	   .9999962341709794 .002744384058361089
+	   .9999962177083689 .0027503761481991913
+	   .999996201209853 .0027563682379385403
+	   .9999961846754319 .0027623603275789207
+	   .9999961681051056 .0027683524171201175
+	   .999996151498874 .002774344506561915
+	   .9999961348567371 .002780336595904099
+	   .9999961181786949 .0027863286851464537
+	   .9999961014647475 .0027923207742887642
+	   .9999960847148948 .0027983128633308155
+	   .9999960679291368 .002804304952272392
+	   .9999960511074735 .002810297041113279
+	   .9999960342499049 .0028162891298532606
+	   .9999960173564312 .0028222812184921227
+	   .9999960004270521 .002828273307029649
+	   .9999959834617678 .002834265395465626
+	   .9999959664605781 .0028402574837998367
+	   .9999959494234832 .002846249572032067
+	   .9999959323504831 .0028522416601621014
+	   .9999959152415777 .002858233748189725
+	   .999995898096767 .002864225836114723
+	   .9999958809160512 .0028702179239368793
+	   .9999958636994299 .0028762100116559793
+	   .9999958464469034 .0028822020992718077
+	   .9999958291584717 .0028881941867841495
+	   .9999958118341348 .0028941862741927895
+	   .9999957944738925 .0029001783614975127
+	   .999995777077745 .002906170448698104
+	   .9999957596456922 .0029121625357943475
+	   .9999957421777342 .002918154622786029
+	   .999995724673871 .0029241467096729327
+	   .9999957071341024 .002930138796454844
+	   .9999956895584287 .0029361308831315474
+	   .9999956719468496 .0029421229697028273
+	   .9999956542993652 .0029481150561684695
+	   .9999956366159757 .0029541071425282584
+	   .9999956188966809 .002960099228781979
+	   .9999956011414808 .002966091314929416
+	   .9999955833503754 .002972083400970354
+	   .9999955655233649 .0029780754869045785
+	   .9999955476604491 .0029840675727318736
+	   .999995529761628 .002990059658452025
+	   .9999955118269016 .0029960517440648163
+	   .99999549385627 .0030020438295700336
+	   .9999954758497331 .0030080359149674612
+	   .999995457807291 .003014028000256884
+	   .9999954397289438 .003020020085438087
+	   .9999954216146911 .0030260121705108552
+	   .9999954034645333 .003032004255474973
+	   .9999953852784702 .003037996340330225
+	   .9999953670565019 .003043988425076397
+	   .9999953487986284 .003049980509713273
+	   .9999953305048496 .0030559725942406386
+	   .9999953121751655 .003061964678658278
+	   )))
+
+
+(define high-lut
+  (list->f64vector '(1. 0.
+	   .9999999999999999 1.1703344634137277e-8
+	   .9999999999999998 2.3406689268274554e-8
+	   .9999999999999993 3.5110033902411824e-8
+	   .9999999999999989 4.6813378536549095e-8
+	   .9999999999999983 5.851672317068635e-8
+	   .9999999999999976 7.022006780482361e-8
+	   .9999999999999967 8.192341243896085e-8
+	   .9999999999999957 9.362675707309808e-8
+	   .9999999999999944 1.0533010170723531e-7
+	   .9999999999999931 1.170334463413725e-7
+	   .9999999999999917 1.287367909755097e-7
+	   .9999999999999901 1.4044013560964687e-7
+	   .9999999999999885 1.5214348024378403e-7
+	   .9999999999999866 1.6384682487792116e-7
+	   .9999999999999846 1.7555016951205827e-7
+	   .9999999999999825 1.8725351414619535e-7
+	   .9999999999999802 1.989568587803324e-7
+	   .9999999999999778 2.1066020341446942e-7
+	   .9999999999999752 2.2236354804860645e-7
+	   .9999999999999726 2.3406689268274342e-7
+	   .9999999999999698 2.4577023731688034e-7
+	   .9999999999999668 2.5747358195101726e-7
+	   .9999999999999638 2.6917692658515413e-7
+	   .9999999999999606 2.8088027121929094e-7
+	   .9999999999999571 2.9258361585342776e-7
+	   .9999999999999537 3.042869604875645e-7
+	   .99999999999995 3.159903051217012e-7
+	   .9999999999999463 3.276936497558379e-7
+	   .9999999999999424 3.3939699438997453e-7
+	   .9999999999999384 3.5110033902411114e-7
+	   .9999999999999342 3.6280368365824763e-7
+	   .9999999999999298 3.7450702829238413e-7
+	   .9999999999999254 3.8621037292652057e-7
+	   .9999999999999208 3.979137175606569e-7
+	   .9999999999999161 4.0961706219479325e-7
+	   .9999999999999113 4.2132040682892953e-7
+	   .9999999999999063 4.330237514630657e-7
+	   .9999999999999011 4.447270960972019e-7
+	   .9999999999998959 4.5643044073133796e-7
+	   .9999999999998904 4.68133785365474e-7
+	   .9999999999998849 4.7983712999961e-7
+	   .9999999999998792 4.915404746337459e-7
+	   .9999999999998733 5.032438192678817e-7
+	   .9999999999998674 5.149471639020175e-7
+	   .9999999999998613 5.266505085361531e-7
+	   .9999999999998551 5.383538531702888e-7
+	   .9999999999998487 5.500571978044243e-7
+	   .9999999999998422 5.617605424385598e-7
+	   .9999999999998356 5.734638870726952e-7
+	   .9999999999998288 5.851672317068305e-7
+	   .9999999999998219 5.968705763409657e-7
+	   .9999999999998148 6.085739209751009e-7
+	   .9999999999998076 6.202772656092359e-7
+	   .9999999999998003 6.319806102433709e-7
+	   .9999999999997928 6.436839548775058e-7
+	   .9999999999997853 6.553872995116406e-7
+	   .9999999999997775 6.670906441457753e-7
+	   .9999999999997696 6.7879398877991e-7
+	   .9999999999997616 6.904973334140445e-7
+	   .9999999999997534 7.02200678048179e-7
+	   .9999999999997452 7.139040226823132e-7
+	   .9999999999997368 7.256073673164475e-7
+	   .9999999999997282 7.373107119505817e-7
+	   .9999999999997194 7.490140565847157e-7
+	   .9999999999997107 7.607174012188497e-7
+	   .9999999999997017 7.724207458529835e-7
+	   .9999999999996926 7.841240904871172e-7
+	   .9999999999996834 7.958274351212508e-7
+	   .9999999999996739 8.075307797553844e-7
+	   .9999999999996644 8.192341243895178e-7
+	   .9999999999996547 8.309374690236511e-7
+	   .999999999999645 8.426408136577842e-7
+	   .9999999999996351 8.543441582919173e-7
+	   .999999999999625 8.660475029260503e-7
+	   .9999999999996148 8.777508475601831e-7
+	   .9999999999996044 8.894541921943158e-7
+	   .999999999999594 9.011575368284484e-7
+	   .9999999999995833 9.128608814625808e-7
+	   .9999999999995726 9.245642260967132e-7
+	   .9999999999995617 9.362675707308454e-7
+	   .9999999999995507 9.479709153649775e-7
+	   .9999999999995395 9.596742599991095e-7
+	   .9999999999995283 9.713776046332412e-7
+	   .9999999999995168 9.83080949267373e-7
+	   .9999999999995052 9.947842939015044e-7
+	   .9999999999994935 1.006487638535636e-6
+	   .9999999999994816 1.0181909831697673e-6
+	   .9999999999994696 1.0298943278038984e-6
+	   .9999999999994575 1.0415976724380293e-6
+	   .9999999999994453 1.0533010170721601e-6
+	   .9999999999994329 1.065004361706291e-6
+	   .9999999999994204 1.0767077063404215e-6
+	   .9999999999994077 1.088411050974552e-6
+	   .9999999999993949 1.1001143956086822e-6
+	   .9999999999993819 1.1118177402428122e-6
+	   .9999999999993688 1.1235210848769423e-6
+	   .9999999999993556 1.135224429511072e-6
+	   .9999999999993423 1.1469277741452017e-6
+	   .9999999999993288 1.1586311187793313e-6
+	   .9999999999993151 1.1703344634134605e-6
+	   .9999999999993014 1.1820378080475897e-6
+	   .9999999999992875 1.1937411526817187e-6
+	   .9999999999992735 1.2054444973158477e-6
+	   .9999999999992593 1.2171478419499764e-6
+	   .9999999999992449 1.2288511865841048e-6
+	   .9999999999992305 1.2405545312182331e-6
+	   .999999999999216 1.2522578758523615e-6
+	   .9999999999992012 1.2639612204864894e-6
+	   .9999999999991863 1.2756645651206173e-6
+	   .9999999999991713 1.287367909754745e-6
+	   .9999999999991562 1.2990712543888725e-6
+	   .9999999999991409 1.3107745990229998e-6
+	   .9999999999991255 1.3224779436571269e-6
+	   .9999999999991099 1.3341812882912537e-6
+	   .9999999999990943 1.3458846329253806e-6
+	   .9999999999990785 1.3575879775595072e-6
+	   .9999999999990625 1.3692913221936337e-6
+	   .9999999999990464 1.3809946668277597e-6
+	   .9999999999990302 1.3926980114618857e-6
+	   .9999999999990138 1.4044013560960117e-6
+	   .9999999999989974 1.4161047007301373e-6
+	   .9999999999989807 1.4278080453642627e-6
+	   .9999999999989639 1.439511389998388e-6
+	   .999999999998947 1.451214734632513e-6
+	   .99999999999893 1.462918079266638e-6
+	   .9999999999989128 1.4746214239007625e-6
+	   .9999999999988954 1.486324768534887e-6
+	   .999999999998878 1.4980281131690111e-6
+	   .9999999999988604 1.5097314578031353e-6
+	   .9999999999988426 1.5214348024372591e-6
+	   .9999999999988247 1.5331381470713828e-6
+	   .9999999999988067 1.544841491705506e-6
+	   .9999999999987886 1.5565448363396294e-6
+	   .9999999999987703 1.5682481809737524e-6
+	   .9999999999987519 1.579951525607875e-6
+	   .9999999999987333 1.5916548702419977e-6
+	   .9999999999987146 1.60335821487612e-6
+	   .9999999999986958 1.615061559510242e-6
+	   .9999999999986768 1.626764904144364e-6
+	   .9999999999986577 1.6384682487784858e-6
+	   .9999999999986384 1.6501715934126072e-6
+	   .9999999999986191 1.6618749380467283e-6
+	   .9999999999985996 1.6735782826808495e-6
+	   .9999999999985799 1.6852816273149702e-6
+	   .9999999999985602 1.6969849719490907e-6
+	   .9999999999985402 1.708688316583211e-6
+	   .9999999999985201 1.720391661217331e-6
+	   .9999999999985 1.732095005851451e-6
+	   .9999999999984795 1.7437983504855706e-6
+	   .9999999999984591 1.7555016951196899e-6
+	   .9999999999984385 1.767205039753809e-6
+	   .9999999999984177 1.778908384387928e-6
+	   .9999999999983968 1.7906117290220465e-6
+	   .9999999999983759 1.802315073656165e-6
+	   .9999999999983546 1.814018418290283e-6
+	   .9999999999983333 1.825721762924401e-6
+	   .9999999999983119 1.8374251075585186e-6
+	   .9999999999982904 1.8491284521926361e-6
+	   .9999999999982686 1.8608317968267533e-6
+	   .9999999999982468 1.8725351414608702e-6
+	   .9999999999982249 1.8842384860949866e-6
+	   .9999999999982027 1.8959418307291031e-6
+	   .9999999999981805 1.9076451753632194e-6
+	   .999999999998158 1.919348519997335e-6
+	   .9999999999981355 1.9310518646314507e-6
+	   .9999999999981128 1.942755209265566e-6
+	   .9999999999980901 1.954458553899681e-6
+	   .9999999999980671 1.966161898533796e-6
+	   .999999999998044 1.9778652431679103e-6
+	   .9999999999980208 1.9895685878020246e-6
+	   .9999999999979975 2.0012719324361386e-6
+	   .999999999997974 2.012975277070252e-6
+	   .9999999999979503 2.0246786217043656e-6
+	   .9999999999979265 2.0363819663384787e-6
+	   .9999999999979027 2.048085310972592e-6
+	   .9999999999978786 2.0597886556067045e-6
+	   .9999999999978545 2.0714920002408167e-6
+	   .9999999999978302 2.0831953448749286e-6
+	   .9999999999978058 2.0948986895090404e-6
+	   .9999999999977811 2.106602034143152e-6
+	   .9999999999977564 2.118305378777263e-6
+	   .9999999999977315 2.1300087234113738e-6
+	   .9999999999977065 2.1417120680454843e-6
+	   .9999999999976814 2.153415412679595e-6
+	   .9999999999976561 2.1651187573137046e-6
+	   .9999999999976307 2.1768221019478143e-6
+	   .9999999999976051 2.188525446581924e-6
+	   .9999999999975795 2.200228791216033e-6
+	   .9999999999975536 2.2119321358501417e-6
+	   .9999999999975278 2.22363548048425e-6
+	   .9999999999975017 2.2353388251183586e-6
+	   .9999999999974754 2.247042169752466e-6
+	   .999999999997449 2.2587455143865738e-6
+	   .9999999999974225 2.2704488590206814e-6
+	   .9999999999973959 2.282152203654788e-6
+	   .9999999999973691 2.293855548288895e-6
+	   .9999999999973422 2.305558892923001e-6
+	   .9999999999973151 2.317262237557107e-6
+	   .999999999997288 2.328965582191213e-6
+	   .9999999999972606 2.340668926825318e-6
+	   .9999999999972332 2.352372271459423e-6
+	   .9999999999972056 2.364075616093528e-6
+	   .9999999999971778 2.3757789607276323e-6
+	   .99999999999715 2.3874823053617365e-6
+	   .999999999997122 2.3991856499958403e-6
+	   .9999999999970938 2.4108889946299437e-6
+	   .9999999999970656 2.4225923392640466e-6
+	   .9999999999970371 2.4342956838981495e-6
+	   .9999999999970085 2.445999028532252e-6
+	   .9999999999969799 2.457702373166354e-6
+	   .999999999996951 2.4694057178004558e-6
+	   .999999999996922 2.4811090624345574e-6
+	   .9999999999968929 2.4928124070686583e-6
+	   .9999999999968637 2.504515751702759e-6
+	   .9999999999968343 2.5162190963368595e-6
+	   .9999999999968048 2.5279224409709594e-6
+	   .9999999999967751 2.5396257856050594e-6
+	   .9999999999967454 2.5513291302391585e-6
+	   .9999999999967154 2.5630324748732576e-6
+	   .9999999999966853 2.5747358195073563e-6
+	   .9999999999966551 2.5864391641414546e-6
+	   .9999999999966248 2.5981425087755525e-6
+	   .9999999999965944 2.6098458534096503e-6
+	   .9999999999965637 2.6215491980437473e-6
+	   .999999999996533 2.6332525426778443e-6
+	   .9999999999965021 2.644955887311941e-6
+	   .999999999996471 2.656659231946037e-6
+	   .99999999999644 2.6683625765801328e-6
+	   .9999999999964087 2.680065921214228e-6
+	   .9999999999963772 2.6917692658483234e-6
+	   .9999999999963456 2.703472610482418e-6
+	   .999999999996314 2.7151759551165123e-6
+	   .9999999999962821 2.7268792997506064e-6
+	   .9999999999962501 2.7385826443846996e-6
+	   .9999999999962179 2.750285989018793e-6
+	   .9999999999961857 2.761989333652886e-6
+	   .9999999999961533 2.7736926782869783e-6
+	   .9999999999961208 2.78539602292107e-6
+	   .9999999999960881 2.797099367555162e-6
+	   .9999999999960553 2.808802712189253e-6
+	   .9999999999960224 2.8205060568233443e-6
+	   .9999999999959893 2.832209401457435e-6
+	   .9999999999959561 2.8439127460915247e-6
+	   .9999999999959227 2.8556160907256145e-6
+	   .9999999999958893 2.867319435359704e-6
+	   .9999999999958556 2.879022779993793e-6
+	   .9999999999958219 2.8907261246278814e-6
+	   .9999999999957879 2.90242946926197e-6
+	   .999999999995754 2.9141328138960576e-6
+	   .9999999999957198 2.925836158530145e-6
+	   .9999999999956855 2.9375395031642317e-6
+	   .999999999995651 2.9492428477983186e-6
+	   .9999999999956164 2.9609461924324046e-6
+	   .9999999999955816 2.9726495370664905e-6
+	   .9999999999955468 2.9843528817005757e-6
+	   .9999999999955118 2.996056226334661e-6
+	   .9999999999954767 3.007759570968745e-6
+	   .9999999999954414 3.0194629156028294e-6
+	   .999999999995406 3.0311662602369133e-6
+	   .9999999999953705 3.0428696048709963e-6
+	   .9999999999953348 3.0545729495050794e-6
+	   .999999999995299 3.066276294139162e-6
+	   .999999999995263 3.0779796387732437e-6
+	   .9999999999952269 3.0896829834073255e-6
+	   .9999999999951907 3.101386328041407e-6
+	   .9999999999951543 3.1130896726754873e-6
+	   .9999999999951178 3.1247930173095678e-6
+	   .9999999999950812 3.136496361943648e-6
+	   .9999999999950444 3.148199706577727e-6
+	   .9999999999950075 3.1599030512118063e-6
+	   .9999999999949705 3.171606395845885e-6
+	   .9999999999949333 3.183309740479963e-6
+	   .999999999994896 3.195013085114041e-6
+	   .9999999999948584 3.206716429748118e-6
+	   .9999999999948209 3.218419774382195e-6
+	   .9999999999947832 3.2301231190162714e-6
+	   .9999999999947453 3.2418264636503477e-6
+	   .9999999999947072 3.253529808284423e-6
+	   .9999999999946692 3.265233152918498e-6
+	   .9999999999946309 3.276936497552573e-6
+	   .9999999999945924 3.288639842186647e-6
+	   .9999999999945539 3.300343186820721e-6
+	   .9999999999945152 3.312046531454794e-6
+	   .9999999999944763 3.323749876088867e-6
+	   .9999999999944373 3.3354532207229395e-6
+	   .9999999999943983 3.3471565653570115e-6
+	   .9999999999943591 3.358859909991083e-6
+	   .9999999999943197 3.370563254625154e-6
+	   .9999999999942801 3.3822665992592245e-6
+	   .9999999999942405 3.3939699438932944e-6
+	   .9999999999942008 3.4056732885273643e-6
+	   .9999999999941608 3.4173766331614334e-6
+	   .9999999999941207 3.429079977795502e-6
+	   .9999999999940805 3.4407833224295702e-6
+	   .9999999999940402 3.452486667063638e-6
+	   .9999999999939997 3.4641900116977054e-6
+	   .999999999993959 3.4758933563317723e-6
+	   .9999999999939183 3.4875967009658384e-6
+	   .9999999999938775 3.4993000455999045e-6
+	   .9999999999938364 3.5110033902339697e-6
+	   .9999999999937953 3.5227067348680345e-6
+	   .999999999993754 3.534410079502099e-6
+	   .9999999999937126 3.546113424136163e-6
+	   .999999999993671 3.5578167687702264e-6
+	   .9999999999936293 3.5695201134042896e-6
+	   .9999999999935875 3.581223458038352e-6
+	   .9999999999935454 3.592926802672414e-6
+	   .9999999999935033 3.6046301473064755e-6
+	   .9999999999934611 3.6163334919405365e-6
+	   .9999999999934187 3.628036836574597e-6
+	   .9999999999933762 3.639740181208657e-6
+	   .9999999999933334 3.6514435258427166e-6
+	   .9999999999932907 3.6631468704767755e-6
+	   .9999999999932477 3.674850215110834e-6
+	   .9999999999932047 3.686553559744892e-6
+	   .9999999999931615 3.6982569043789496e-6
+	   .9999999999931181 3.7099602490130064e-6
+	   .9999999999930747 3.7216635936470627e-6
+	   .999999999993031 3.733366938281119e-6
+	   .9999999999929873 3.745070282915174e-6
+	   .9999999999929433 3.756773627549229e-6
+	   .9999999999928992 3.768476972183284e-6
+	   .9999999999928552 3.7801803168173377e-6
+	   .9999999999928109 3.791883661451391e-6
+	   .9999999999927663 3.803587006085444e-6
+	   .9999999999927218 3.8152903507194965e-6
+	   .9999999999926771 3.826993695353548e-6
+	   .9999999999926322 3.838697039987599e-6
+	   .9999999999925873 3.85040038462165e-6
+	   .9999999999925421 3.862103729255701e-6
+	   .9999999999924968 3.87380707388975e-6
+	   .9999999999924514 3.885510418523799e-6
+	   .9999999999924059 3.897213763157848e-6
+	   .9999999999923602 3.9089171077918965e-6
+	   .9999999999923144 3.9206204524259435e-6
+	   .9999999999922684 3.9323237970599905e-6
+	   .9999999999922223 3.9440271416940376e-6
+	   .9999999999921761 3.955730486328084e-6
+	   .9999999999921297 3.967433830962129e-6
+	   .9999999999920832 3.9791371755961736e-6
+	   .9999999999920366 3.990840520230218e-6
+	   .9999999999919899 4.002543864864262e-6
+	   .9999999999919429 4.014247209498305e-6
+	   .9999999999918958 4.025950554132348e-6
+	   .9999999999918486 4.03765389876639e-6
+	   .9999999999918013 4.049357243400431e-6
+	   .9999999999917539 4.061060588034472e-6
+	   .9999999999917063 4.072763932668513e-6
+	   .9999999999916586 4.084467277302553e-6
+	   .9999999999916107 4.096170621936592e-6
+	   .9999999999915626 4.107873966570632e-6
+	   .9999999999915146 4.119577311204669e-6
+	   .9999999999914663 4.131280655838707e-6
+	   .9999999999914179 4.142984000472745e-6
+	   .9999999999913692 4.154687345106781e-6
+	   .9999999999913206 4.166390689740817e-6
+	   .9999999999912718 4.178094034374852e-6
+	   .9999999999912228 4.189797379008887e-6
+	   .9999999999911737 4.201500723642921e-6
+	   .9999999999911244 4.213204068276955e-6
+	   .999999999991075 4.224907412910988e-6
+	   .9999999999910255 4.236610757545021e-6
+	   .9999999999909759 4.248314102179053e-6
+	   .9999999999909261 4.260017446813084e-6
+	   .9999999999908762 4.271720791447115e-6
+	   .9999999999908261 4.283424136081145e-6
+	   .9999999999907759 4.295127480715175e-6
+	   .9999999999907256 4.306830825349204e-6
+	   .9999999999906751 4.3185341699832325e-6
+	   .9999999999906245 4.33023751461726e-6
+	   .9999999999905738 4.3419408592512875e-6
+	   .9999999999905229 4.353644203885314e-6
+	   .9999999999904718 4.36534754851934e-6
+	   .9999999999904207 4.377050893153365e-6
+	   .9999999999903694 4.38875423778739e-6
+	   .999999999990318 4.400457582421414e-6
+	   .9999999999902665 4.4121609270554384e-6
+	   .9999999999902147 4.423864271689461e-6
+	   .9999999999901629 4.435567616323483e-6
+	   .9999999999901109 4.447270960957506e-6
+	   .9999999999900587 4.458974305591527e-6
+	   .9999999999900065 4.470677650225547e-6
+	   .9999999999899541 4.482380994859567e-6
+	   .9999999999899016 4.494084339493587e-6
+	   .9999999999898489 4.5057876841276054e-6
+	   .9999999999897962 4.517491028761624e-6
+	   .9999999999897432 4.529194373395641e-6
+	   .9999999999896901 4.5408977180296584e-6
+	   .999999999989637 4.552601062663675e-6
+	   .9999999999895836 4.564304407297691e-6
+	   .99999999998953 4.5760077519317055e-6
+	   .9999999999894764 4.5877110965657195e-6
+	   .9999999999894227 4.5994144411997335e-6
+	   .9999999999893688 4.611117785833747e-6
+	   .9999999999893148 4.622821130467759e-6
+	   .9999999999892606 4.634524475101771e-6
+	   .9999999999892063 4.646227819735783e-6
+	   .9999999999891518 4.657931164369793e-6
+	   .9999999999890973 4.669634509003803e-6
+	   .9999999999890425 4.681337853637813e-6
+	   .9999999999889877 4.693041198271821e-6
+	   .9999999999889327 4.704744542905829e-6
+	   .9999999999888776 4.716447887539837e-6
+	   .9999999999888223 4.728151232173843e-6
+	   .9999999999887669 4.73985457680785e-6
+	   .9999999999887114 4.751557921441855e-6
+	   .9999999999886556 4.76326126607586e-6
+	   .9999999999885999 4.774964610709864e-6
+	   .9999999999885439 4.786667955343868e-6
+	   .9999999999884878 4.798371299977871e-6
+	   .9999999999884316 4.810074644611873e-6
+	   .9999999999883752 4.821777989245874e-6
+	   .9999999999883187 4.833481333879875e-6
+	   .9999999999882621 4.845184678513876e-6
+	   .9999999999882053 4.856888023147875e-6
+	   .9999999999881484 4.868591367781874e-6
+	   .9999999999880914 4.880294712415872e-6
+	   .9999999999880341 4.89199805704987e-6
+	   .9999999999879768 4.903701401683867e-6
+	   .9999999999879194 4.915404746317863e-6
+	   .9999999999878618 4.9271080909518585e-6
+	   .9999999999878041 4.938811435585853e-6
+	   .9999999999877462 4.9505147802198475e-6
+	   .9999999999876882 4.962218124853841e-6
+	   .99999999998763 4.973921469487834e-6
+	   .9999999999875717 4.985624814121826e-6
+	   .9999999999875133 4.997328158755817e-6
+	   .9999999999874548 5.009031503389808e-6
+	   .9999999999873961 5.0207348480237985e-6
+	   .9999999999873372 5.032438192657788e-6
+	   .9999999999872783 5.0441415372917765e-6
+	   .9999999999872192 5.055844881925764e-6
+	   .9999999999871599 5.067548226559752e-6
+	   .9999999999871007 5.079251571193739e-6
+	   .9999999999870411 5.090954915827725e-6
+	   .9999999999869814 5.10265826046171e-6
+	   .9999999999869217 5.1143616050956945e-6
+	   .9999999999868617 5.126064949729678e-6
+	   .9999999999868017 5.1377682943636615e-6
+	   .9999999999867415 5.149471638997644e-6
+	   .9999999999866811 5.161174983631626e-6
+	   .9999999999866207 5.172878328265607e-6
+	   .9999999999865601 5.184581672899587e-6
+	   .9999999999864994 5.196285017533567e-6
+	   .9999999999864384 5.2079883621675455e-6
+	   .9999999999863775 5.219691706801524e-6
+	   .9999999999863163 5.2313950514355015e-6
+	   .999999999986255 5.243098396069478e-6
+	   .9999999999861935 5.254801740703454e-6
+	   .999999999986132 5.266505085337429e-6
+	   .9999999999860703 5.278208429971404e-6
+	   .9999999999860084 5.289911774605378e-6
+	   .9999999999859465 5.301615119239351e-6
+	   .9999999999858843 5.313318463873323e-6
+	   .9999999999858221 5.325021808507295e-6
+	   .9999999999857597 5.336725153141267e-6
+	   .9999999999856971 5.3484284977752366e-6
+	   .9999999999856345 5.360131842409206e-6
+	   .9999999999855717 5.371835187043175e-6
+	   .9999999999855087 5.383538531677143e-6
+	   .9999999999854456 5.3952418763111104e-6
+	   .9999999999853825 5.406945220945077e-6
+	   .9999999999853191 5.418648565579043e-6
+	   .9999999999852557 5.4303519102130076e-6
+	   .9999999999851921 5.4420552548469724e-6
+	   .9999999999851282 5.453758599480936e-6
+	   .9999999999850644 5.465461944114899e-6
+	   .9999999999850003 5.47716528874886e-6
+	   .9999999999849362 5.488868633382822e-6
+	   .9999999999848719 5.500571978016782e-6
+	   .9999999999848074 5.512275322650742e-6
+	   .9999999999847429 5.523978667284702e-6
+	   .9999999999846781 5.53568201191866e-6
+	   .9999999999846133 5.547385356552617e-6
+	   .9999999999845482 5.5590887011865745e-6
+	   .9999999999844832 5.57079204582053e-6
+	   .9999999999844179 5.582495390454486e-6
+	   .9999999999843525 5.59419873508844e-6
+	   .9999999999842869 5.605902079722394e-6
+	   .9999999999842213 5.617605424356347e-6
+	   .9999999999841555 5.629308768990299e-6
+	   .9999999999840895 5.641012113624251e-6
+	   .9999999999840234 5.652715458258201e-6
+	   .9999999999839572 5.664418802892152e-6
+	   .9999999999838908 5.6761221475261e-6
+	   .9999999999838243 5.687825492160048e-6
+	   .9999999999837577 5.699528836793996e-6
+	   .9999999999836909 5.711232181427943e-6
+	   .999999999983624 5.722935526061889e-6
+	   .9999999999835569 5.734638870695834e-6
+	   .9999999999834898 5.746342215329779e-6
+	   .9999999999834225 5.758045559963722e-6
+	   .999999999983355 5.769748904597665e-6
+	   .9999999999832874 5.781452249231607e-6
+	   .9999999999832196 5.793155593865548e-6
+	   .9999999999831518 5.804858938499489e-6
+	   .9999999999830838 5.816562283133429e-6
+	   .9999999999830157 5.8282656277673675e-6
+	   .9999999999829474 5.839968972401306e-6
+	   .9999999999828789 5.851672317035243e-6
+	   .9999999999828104 5.86337566166918e-6
+	   .9999999999827417 5.875079006303115e-6
+	   .9999999999826729 5.88678235093705e-6
+	   .9999999999826039 5.898485695570985e-6
+	   .9999999999825349 5.910189040204917e-6
+	   .9999999999824656 5.92189238483885e-6
+	   .9999999999823962 5.933595729472782e-6
+	   .9999999999823267 5.945299074106713e-6
+	   .9999999999822571 5.957002418740643e-6
+	   .9999999999821872 5.9687057633745715e-6
+	   .9999999999821173 5.9804091080085e-6
+	   )))
+
+(define (make-w log-n)
+  (let ((n (expt 2 log-n)))  ;; number of complexes
+    (if (fx<= n lut-table-size)
+	low-lut
+	(let ((result (make-f64vector (fx* 2 n))))
+	  
+	  (define (copy-low-lut)
+	    (do ((i 0 (fx+ i 1)))
+		((fx= i lut-table-size))
+	      (let ((index (fx* i 2)))
+		(f64vector-set!
+		 result
+		 index
+		 (f64vector-ref low-lut index))
+		(f64vector-set!
+		 result
+		 (fx+ index 1)
+		 (f64vector-ref low-lut (fx+ index 1))))))
+
+	  (define (extend-lut multiplier-lut bit-reverse-size bit-reverse-multiplier start end)
+
+	    (define (bit-reverse x n)
+	      (declare (not interrupts-enabled))
+	      (do ((i 0 (fx+ i 1))
+		   (x x (fxarithmetic-shift-right x 1))
+		   (result 0 (fx+ (fx* result 2)
+				  (bitwise-and x 1))))
+		  ((fx= i n) result)))
+
+	    (let loop ((i start)
+		       (j 1))
+	      (if (fx< i end)
+		  (let* ((multiplier-index
+			  (fx* 2
+			       (fx* (bit-reverse j bit-reverse-size)
+				    bit-reverse-multiplier)))
+			 (multiplier-real
+			  (f64vector-ref multiplier-lut multiplier-index))
+			 (multiplier-imag
+			  (f64vector-ref multiplier-lut (fx+ multiplier-index 1))))
+		    (let inner ((i i)
+				(k 0))
+		      ;; we copy complex multiples of all entries below
+		      ;; start to entries starting at start
+		      (if (fx< k start)
+			  (let* ((index
+				  (fx* k 2))
+				 (real
+				  (f64vector-ref result index))
+				 (imag
+				  (f64vector-ref result (fx+ index 1)))
+				 (result-real
+				  (fl- (fl* multiplier-real real)
+				       (fl* multiplier-imag imag)))
+				 (result-imag
+				  (fl+ (fl* multiplier-real imag)
+				       (fl* multiplier-imag real)))
+				 (result-index (fx* i 2)))
+			    (f64vector-set! result result-index result-real)
+			    (f64vector-set! result (fx+ result-index 1) result-imag)
+			    (inner (fx+ i 1)
+				   (fx+ k 1)))
+			  (loop i
+				(fx+ j 1)))))
+		  result)))
+
+	  (cond ((fx<= n lut-table-size^2)
+		 (copy-low-lut)
+		 (extend-lut med-lut
+			     (fx- log-n log-lut-table-size)
+			     (fxarithmetic-shift-left 1 (fx- (fx* 2 log-lut-table-size) log-n))
+			     lut-table-size
+			     n))
+		((fx<= n lut-table-size^3)
+		 (copy-low-lut)
+		 (extend-lut med-lut
+			     log-lut-table-size
+			     1
+			     lut-table-size
+			     lut-table-size^2)
+		 (extend-lut high-lut
+			     (fx- log-n (fx* 2 log-lut-table-size))
+			     (fxarithmetic-shift-left 1 (fx- (fx* 3 log-lut-table-size) log-n))
+			     lut-table-size^2
+			     n))
+		(else
+		 (error "asking for too large a table")))))))
+
+(define (direct-fft-recursive-4 a W-table)
+
+  ;; This is a direcct complex fft, using a decimation-in-time
+  ;; algorithm with inputs in natural order and outputs in
+  ;; bit-reversed order.  The table of "twiddle" factors is in
+  ;; bit-reversed order.
+
+  ;; this is from page 66 of Chu and George, except that we have
+  ;; combined passes in pairs to cut the number of passes through
+  ;; the vector a
+
+  (let ((W (f64vector 0. 0. 0. 0.)))
+
+    (define (main-loop M N K SizeOfGroup)
+
+      (let inner-loop ((K K)
+		       (JFirst M))
+
+	(if (fx< JFirst N)
+
+	    (let* ((JLast  (fx+ JFirst SizeOfGroup)))
+
+	      (if (fxeven? K)
+		  (begin
+		    (f64vector-set! W 0 (f64vector-ref W-table K))
+		    (f64vector-set! W 1 (f64vector-ref W-table (fx+ K 1))))
+		  (begin
+		    (f64vector-set! W 0 (fl- 0. (f64vector-ref W-table K)))
+		    (f64vector-set! W 1 (f64vector-ref W-table (fx- K 1)))))
+
+	      ;; we know the that the next two complex roots of
+	      ;; unity have index 2K and 2K+1 so that the 2K+1
+	      ;; index root can be gotten from the 2K index root
+	      ;; in the same way that we get W_0 and W_1 from the
+	      ;; table depending on whether K is even or not
+
+	      (f64vector-set! W 2 (f64vector-ref W-table (fx* K 2)))
+	      (f64vector-set! W 3 (f64vector-ref W-table (fx+ (fx* K 2) 1)))
+
+	      (let J-loop ((J0 JFirst))
+		(if (fx< J0 JLast)
+
+		    (let* ((J0 J0)
+			   (J1 (fx+ J0 1))
+			   (J2 (fx+ J0 SizeOfGroup))
+			   (J3 (fx+ J2 1))
+			   (J4 (fx+ J2 SizeOfGroup))
+			   (J5 (fx+ J4 1))
+			   (J6 (fx+ J4 SizeOfGroup))
+			   (J7 (fx+ J6 1)))
+
+		      (let ((W_0  (f64vector-ref W 0))
+			    (W_1  (f64vector-ref W 1))
+			    (W_2  (f64vector-ref W 2))
+			    (W_3  (f64vector-ref W 3))
+			    (a_J0 (f64vector-ref a J0))
+			    (a_J1 (f64vector-ref a J1))
+			    (a_J2 (f64vector-ref a J2))
+			    (a_J3 (f64vector-ref a J3))
+			    (a_J4 (f64vector-ref a J4))
+			    (a_J5 (f64vector-ref a J5))
+			    (a_J6 (f64vector-ref a J6))
+			    (a_J7 (f64vector-ref a J7)))
+
+			;; first we do the (overlapping) pairs of
+			;; butterflies with entries 2*SizeOfGroup
+			;; apart.
+
+			(let ((Temp_0 (fl- (fl* W_0 a_J4)
+					   (fl* W_1 a_J5)))
+			      (Temp_1 (fl+ (fl* W_0 a_J5)
+					   (fl* W_1 a_J4)))
+			      (Temp_2 (fl- (fl* W_0 a_J6)
+					   (fl* W_1 a_J7)))
+			      (Temp_3 (fl+ (fl* W_0 a_J7)
+					   (fl* W_1 a_J6))))
+
+			  (let ((a_J0 (fl+ a_J0 Temp_0))
+				(a_J1 (fl+ a_J1 Temp_1))
+				(a_J2 (fl+ a_J2 Temp_2))
+				(a_J3 (fl+ a_J3 Temp_3))
+				(a_J4 (fl- a_J0 Temp_0))
+				(a_J5 (fl- a_J1 Temp_1))
+				(a_J6 (fl- a_J2 Temp_2))
+				(a_J7 (fl- a_J3 Temp_3)))
+
+			    ;; now we do the two (disjoint) pairs
+			    ;; of butterflies distance SizeOfGroup
+			    ;; apart, the first pair with W2+W3i,
+			    ;; the second with -W3+W2i
+
+			    ;; we rewrite the multipliers so I
+			    ;; don't hurt my head too much when
+			    ;; thinking about them.
+
+			    (let ((W_0 W_2)
+				  (W_1 W_3)
+				  (W_2 (fl- 0. W_3))
+				  (W_3 W_2))
+
+			      (let ((Temp_0
+				     (fl- (fl* W_0 a_J2)
+					  (fl* W_1 a_J3)))
+				    (Temp_1
+				     (fl+ (fl* W_0 a_J3)
+					  (fl* W_1 a_J2)))
+				    (Temp_2
+				     (fl- (fl* W_2 a_J6)
+					  (fl* W_3 a_J7)))
+				    (Temp_3
+				     (fl+ (fl* W_2 a_J7)
+					  (fl* W_3 a_J6))))
+
+				(let ((a_J0 (fl+ a_J0 Temp_0))
+				      (a_J1 (fl+ a_J1 Temp_1))
+				      (a_J2 (fl- a_J0 Temp_0))
+				      (a_J3 (fl- a_J1 Temp_1))
+				      (a_J4 (fl+ a_J4 Temp_2))
+				      (a_J5 (fl+ a_J5 Temp_3))
+				      (a_J6 (fl- a_J4 Temp_2))
+				      (a_J7 (fl- a_J5 Temp_3)))
+
+				  (f64vector-set! a J0 a_J0)
+				  (f64vector-set! a J1 a_J1)
+				  (f64vector-set! a J2 a_J2)
+				  (f64vector-set! a J3 a_J3)
+				  (f64vector-set! a J4 a_J4)
+				  (f64vector-set! a J5 a_J5)
+				  (f64vector-set! a J6 a_J6)
+				  (f64vector-set! a J7 a_J7)
+
+				  (J-loop (fx+ J0 2)))))))))
+		    (inner-loop (fx+ K 1)
+				(fx+ JFirst (fx* SizeOfGroup 4)))))))))
+
+    (define (recursive-bit M N K SizeOfGroup)
+      (if (fx<= 2 SizeOfGroup)
+	  (begin
+	    (main-loop M N K SizeOfGroup)
+	    (if (fx< 2048 (fx- N M))
+		(let ((new-size (fxarithmetic-shift-right (fx- N M) 2)))
+		  (recursive-bit M
+				 (fx+ M new-size)
+				 (fx* K 4)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M new-size)
+				 (fx+ M (fx* new-size 2))
+				 (fx+ (fx* K 4) 1)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M (fx* new-size 2))
+				 (fx+ M (fx* new-size 3))
+				 (fx+ (fx* K 4) 2)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M (fx* new-size 3))
+				 N
+				 (fx+ (fx* K 4) 3)
+				 (fxarithmetic-shift-right SizeOfGroup 2)))
+		(recursive-bit M
+			       N
+			       (fx* K 4)
+			       (fxarithmetic-shift-right SizeOfGroup 2))))))
+
+    (define (radix-2-pass a)
+
+      ;; If we're here, the size of our (conceptually complex)
+      ;; array is not a power of 4, so we need to do a basic radix
+      ;; two pass with w=1 (so W[0]=1.0 and W[1] = 0.)  and then
+      ;; call recursive-bit appropriately on the two half arrays.
+
+      (declare (not interrupts-enabled))
+
+      (let ((SizeOfGroup
+	     (fxarithmetic-shift-right (f64vector-length a) 1)))
+	(let loop ((J0 0))
+	  (if (fx< J0 SizeOfGroup)
+	      (let ((J0 J0)
+		    (J2 (fx+ J0 SizeOfGroup)))
+		(let ((J1 (fx+ J0 1))
+		      (J3 (fx+ J2 1)))
+		  (let ((a_J0 (f64vector-ref a J0))
+			(a_J1 (f64vector-ref a J1))
+			(a_J2 (f64vector-ref a J2))
+			(a_J3 (f64vector-ref a J3)))
+		    (let ((a_J0 (fl+ a_J0 a_J2))
+			  (a_J1 (fl+ a_J1 a_J3))
+			  (a_J2 (fl- a_J0 a_J2))
+			  (a_J3 (fl- a_J1 a_J3)))
+		      (f64vector-set! a J0 a_J0)
+		      (f64vector-set! a J1 a_J1)
+		      (f64vector-set! a J2 a_J2)
+		      (f64vector-set! a J3 a_J3)
+		      (loop (fx+ J0 2))))))))))
+
+    (let* ((n (f64vector-length a))
+	   (log_n (two^p>=m n)))
+
+      ;; there are n/2 complex entries in a; if n/2 is not a power
+      ;; of 4, then do a single radix-2 pass and do the rest of
+      ;; the passes as radix-4 passes
+
+      (if (fxodd? log_n)
+	  (recursive-bit 0 n 0 (fxarithmetic-shift-right n 2))
+	  (let ((n/2 (fxarithmetic-shift-right n 1))
+		(n/8 (fxarithmetic-shift-right n 3)))
+	    (radix-2-pass a)
+	    (recursive-bit 0 n/2 0 n/8)
+	    (recursive-bit n/2 n 1 n/8))))))
+
+(define (inverse-fft-recursive-4 a W-table)
+
+  ;; This is an complex fft, using a decimation-in-frequency algorithm
+  ;; with inputs in bit-reversed order and outputs in natural order.
+
+  ;; The organization of the algorithm has little to do with the the
+  ;; associated algorithm on page 41 of Chu and George,
+  ;; I just reversed the operations of the direct algorithm given
+  ;; above (without dividing by 2 each time, so that this has to
+  ;; be "normalized" by dividing by N/2 at the end.
+
+  ;; The table of "twiddle" factors is in bit-reversed order.
+
+  (let ((W (f64vector 0. 0. 0. 0.)))
+
+    (define (main-loop M N K SizeOfGroup)
+      (let inner-loop ((K K)
+		       (JFirst M))
+	(if (fx< JFirst N)
+	    (let* ((JLast  (fx+ JFirst SizeOfGroup)))
+	      (if (fxeven? K)
+		  (begin
+		    (f64vector-set! W 0 (f64vector-ref W-table K))
+		    (f64vector-set! W 1 (f64vector-ref W-table (fx+ K 1))))
+		  (begin
+		    (f64vector-set! W 0 (fl- 0. (f64vector-ref W-table K)))
+		    (f64vector-set! W 1 (f64vector-ref W-table (fx- K 1)))))
+	      (f64vector-set! W 2 (f64vector-ref W-table (fx* K 2)))
+	      (f64vector-set! W 3 (f64vector-ref W-table (fx+ (fx* K 2) 1)))
+	      (let J-loop ((J0 JFirst))
+		(if (fx< J0 JLast)
+		    (let* ((J0 J0)
+			   (J1 (fx+ J0 1))
+			   (J2 (fx+ J0 SizeOfGroup))
+			   (J3 (fx+ J2 1))
+			   (J4 (fx+ J2 SizeOfGroup))
+			   (J5 (fx+ J4 1))
+			   (J6 (fx+ J4 SizeOfGroup))
+			   (J7 (fx+ J6 1)))
+		      (let ((W_0  (f64vector-ref W 0))
+			    (W_1  (f64vector-ref W 1))
+			    (W_2  (f64vector-ref W 2))
+			    (W_3  (f64vector-ref W 3))
+			    (a_J0 (f64vector-ref a J0))
+			    (a_J1 (f64vector-ref a J1))
+			    (a_J2 (f64vector-ref a J2))
+			    (a_J3 (f64vector-ref a J3))
+			    (a_J4 (f64vector-ref a J4))
+			    (a_J5 (f64vector-ref a J5))
+			    (a_J6 (f64vector-ref a J6))
+			    (a_J7 (f64vector-ref a J7)))
+			(let ((W_00 W_2)
+			      (W_01 W_3)
+			      (W_02 (fl- 0. W_3))
+			      (W_03 W_2))
+			  (let ((Temp_0 (fl- a_J0 a_J2))
+				(Temp_1 (fl- a_J1 a_J3))
+				(Temp_2 (fl- a_J4 a_J6))
+				(Temp_3 (fl- a_J5 a_J7)))
+			    (let ((a_J0 (fl+ a_J0 a_J2))
+				  (a_J1 (fl+ a_J1 a_J3))
+				  (a_J4 (fl+ a_J4 a_J6))
+				  (a_J5 (fl+ a_J5 a_J7))
+				  (a_J2 (fl+ (fl* W_00 Temp_0)
+					     (fl* W_01 Temp_1)))
+				  (a_J3 (fl- (fl* W_00 Temp_1)
+					     (fl* W_01 Temp_0)))
+				  (a_J6 (fl+ (fl* W_02 Temp_2)
+					     (fl* W_03 Temp_3)))
+				  (a_J7 (fl- (fl* W_02 Temp_3)
+					     (fl* W_03 Temp_2))))
+			      (let ((Temp_0 (fl- a_J0 a_J4))
+				    (Temp_1 (fl- a_J1 a_J5))
+				    (Temp_2 (fl- a_J2 a_J6))
+				    (Temp_3 (fl- a_J3 a_J7)))
+				(let ((a_J0 (fl+ a_J0 a_J4))
+				      (a_J1 (fl+ a_J1 a_J5))
+				      (a_J2 (fl+ a_J2 a_J6))
+				      (a_J3 (fl+ a_J3 a_J7))
+				      (a_J4 (fl+ (fl* W_0 Temp_0)
+						 (fl* W_1 Temp_1)))
+				      (a_J5 (fl- (fl* W_0 Temp_1)
+						 (fl* W_1 Temp_0)))
+				      (a_J6 (fl+ (fl* W_0 Temp_2)
+						 (fl* W_1 Temp_3)))
+				      (a_J7 (fl- (fl* W_0 Temp_3)
+						 (fl* W_1 Temp_2))))
+				  (f64vector-set! a J0 a_J0)
+				  (f64vector-set! a J1 a_J1)
+				  (f64vector-set! a J2 a_J2)
+				  (f64vector-set! a J3 a_J3)
+				  (f64vector-set! a J4 a_J4)
+				  (f64vector-set! a J5 a_J5)
+				  (f64vector-set! a J6 a_J6)
+				  (f64vector-set! a J7 a_J7)
+				  (J-loop (fx+ J0 2)))))))))
+		    (inner-loop (fx+ K 1)
+				(fx+ JFirst (fx* SizeOfGroup 4)))))))))
+
+    (define (recursive-bit M N K SizeOfGroup)
+      (if (fx<= 2 SizeOfGroup)
+	  (begin
+	    (if (fx< 2048 (fx- N M))
+		(let ((new-size (fxarithmetic-shift-right (fx- N M) 2)))
+		  (recursive-bit M
+				 (fx+ M new-size)
+				 (fx* K 4)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M new-size)
+				 (fx+ M (fx* new-size 2))
+				 (fx+ (fx* K 4) 1)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M (fx* new-size 2))
+				 (fx+ M (fx* new-size 3))
+				 (fx+ (fx* K 4) 2)
+				 (fxarithmetic-shift-right SizeOfGroup 2))
+		  (recursive-bit (fx+ M (fx* new-size 3))
+				 N
+				 (fx+ (fx* K 4) 3)
+				 (fxarithmetic-shift-right SizeOfGroup 2)))
+		(recursive-bit M
+			       N
+			       (fx* K 4)
+			       (fxarithmetic-shift-right SizeOfGroup 2)))
+	    (main-loop M N K SizeOfGroup))))
+
+    (define (radix-2-pass a)
+      (declare (not interrupts-enabled))
+      (let ((SizeOfGroup
+	     (fxarithmetic-shift-right (f64vector-length a) 1)))
+	(let loop ((J0 0))
+	  (if (fx< J0 SizeOfGroup)
+	      (let ((J0 J0)
+		    (J2 (fx+ J0 SizeOfGroup)))
+		(let ((J1 (fx+ J0 1))
+		      (J3 (fx+ J2 1)))
+		  (let ((a_J0 (f64vector-ref a J0))
+			(a_J1 (f64vector-ref a J1))
+			(a_J2 (f64vector-ref a J2))
+			(a_J3 (f64vector-ref a J3)))
+		    (let ((a_J0 (fl+ a_J0 a_J2))
+			  (a_J1 (fl+ a_J1 a_J3))
+			  (a_J2 (fl- a_J0 a_J2))
+			  (a_J3 (fl- a_J1 a_J3)))
+		      (f64vector-set! a J0 a_J0)
+		      (f64vector-set! a J1 a_J1)
+		      (f64vector-set! a J2 a_J2)
+		      (f64vector-set! a J3 a_J3)
+		      (loop (fx+ J0 2))))))))))
+
+    (let* ((n (f64vector-length a))
+	   (log_n (two^p>=m n)))
+      (if (fxodd? log_n)
+	  (recursive-bit 0 n 0 (fxarithmetic-shift-right n 2))
+	  (let ((n/2 (fxarithmetic-shift-right n 1))
+		(n/8 (fxarithmetic-shift-right n 3)))
+	    (recursive-bit 0 n/2 0 n/8)
+	    (recursive-bit n/2 n 1 n/8)
+	    (radix-2-pass a))))))
+
+(define (two^p>=m m)
+  ;; returns smallest p, assumes fixnum m >= 0
+  (do ((p 0 (fx+ p 1))
+       (two^p 1 (fx* two^p 2)))
+      ((fx<= m two^p) p)))
+
+(define (test iters n)
+  (let ((two^n
+	 (expt 2 n))
+	(table
+	 (make-w (fx- n 1))))
+    (display (fx* two^n 2))(newline)
+    (let ((a
+	   (make-f64vector (fx* two^n 2) 0.)))
+      (do ((i 0 (fx+ i 1)))
+	  ((fx= i iters))
+	(direct-fft-recursive-4 a table)
+	(inverse-fft-recursive-4 a table)))))
+
+(test 1000 11)
diff --git a/tests/runtests.sh b/tests/runtests.sh
index d53c1b91..daf6e9b1 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -207,24 +207,15 @@ echo "======================================== embedding (2) ..."
 $compile -e embedded2.scm
 ./a.out
 
-echo "======================================== regex benchmarks ..."
-
-cd ../benchmarks/regex
-../../csi -bnq -include-path ../.. benchmark.scm
-cd "${TEST_DIR}"
-
-echo "======================================== benchmarks ..."
-cd ../benchmarks
-for x in `ls *.scm`; do
-    case $x in
-	"cscbench.scm");;
-	"plists.scm");;
-	*)
-	    echo $x
-	    ../csc $x -compiler $CHICKEN -I.. -L.. -O3 -d0 -prelude '(define-syntax time (syntax-rules () ((_ x) x)))'
-	    ./`basename $x .scm`;;
-    esac
-done
-cd "${TEST_DIR}"
+echo "======================================== timing compilation ..."
+time $compile silex.scm -t -S -O3
+
+echo "======================================== running floating-point benchmark ..."
+echo "boxed:"
+$compile fft.scm -O5
+time ./a.out
+echo "unboxed:"
+$compile fft.scm -O5 -D unboxed
+time ./a.out
 
 echo "======================================== done."
diff --git a/tests/scrutiny.expected b/tests/scrutiny.expected
index b07e1f46..6d58ab98 100644
--- a/tests/scrutiny.expected
+++ b/tests/scrutiny.expected
@@ -40,9 +40,9 @@ Warning: at toplevel:
   assignment of value of type `fixnum' to toplevel variable `car' does not match declared type `(procedure car (pair) *)'
 
 Warning: at toplevel:
-  expected in operator position of procedure call `((values (quote 1) (quote 2)))' a single result, but were given 2 results
+  expected in `let' binding of `g8' a single result, but were given 2 results
 
 Warning: at toplevel:
-  expected in procedure call to `(values (quote 1) (quote 2))' a value of type `(procedure () *)', but were given a value of type `fixnum'
+  expected in procedure call to `g89' a value of type `(procedure () *)', but were given a value of type `fixnum'
 
 Warning: redefinition of standard binding `car'
diff --git a/tests/silex.scm b/tests/silex.scm
new file mode 100644
index 00000000..df550540
--- /dev/null
+++ b/tests/silex.scm
@@ -0,0 +1,6717 @@
+;; Copyright (C) 1997 Danny Dube, Universite de Montreal.
+;; All rights reserved.
+
+;; Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
+;; conditions are met:
+
+;;   Redistributions of source code must retain the above copyright notice, this list of conditions and the following
+;;     disclaimer. 
+;;   Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following
+;;     disclaimer in the documentation and/or other materials provided with the distribution. 
+;;   Neither the name of the author nor the names of its contributors may be used to endorse or promote
+;;     products derived from this software without specific prior written permission. 
+
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
+;; OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+;; AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
+;; CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+;; OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+;; POSSIBILITY OF SUCH DAMAGE.
+
+
+(declare 
+  (fixnum)
+  (no-procedure-checks-for-usual-bindings) )
+
+
+(require-library srfi-13)
+
+
+(module silex *
+  (import scheme srfi-13)		; srfi-13 for string-downcase
+
+;----------------------------------------------------------------------------------------------------
+
+(define (string-append-list lst)
+  (let loop1 ((n 0) (x lst) (y '()))
+    (if (pair? x)
+      (let ((s (car x)))
+        (loop1 (+ n (string-length s)) (cdr x) (cons s y)))
+      (let ((result (make-string n #\space)))
+        (let loop2 ((k (- n 1)) (y y))
+          (if (pair? y)
+            (let ((s (car y)))
+              (let loop3 ((i k) (j (- (string-length s) 1)))
+                (if (not (< j 0))
+                  (begin
+                    (string-set! result i (string-ref s j))
+                    (loop3 (- i 1) (- j 1)))
+                  (loop2 i (cdr y)))))
+            result))))))
+
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+; Module util.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Quelques definitions de constantes
+;
+
+(define eof-tok              0)
+(define hblank-tok           1)
+(define vblank-tok           2)
+(define pipe-tok             3)
+(define question-tok         4)
+(define plus-tok             5)
+(define star-tok             6)
+(define lpar-tok             7)
+(define rpar-tok             8)
+(define dot-tok              9)
+(define lbrack-tok          10)
+(define lbrack-rbrack-tok   11)
+(define lbrack-caret-tok    12)
+(define lbrack-minus-tok    13)
+(define subst-tok           14)
+(define power-tok           15)
+(define doublequote-tok     16)
+(define char-tok            17)
+(define caret-tok           18)
+(define dollar-tok          19)
+(define <<EOF>>-tok         20)
+(define <<ERROR>>-tok       21)
+(define percent-percent-tok 22)
+(define id-tok              23)
+(define rbrack-tok          24)
+(define minus-tok           25)
+(define illegal-tok         26)
+; Tokens agreges
+(define class-tok           27)
+(define string-tok          28)
+
+(define number-of-tokens 29)
+
+(define newline-ch   (char->integer #\newline))
+(define tab-ch       (char->integer #\	))
+(define dollar-ch    (char->integer #\$))
+(define minus-ch     (char->integer #\-))
+(define rbrack-ch    (char->integer #\]))
+(define caret-ch     (char->integer #\^))
+
+(define dot-class (list (cons 'inf- (- newline-ch 1))
+			(cons (+ newline-ch 1) 'inf+)))
+
+(define default-action
+  (string-append "        (yycontinue)" (string #\newline)))
+(define default-<<EOF>>-action
+  (string-append "       '(0)" (string #\newline)))
+(define default-<<ERROR>>-action
+  (string-append "       (begin"
+		 (string #\newline)
+		 "         (display \"Error: Invalid token.\")"
+		 (string #\newline)
+		 "         (newline)"
+		 (string #\newline)
+		 "         'error)"
+		 (string #\newline)))
+
+
+
+
+;
+; Fabrication de tables de dispatch
+;
+
+(define make-dispatch-table
+  (lambda (size alist default)
+    (let ((v (make-vector size default)))
+      (let loop ((alist alist))
+	(if (null? alist)
+	    v
+	    (begin
+	      (vector-set! v (caar alist) (cdar alist))
+	      (loop (cdr alist))))))))
+
+
+
+
+;
+; Fonctions de manipulation des tokens
+;
+
+(define make-tok
+  (lambda (tok-type lexeme line column . attr)
+    (cond ((null? attr)
+	   (vector tok-type line column lexeme))
+	  ((null? (cdr attr))
+	   (vector tok-type line column lexeme (car attr)))
+	  (else
+	   (vector tok-type line column lexeme (car attr) (cadr attr))))))
+
+(define get-tok-type     (lambda (tok) (vector-ref tok 0)))
+(define get-tok-line     (lambda (tok) (vector-ref tok 1)))
+(define get-tok-column   (lambda (tok) (vector-ref tok 2)))
+(define get-tok-lexeme   (lambda (tok) (vector-ref tok 3)))
+(define get-tok-attr     (lambda (tok) (vector-ref tok 4)))
+(define get-tok-2nd-attr (lambda (tok) (vector-ref tok 5)))
+
+
+
+
+;
+; Fonctions de manipulations des regles
+;
+
+(define make-rule
+  (lambda (line eof? error? bol? eol? regexp action)
+    (vector line eof? error? bol? eol? regexp action #f)))
+
+(define get-rule-line    (lambda (rule) (vector-ref rule 0)))
+(define get-rule-eof?    (lambda (rule) (vector-ref rule 1)))
+(define get-rule-error?  (lambda (rule) (vector-ref rule 2)))
+(define get-rule-bol?    (lambda (rule) (vector-ref rule 3)))
+(define get-rule-eol?    (lambda (rule) (vector-ref rule 4)))
+(define get-rule-regexp  (lambda (rule) (vector-ref rule 5)))
+(define get-rule-action  (lambda (rule) (vector-ref rule 6)))
+(define get-rule-yytext? (lambda (rule) (vector-ref rule 7)))
+
+(define set-rule-regexp  (lambda (rule regexp)  (vector-set! rule 5 regexp)))
+(define set-rule-action  (lambda (rule action)  (vector-set! rule 6 action)))
+(define set-rule-yytext? (lambda (rule yytext?) (vector-set! rule 7 yytext?)))
+
+
+
+
+;
+; Noeuds des regexp
+;
+
+(define epsilon-re  0)
+(define or-re       1)
+(define conc-re     2)
+(define star-re     3)
+(define plus-re     4)
+(define question-re 5)
+(define class-re    6)
+(define char-re     7)
+
+(define make-re
+  (lambda (re-type . lattr)
+    (cond ((null? lattr)
+	   (vector re-type))
+	  ((null? (cdr lattr))
+	   (vector re-type (car lattr)))
+	  ((null? (cddr lattr))
+	   (vector re-type (car lattr) (cadr lattr))))))
+
+(define get-re-type  (lambda (re) (vector-ref re 0)))
+(define get-re-attr1 (lambda (re) (vector-ref re 1)))
+(define get-re-attr2 (lambda (re) (vector-ref re 2)))
+
+
+
+
+;
+; Fonctions de manipulation des ensembles d'etats
+;
+
+; Intersection de deux ensembles d'etats
+(define ss-inter
+  (lambda (ss1 ss2)
+    (cond ((null? ss1)
+	   '())
+	  ((null? ss2)
+	   '())
+	  (else
+	   (let ((t1 (car ss1))
+		 (t2 (car ss2)))
+	     (cond ((< t1 t2)
+		    (ss-inter (cdr ss1) ss2))
+		   ((= t1 t2)
+		    (cons t1 (ss-inter (cdr ss1) (cdr ss2))))
+		   (else
+		    (ss-inter ss1 (cdr ss2)))))))))
+
+; Difference entre deux ensembles d'etats
+(define ss-diff
+  (lambda (ss1 ss2)
+    (cond ((null? ss1)
+	   '())
+	  ((null? ss2)
+	   ss1)
+	  (else
+	   (let ((t1 (car ss1))
+		 (t2 (car ss2)))
+	     (cond ((< t1 t2)
+		    (cons t1 (ss-diff (cdr ss1) ss2)))
+		   ((= t1 t2)
+		    (ss-diff (cdr ss1) (cdr ss2)))
+		   (else
+		    (ss-diff ss1 (cdr ss2)))))))))
+
+; Union de deux ensembles d'etats
+(define ss-union
+  (lambda (ss1 ss2)
+    (cond ((null? ss1)
+	   ss2)
+	  ((null? ss2)
+	   ss1)
+	  (else
+	   (let ((t1 (car ss1))
+		 (t2 (car ss2)))
+	     (cond ((< t1 t2)
+		    (cons t1 (ss-union (cdr ss1) ss2)))
+		   ((= t1 t2)
+		    (cons t1 (ss-union (cdr ss1) (cdr ss2))))
+		   (else
+		    (cons t2 (ss-union ss1 (cdr ss2))))))))))
+
+; Decoupage de deux ensembles d'etats
+(define ss-sep
+  (lambda (ss1 ss2)
+    (let loop ((ss1 ss1) (ss2 ss2) (l '()) (c '()) (r '()))
+      (if (null? ss1)
+	  (if (null? ss2)
+	      (vector (reverse l) (reverse c) (reverse r))
+	      (loop ss1 (cdr ss2) l c (cons (car ss2) r)))
+	  (if (null? ss2)
+	      (loop (cdr ss1) ss2 (cons (car ss1) l) c r)
+	      (let ((t1 (car ss1))
+		    (t2 (car ss2)))
+		(cond ((< t1 t2)
+		       (loop (cdr ss1) ss2 (cons t1 l) c r))
+		      ((= t1 t2)
+		       (loop (cdr ss1) (cdr ss2) l (cons t1 c) r))
+		      (else
+		       (loop ss1 (cdr ss2) l c (cons t2 r))))))))))
+
+
+
+
+;
+; Fonctions de manipulation des classes de caracteres
+;
+
+; Comparaisons de bornes d'intervalles
+(define class-= eqv?)
+
+(define class-<=
+  (lambda (b1 b2)
+    (cond ((eq? b1 'inf-) #t)
+	  ((eq? b2 'inf+) #t)
+	  ((eq? b1 'inf+) #f)
+	  ((eq? b2 'inf-) #f)
+	  (else (<= b1 b2)))))
+
+(define class->=
+  (lambda (b1 b2)
+    (cond ((eq? b1 'inf+) #t)
+	  ((eq? b2 'inf-) #t)
+	  ((eq? b1 'inf-) #f)
+	  ((eq? b2 'inf+) #f)
+	  (else (>= b1 b2)))))
+
+(define class-<
+  (lambda (b1 b2)
+    (cond ((eq? b1 'inf+) #f)
+	  ((eq? b2 'inf-) #f)
+	  ((eq? b1 'inf-) #t)
+	  ((eq? b2 'inf+) #t)
+	  (else (< b1 b2)))))
+
+(define class->
+  (lambda (b1 b2)
+    (cond ((eq? b1 'inf-) #f)
+	  ((eq? b2 'inf+) #f)
+	  ((eq? b1 'inf+) #t)
+	  ((eq? b2 'inf-) #t)
+	  (else (> b1 b2)))))
+
+; Complementation d'une classe
+(define class-compl
+  (lambda (c)
+    (let loop ((c c) (start 'inf-))
+      (if (null? c)
+	  (list (cons start 'inf+))
+	  (let* ((r (car c))
+		 (rstart (car r))
+		 (rend (cdr r)))
+	    (if (class-< start rstart)
+		(cons (cons start (- rstart 1))
+		      (loop c rstart))
+		(if (class-< rend 'inf+)
+		    (loop (cdr c) (+ rend 1))
+		    '())))))))
+
+; Union de deux classes de caracteres
+(define class-union
+  (lambda (c1 c2)
+    (let loop ((c1 c1) (c2 c2) (u '()))
+      (if (null? c1)
+	  (if (null? c2)
+	      (reverse u)
+	      (loop c1 (cdr c2) (cons (car c2) u)))
+	  (if (null? c2)
+	      (loop (cdr c1) c2 (cons (car c1) u))
+	      (let* ((r1 (car c1))
+		     (r2 (car c2))
+		     (r1start (car r1))
+		     (r1end (cdr r1))
+		     (r2start (car r2))
+		     (r2end (cdr r2)))
+		(if (class-<= r1start r2start)
+		    (cond ((class-= r1end 'inf+)
+			   (loop c1 (cdr c2) u))
+			  ((class-< (+ r1end 1) r2start)
+			   (loop (cdr c1) c2 (cons r1 u)))
+			  ((class-<= r1end r2end)
+			   (loop (cdr c1)
+				 (cons (cons r1start r2end) (cdr c2))
+				 u))
+			  (else
+			   (loop c1 (cdr c2) u)))
+		    (cond ((class-= r2end 'inf+)
+			   (loop (cdr c1) c2 u))
+			  ((class-> r1start (+ r2end 1))
+			   (loop c1 (cdr c2) (cons r2 u)))
+			  ((class->= r1end r2end)
+			   (loop (cons (cons r2start r1end) (cdr c1))
+				 (cdr c2)
+				 u))
+			  (else
+			   (loop (cdr c1) c2 u))))))))))
+
+; Decoupage de deux classes de caracteres
+(define class-sep
+  (lambda (c1 c2)
+    (let loop ((c1 c1) (c2 c2) (l '()) (c '()) (r '()))
+      (if (null? c1)
+	  (if (null? c2)
+	      (vector (reverse l) (reverse c) (reverse r))
+	      (loop c1 (cdr c2) l c (cons (car c2) r)))
+	  (if (null? c2)
+	      (loop (cdr c1) c2 (cons (car c1) l) c r)
+	      (let* ((r1 (car c1))
+		     (r2 (car c2))
+		     (r1start (car r1))
+		     (r1end (cdr r1))
+		     (r2start (car r2))
+		     (r2end (cdr r2)))
+		(cond ((class-< r1start r2start)
+		       (if (class-< r1end r2start)
+			   (loop (cdr c1) c2 (cons r1 l) c r)
+			   (loop (cons (cons r2start r1end) (cdr c1)) c2
+				 (cons (cons r1start (- r2start 1)) l) c r)))
+		      ((class-> r1start r2start)
+		       (if (class-> r1start r2end)
+			   (loop c1 (cdr c2) l c (cons r2 r))
+			   (loop c1 (cons (cons r1start r2end) (cdr c2))
+				 l c (cons (cons r2start (- r1start 1)) r))))
+		      (else
+		       (cond ((class-< r1end r2end)
+			      (loop (cdr c1)
+				    (cons (cons (+ r1end 1) r2end) (cdr c2))
+				    l (cons r1 c) r))
+			     ((class-= r1end r2end)
+			      (loop (cdr c1) (cdr c2) l (cons r1 c) r))
+			     (else
+			      (loop (cons (cons (+ r2end 1) r1end) (cdr c1))
+				    (cdr c2)
+				    l (cons r2 c) r)))))))))))
+
+; Transformer une classe (finie) de caracteres en une liste de ...
+(define class->char-list
+  (lambda (c)
+    (let loop1 ((c c))
+      (if (null? c)
+	  '()
+	  (let* ((r (car c))
+		 (rend (cdr r))
+		 (tail (loop1 (cdr c))))
+	    (let loop2 ((rstart (car r)))
+	      (if (<= rstart rend)
+		  (cons (integer->char rstart) (loop2 (+ rstart 1)))
+		  tail)))))))
+
+; Transformer une classe de caracteres en une liste poss. compl.
+; 1er element = #t -> classe complementee
+(define class->tagged-char-list
+  (lambda (c)
+    (let* ((finite? (or (null? c) (number? (caar c))))
+	   (c2 (if finite? c (class-compl c)))
+	   (c-l (class->char-list c2)))
+      (cons (not finite?) c-l))))
+
+
+
+
+;
+; Fonction digraph
+;
+
+; Fonction "digraph".
+; Etant donne un graphe dirige dont les noeuds comportent une valeur,
+; calcule pour chaque noeud la "somme" des valeurs contenues dans le
+; noeud lui-meme et ceux atteignables a partir de celui-ci.  La "somme"
+; consiste a appliquer un operateur commutatif et associatif aux valeurs
+; lorsqu'elles sont additionnees.
+; L'entree consiste en un vecteur de voisinages externes, un autre de
+; valeurs initiales et d'un operateur.
+; La sortie est un vecteur de valeurs finales.
+(define digraph
+  (lambda (arcs init op)
+    (let* ((nbnodes (vector-length arcs))
+	   (infinity nbnodes)
+	   (prio (make-vector nbnodes -1))
+	   (stack (make-vector nbnodes #f))
+	   (sp 0)
+	   (final (make-vector nbnodes #f)))
+      (letrec ((store-final
+		(lambda (self-sp value)
+		  (let loop ()
+		    (if (> sp self-sp)
+			(let ((voisin (vector-ref stack (- sp 1))))
+			  (vector-set! prio voisin infinity)
+			  (set! sp (- sp 1))
+			  (vector-set! final voisin value)
+			  (loop))))))
+	       (visit-node
+		(lambda (n)
+		  (let ((self-sp sp))
+		    (vector-set! prio n self-sp)
+		    (vector-set! stack sp n)
+		    (set! sp (+ sp 1))
+		    (vector-set! final n (vector-ref init n))
+		    (let loop ((vois (vector-ref arcs n)))
+		      (if (pair? vois)
+			  (let* ((v (car vois))
+				 (vprio (vector-ref prio v)))
+			    (if (= vprio -1)
+				(visit-node v))
+			    (vector-set! prio n (min (vector-ref prio n)
+						     (vector-ref prio v)))
+			    (vector-set! final n (op (vector-ref final n)
+						     (vector-ref final v)))
+			    (loop (cdr vois)))))
+		    (if (= (vector-ref prio n) self-sp)
+			(store-final self-sp (vector-ref final n)))))))
+	(let loop ((n 0))
+	  (if (< n nbnodes)
+	      (begin
+		(if (= (vector-ref prio n) -1)
+		    (visit-node n))
+		(loop (+ n 1)))))
+	final))))
+
+
+
+
+;
+; Fonction de tri
+;
+
+(define merge-sort-merge
+  (lambda (l1 l2 cmp-<=)
+    (cond ((null? l1)
+	   l2)
+	  ((null? l2)
+	   l1)
+	  (else
+	   (let ((h1 (car l1))
+		 (h2 (car l2)))
+	     (if (cmp-<= h1 h2)
+		 (cons h1 (merge-sort-merge (cdr l1) l2 cmp-<=))
+		 (cons h2 (merge-sort-merge l1 (cdr l2) cmp-<=))))))))
+
+(define merge-sort
+  (lambda (l cmp-<=)
+    (if (null? l)
+	l
+	(let loop1 ((ll (map list l)))
+	  (if (null? (cdr ll))
+	      (car ll)
+	      (loop1
+	       (let loop2 ((ll ll))
+		 (cond ((null? ll)
+			ll)
+		       ((null? (cdr ll))
+			ll)
+		       (else
+			(cons (merge-sort-merge (car ll) (cadr ll) cmp-<=)
+			      (loop2 (cddr ll))))))))))))
+
+; Module action.l.scm.
+;
+; Table generated from the file action.l by SILex 1.0
+;
+
+(define action-tables
+  (vector
+   'all
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+          (make-tok eof-tok    yytext yyline yycolumn)
+       ))
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+       (begin
+         (display "Error: Invalid token.")
+         (newline)
+         'error)
+       ))
+   (vector
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+          (make-tok hblank-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+          (make-tok vblank-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+          (make-tok char-tok   yytext yyline yycolumn)
+        )))
+   'tagged-chars-lists
+   0
+   0
+   '#((((#f #\	 #\space) . 4)
+       ((#f #\;) . 3)
+       ((#f #\newline) . 2)
+       ((#t #\	 #\newline #\space #\;) . 1))
+      (((#t #\newline) . 1))
+      ()
+      (((#t #\newline) . 3))
+      (((#f #\	 #\space) . 4)
+       ((#f #\;) . 3)
+       ((#t #\	 #\newline #\space #\;) . 1)))
+   '#((#f . #f) (2 . 2) (1 . 1) (0 . 0) (0 . 0))))
+
+; Module class.l.scm.
+;
+; Table generated from the file class.l by SILex 1.0
+;
+
+(define class-tables
+  (vector
+   'all
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+              (make-tok eof-tok    yytext yyline yycolumn)
+       ))
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+       (begin
+         (display "Error: Invalid token.")
+         (newline)
+         'error)
+       ))
+   (vector
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (make-tok rbrack-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (make-tok minus-tok  yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-spec-char     yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-digits-char   yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-digits-char   yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-quoted-char   yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-ordinary-char yytext yyline yycolumn)
+        )))
+   'tagged-chars-lists
+   0
+   0
+   '#((((#f #\]) . 4) ((#f #\-) . 3) ((#f #\\) . 2) ((#t #\- #\\ #\]) . 1))
+      ()
+      (((#f #\n) . 8)
+       ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 7)
+       ((#f #\-) . 6)
+       ((#t #\- #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\n) . 5))
+      ()
+      ()
+      ()
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 9))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 10))
+      ()
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 9))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 10)))
+   '#((#f . #f) (6 . 6)   (6 . 6)   (1 . 1)   (0 . 0)   (5 . 5)   (5 . 5)
+      (3 . 3)   (2 . 2)   (4 . 4)   (3 . 3))))
+
+; Module macro.l.scm.
+;
+; Table generated from the file macro.l by SILex 1.0
+;
+
+(define macro-tables
+  (vector
+   'all
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+         (make-tok eof-tok             yytext yyline yycolumn)
+       ))
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+       (begin
+         (display "Error: Invalid token.")
+         (newline)
+         'error)
+       ))
+   (vector
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+         (make-tok hblank-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+         (make-tok vblank-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+         (make-tok percent-percent-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+         (parse-id                     yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+         (make-tok illegal-tok         yytext yyline yycolumn)
+        )))
+   'tagged-chars-lists
+   0
+   0
+   '#((((#f #\	 #\space) . 8)
+       ((#f #\;) . 7)
+       ((#f #\newline) . 6)
+       ((#f #\%) . 5)
+       ((#f  #\! #\$ #\& #\* #\/ #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E
+         #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U
+         #\V #\W #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i
+         #\j #\k #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y
+         #\z #\~)
+        .
+        4)
+       ((#f #\+ #\-) . 3)
+       ((#f #\.) . 2)
+       ((#t        #\	       #\newline #\space   #\!       #\$
+         #\%       #\&       #\*       #\+       #\-       #\.
+         #\/       #\:       #\;       #\<       #\=       #\>
+         #\?       #\A       #\B       #\C       #\D       #\E
+         #\F       #\G       #\H       #\I       #\J       #\K
+         #\L       #\M       #\N       #\O       #\P       #\Q
+         #\R       #\S       #\T       #\U       #\V       #\W
+         #\X       #\Y       #\Z       #\^       #\_       #\a
+         #\b       #\c       #\d       #\e       #\f       #\g
+         #\h       #\i       #\j       #\k       #\l       #\m
+         #\n       #\o       #\p       #\q       #\r       #\s
+         #\t       #\u       #\v       #\w       #\x       #\y
+         #\z       #\~)
+        .
+        1))
+      ()
+      (((#f #\.) . 9))
+      ()
+      (((#f  #\! #\$ #\% #\& #\* #\+ #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5
+         #\6 #\7 #\8 #\9 #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E #\F #\G
+         #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W
+         #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k
+         #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\~)
+        .
+        10))
+      (((#f #\%) . 11)
+       ((#f  #\! #\$ #\& #\* #\+ #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5 #\6
+         #\7 #\8 #\9 #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E #\F #\G #\H
+         #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W #\X
+         #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k #\l
+         #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\~)
+        .
+        10))
+      ()
+      (((#t #\newline) . 12))
+      ()
+      (((#f #\.) . 13))
+      (((#f  #\! #\$ #\% #\& #\* #\+ #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5
+         #\6 #\7 #\8 #\9 #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E #\F #\G
+         #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W
+         #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k
+         #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\~)
+        .
+        10))
+      (((#f  #\! #\$ #\% #\& #\* #\+ #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5
+         #\6 #\7 #\8 #\9 #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E #\F #\G
+         #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W
+         #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k
+         #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\~)
+        .
+        10))
+      (((#t #\newline) . 12))
+      ())
+   '#((#f . #f) (4 . 4)   (4 . 4)   (3 . 3)   (3 . 3)   (3 . 3)   (1 . 1)
+      (0 . 0)   (0 . 0)   (#f . #f) (3 . 3)   (2 . 2)   (0 . 0)   (3 . 3))))
+
+; Module regexp.l.scm.
+;
+; Table generated from the file regexp.l by SILex 1.0
+;
+
+(define regexp-tables
+  (vector
+   'all
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok eof-tok           yytext yyline yycolumn)
+       ))
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+       (begin
+         (display "Error: Invalid token.")
+         (newline)
+         'error)
+       ))
+   (vector
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok hblank-tok        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok vblank-tok        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok pipe-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok question-tok      yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok plus-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok star-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok lpar-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok rpar-tok          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok dot-tok           yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok lbrack-tok        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok lbrack-rbrack-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok lbrack-caret-tok  yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok lbrack-minus-tok  yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-id-ref               yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-power-m              yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-power-m-inf          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-power-m-n            yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok illegal-tok       yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok doublequote-tok   yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-spec-char            yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-digits-char          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-digits-char          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-quoted-char          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok caret-tok         yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok dollar-tok        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (parse-ordinary-char        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok <<EOF>>-tok       yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+                          (make-tok <<ERROR>>-tok     yytext yyline yycolumn)
+        )))
+   'tagged-chars-lists
+   0
+   0
+   '#((((#f #\	 #\space) . 18)
+       ((#f #\;) . 17)
+       ((#f #\newline) . 16)
+       ((#f #\|) . 15)
+       ((#f #\?) . 14)
+       ((#f #\+) . 13)
+       ((#f #\*) . 12)
+       ((#f #\() . 11)
+       ((#f #\)) . 10)
+       ((#f #\.) . 9)
+       ((#f #\[) . 8)
+       ((#f #\{) . 7)
+       ((#f #\") . 6)
+       ((#f #\\) . 5)
+       ((#f #\^) . 4)
+       ((#f #\$) . 3)
+       ((#t        #\	       #\newline #\space   #\"       #\$
+         #\(       #\)       #\*       #\+       #\.       #\;
+         #\<       #\?       #\[       #\\       #\^       #\{
+         #\|)
+        .
+        2)
+       ((#f #\<) . 1))
+      (((#f #\<) . 19))
+      ()
+      ()
+      ()
+      (((#f #\n) . 23)
+       ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 22)
+       ((#f #\-) . 21)
+       ((#t #\- #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\n) . 20))
+      ()
+      (((#f  #\! #\$ #\% #\& #\* #\/ #\: #\< #\= #\> #\? #\A #\B #\C #\D
+         #\E #\F #\G #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T
+         #\U #\V #\W #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h
+         #\i #\j #\k #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x
+         #\y #\z #\~)
+        .
+        27)
+       ((#f #\+ #\-) . 26)
+       ((#f #\.) . 25)
+       ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 24))
+      (((#f #\]) . 30) ((#f #\^) . 29) ((#f #\-) . 28))
+      ()
+      ()
+      ()
+      ()
+      ()
+      ()
+      ()
+      ()
+      (((#t #\newline) . 31))
+      ()
+      (((#f #\E) . 32))
+      ()
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 33))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 34))
+      ()
+      (((#f #\}) . 36)
+       ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 24)
+       ((#f #\,) . 35))
+      (((#f #\.) . 37))
+      (((#f #\}) . 38))
+      (((#f #\}) . 38)
+       ((#f  #\! #\$ #\% #\& #\* #\+ #\- #\. #\/ #\0 #\1 #\2 #\3 #\4 #\5
+         #\6 #\7 #\8 #\9 #\: #\< #\= #\> #\? #\A #\B #\C #\D #\E #\F #\G
+         #\H #\I #\J #\K #\L #\M #\N #\O #\P #\Q #\R #\S #\T #\U #\V #\W
+         #\X #\Y #\Z #\^ #\_ #\a #\b #\c #\d #\e #\f #\g #\h #\i #\j #\k
+         #\l #\m #\n #\o #\p #\q #\r #\s #\t #\u #\v #\w #\x #\y #\z #\~)
+        .
+        27))
+      ()
+      ()
+      ()
+      (((#t #\newline) . 31))
+      (((#f #\O) . 40) ((#f #\R) . 39))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 33))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 34))
+      (((#f #\}) . 42) ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 41))
+      ()
+      (((#f #\.) . 26))
+      ()
+      (((#f #\R) . 43))
+      (((#f #\F) . 44))
+      (((#f #\}) . 45) ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 41))
+      ()
+      (((#f #\O) . 46))
+      (((#f #\>) . 47))
+      ()
+      (((#f #\R) . 48))
+      (((#f #\>) . 49))
+      (((#f #\>) . 50))
+      ()
+      (((#f #\>) . 51))
+      ())
+   '#((#f . #f) (25 . 25) (25 . 25) (24 . 24) (23 . 23) (25 . 25) (18 . 18)
+      (17 . 17) (9 . 9)   (8 . 8)   (7 . 7)   (6 . 6)   (5 . 5)   (4 . 4)
+      (3 . 3)   (2 . 2)   (1 . 1)   (0 . 0)   (0 . 0)   (#f . #f) (22 . 22)
+      (22 . 22) (20 . 20) (19 . 19) (#f . #f) (#f . #f) (#f . #f) (#f . #f)
+      (12 . 12) (11 . 11) (10 . 10) (0 . 0)   (#f . #f) (21 . 21) (20 . 20)
+      (#f . #f) (14 . 14) (#f . #f) (13 . 13) (#f . #f) (#f . #f) (#f . #f)
+      (15 . 15) (#f . #f) (#f . #f) (16 . 16) (#f . #f) (#f . #f) (#f . #f)
+      (26 . 26) (#f . #f) (27 . 27))))
+
+; Module string.l.scm.
+;
+; Table generated from the file string.l by SILex 1.0
+;
+
+(define string-tables
+  (vector
+   'all
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+              (make-tok eof-tok         yytext yyline yycolumn)
+       ))
+   (lambda (yycontinue yygetc yyungetc)
+     (lambda (yytext yyline yycolumn yyoffset)
+       (begin
+         (display "Error: Invalid token.")
+         (newline)
+         'error)
+       ))
+   (vector
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (make-tok doublequote-tok yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-spec-char          yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-digits-char        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-digits-char        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-quoted-char        yytext yyline yycolumn)
+        ))
+    #t
+    (lambda (yycontinue yygetc yyungetc)
+      (lambda (yytext yyline yycolumn yyoffset)
+              (parse-ordinary-char      yytext yyline yycolumn)
+        )))
+   'tagged-chars-lists
+   0
+   0
+   '#((((#f #\") . 3) ((#f #\\) . 2) ((#t #\" #\\) . 1))
+      ()
+      (((#f #\n) . 7)
+       ((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 6)
+       ((#f #\-) . 5)
+       ((#t #\- #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9 #\n) . 4))
+      ()
+      ()
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 8))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 9))
+      ()
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 8))
+      (((#f #\0 #\1 #\2 #\3 #\4 #\5 #\6 #\7 #\8 #\9) . 9)))
+   '#((#f . #f) (5 . 5)   (5 . 5)   (0 . 0)   (4 . 4)   (4 . 4)   (2 . 2)
+      (1 . 1)   (3 . 3)   (2 . 2))))
+
+; Module multilex.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Gestion des Input Systems
+; Fonctions a utiliser par l'usager:
+;   lexer-make-IS, lexer-get-func-getc, lexer-get-func-ungetc,
+;   lexer-get-func-line, lexer-get-func-column et lexer-get-func-offset
+;
+
+; Taille initiale par defaut du buffer d'entree
+(define lexer-init-buffer-len 1024)
+
+; Numero du caractere newline
+(define lexer-integer-newline (char->integer #\newline))
+
+; Constructeur d'IS brut
+(define lexer-raw-IS-maker
+  (lambda (buffer read-ptr input-f counters)
+    (let ((input-f          input-f)                ; Entree reelle
+	  (buffer           buffer)                 ; Buffer
+	  (buflen           (string-length buffer))
+	  (read-ptr         read-ptr)
+	  (start-ptr        1)                      ; Marque de debut de lexeme
+	  (start-line       1)
+	  (start-column     1)
+	  (start-offset     0)
+	  (end-ptr          1)                      ; Marque de fin de lexeme
+	  (point-ptr        1)                      ; Le point
+	  (user-ptr         1)                      ; Marque de l'usager
+	  (user-line        1)
+	  (user-column      1)
+	  (user-offset      0)
+	  (user-up-to-date? #t))                    ; Concerne la colonne seul.
+      (letrec
+	  ((start-go-to-end-none         ; Fonctions de depl. des marques
+	    (lambda ()
+	      (set! start-ptr end-ptr)))
+	   (start-go-to-end-line
+	    (lambda ()
+	      (let loop ((ptr start-ptr) (line start-line))
+		(if (= ptr end-ptr)
+		    (begin
+		      (set! start-ptr ptr)
+		      (set! start-line line))
+		    (if (char=? (string-ref buffer ptr) #\newline)
+			(loop (+ ptr 1) (+ line 1))
+			(loop (+ ptr 1) line))))))
+	   (start-go-to-end-all
+	    (lambda ()
+	      (set! start-offset (+ start-offset (- end-ptr start-ptr)))
+	      (let loop ((ptr start-ptr)
+			 (line start-line)
+			 (column start-column))
+		(if (= ptr end-ptr)
+		    (begin
+		      (set! start-ptr ptr)
+		      (set! start-line line)
+		      (set! start-column column))
+		    (if (char=? (string-ref buffer ptr) #\newline)
+			(loop (+ ptr 1) (+ line 1) 1)
+			(loop (+ ptr 1) line (+ column 1)))))))
+	   (start-go-to-user-none
+	    (lambda ()
+	      (set! start-ptr user-ptr)))
+	   (start-go-to-user-line
+	    (lambda ()
+	      (set! start-ptr user-ptr)
+	      (set! start-line user-line)))
+	   (start-go-to-user-all
+	    (lambda ()
+	      (set! start-line user-line)
+	      (set! start-offset user-offset)
+	      (if user-up-to-date?
+		  (begin
+		    (set! start-ptr user-ptr)
+		    (set! start-column user-column))
+		  (let loop ((ptr start-ptr) (column start-column))
+		    (if (= ptr user-ptr)
+			(begin
+			  (set! start-ptr ptr)
+			  (set! start-column column))
+			(if (char=? (string-ref buffer ptr) #\newline)
+			    (loop (+ ptr 1) 1)
+			    (loop (+ ptr 1) (+ column 1))))))))
+	   (end-go-to-point
+	    (lambda ()
+	      (set! end-ptr point-ptr)))
+	   (point-go-to-start
+	    (lambda ()
+	      (set! point-ptr start-ptr)))
+	   (user-go-to-start-none
+	    (lambda ()
+	      (set! user-ptr start-ptr)))
+	   (user-go-to-start-line
+	    (lambda ()
+	      (set! user-ptr start-ptr)
+	      (set! user-line start-line)))
+	   (user-go-to-start-all
+	    (lambda ()
+	      (set! user-ptr start-ptr)
+	      (set! user-line start-line)
+	      (set! user-column start-column)
+	      (set! user-offset start-offset)
+	      (set! user-up-to-date? #t)))
+	   (init-lexeme-none             ; Debute un nouveau lexeme
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-none))
+	      (point-go-to-start)))
+	   (init-lexeme-line
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-line))
+	      (point-go-to-start)))
+	   (init-lexeme-all
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-all))
+	      (point-go-to-start)))
+	   (get-start-line               ; Obtention des stats du debut du lxm
+	    (lambda ()
+	      start-line))
+	   (get-start-column
+	    (lambda ()
+	      start-column))
+	   (get-start-offset
+	    (lambda ()
+	      start-offset))
+	   (peek-left-context            ; Obtention de caracteres (#f si EOF)
+	    (lambda ()
+	      (char->integer (string-ref buffer (- start-ptr 1)))))
+	   (peek-char
+	    (lambda ()
+	      (if (< point-ptr read-ptr)
+		  (char->integer (string-ref buffer point-ptr))
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer point-ptr c)
+			  (set! read-ptr (+ point-ptr 1))
+			  (char->integer c))
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  #f))))))
+	   (read-char
+	    (lambda ()
+	      (if (< point-ptr read-ptr)
+		  (let ((c (string-ref buffer point-ptr)))
+		    (set! point-ptr (+ point-ptr 1))
+		    (char->integer c))
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer point-ptr c)
+			  (set! read-ptr (+ point-ptr 1))
+			  (set! point-ptr read-ptr)
+			  (char->integer c))
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  #f))))))
+	   (get-start-end-text           ; Obtention du lexeme
+	    (lambda ()
+	      (substring buffer start-ptr end-ptr)))
+	   (get-user-line-line           ; Fonctions pour l'usager
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-line))
+	      user-line))
+	   (get-user-line-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      user-line))
+	   (get-user-column-all
+	    (lambda ()
+	      (cond ((< user-ptr start-ptr)
+		     (user-go-to-start-all)
+		     user-column)
+		    (user-up-to-date?
+		     user-column)
+		    (else
+		     (let loop ((ptr start-ptr) (column start-column))
+		       (if (= ptr user-ptr)
+			   (begin
+			     (set! user-column column)
+			     (set! user-up-to-date? #t)
+			     column)
+			   (if (char=? (string-ref buffer ptr) #\newline)
+			       (loop (+ ptr 1) 1)
+			       (loop (+ ptr 1) (+ column 1)))))))))
+	   (get-user-offset-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      user-offset))
+	   (user-getc-none
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-none))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-getc-line
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-line))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    (if (char=? c #\newline)
+			(set! user-line (+ user-line 1)))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  (if (char=? c #\newline)
+			      (set! user-line (+ user-line 1)))
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-getc-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    (if (char=? c #\newline)
+			(begin
+			  (set! user-line (+ user-line 1))
+			  (set! user-column 1))
+			(set! user-column (+ user-column 1)))
+		    (set! user-offset (+ user-offset 1))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  (if (char=? c #\newline)
+			      (begin
+				(set! user-line (+ user-line 1))
+				(set! user-column 1))
+			      (set! user-column (+ user-column 1)))
+			  (set! user-offset (+ user-offset 1))
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-ungetc-none
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (set! user-ptr (- user-ptr 1)))))
+	   (user-ungetc-line
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (begin
+		    (set! user-ptr (- user-ptr 1))
+		    (let ((c (string-ref buffer user-ptr)))
+		      (if (char=? c #\newline)
+			  (set! user-line (- user-line 1))))))))
+	   (user-ungetc-all
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (begin
+		    (set! user-ptr (- user-ptr 1))
+		    (let ((c (string-ref buffer user-ptr)))
+		      (if (char=? c #\newline)
+			  (begin
+			    (set! user-line (- user-line 1))
+			    (set! user-up-to-date? #f))
+			  (set! user-column (- user-column 1)))
+		      (set! user-offset (- user-offset 1)))))))
+	   (reorganize-buffer            ; Decaler ou agrandir le buffer
+	    (lambda ()
+	      (if (< (* 2 start-ptr) buflen)
+		  (let* ((newlen (* 2 buflen))
+			 (newbuf (make-string newlen))
+			 (delta (- start-ptr 1)))
+		    (let loop ((from (- start-ptr 1)))
+		      (if (< from buflen)
+			  (begin
+			    (string-set! newbuf
+					 (- from delta)
+					 (string-ref buffer from))
+			    (loop (+ from 1)))))
+		    (set! buffer    newbuf)
+		    (set! buflen    newlen)
+		    (set! read-ptr  (- read-ptr delta))
+		    (set! start-ptr (- start-ptr delta))
+		    (set! end-ptr   (- end-ptr delta))
+		    (set! point-ptr (- point-ptr delta))
+		    (set! user-ptr  (- user-ptr delta)))
+		  (let ((delta (- start-ptr 1)))
+		    (let loop ((from (- start-ptr 1)))
+		      (if (< from buflen)
+			  (begin
+			    (string-set! buffer
+					 (- from delta)
+					 (string-ref buffer from))
+			    (loop (+ from 1)))))
+		    (set! read-ptr  (- read-ptr delta))
+		    (set! start-ptr (- start-ptr delta))
+		    (set! end-ptr   (- end-ptr delta))
+		    (set! point-ptr (- point-ptr delta))
+		    (set! user-ptr  (- user-ptr delta)))))))
+	(list (cons 'start-go-to-end
+		    (cond ((eq? counters 'none) start-go-to-end-none)
+			  ((eq? counters 'line) start-go-to-end-line)
+			  ((eq? counters 'all ) start-go-to-end-all)))
+	      (cons 'end-go-to-point
+		    end-go-to-point)
+	      (cons 'init-lexeme
+		    (cond ((eq? counters 'none) init-lexeme-none)
+			  ((eq? counters 'line) init-lexeme-line)
+			  ((eq? counters 'all ) init-lexeme-all)))
+	      (cons 'get-start-line
+		    get-start-line)
+	      (cons 'get-start-column
+		    get-start-column)
+	      (cons 'get-start-offset
+		    get-start-offset)
+	      (cons 'peek-left-context
+		    peek-left-context)
+	      (cons 'peek-char
+		    peek-char)
+	      (cons 'read-char
+		    read-char)
+	      (cons 'get-start-end-text
+		    get-start-end-text)
+	      (cons 'get-user-line
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) get-user-line-line)
+			  ((eq? counters 'all ) get-user-line-all)))
+	      (cons 'get-user-column
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) #f)
+			  ((eq? counters 'all ) get-user-column-all)))
+	      (cons 'get-user-offset
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) #f)
+			  ((eq? counters 'all ) get-user-offset-all)))
+	      (cons 'user-getc
+		    (cond ((eq? counters 'none) user-getc-none)
+			  ((eq? counters 'line) user-getc-line)
+			  ((eq? counters 'all ) user-getc-all)))
+	      (cons 'user-ungetc
+		    (cond ((eq? counters 'none) user-ungetc-none)
+			  ((eq? counters 'line) user-ungetc-line)
+			  ((eq? counters 'all ) user-ungetc-all))))))))
+
+; Construit un Input System
+; Le premier parametre doit etre parmi "port", "procedure" ou "string"
+; Prend un parametre facultatif qui doit etre parmi
+; "none", "line" ou "all"
+(define lexer-make-IS
+  (lambda (input-type input . largs)
+    (let ((counters-type (cond ((null? largs)
+				'line)
+			       ((memq (car largs) '(none line all))
+				(car largs))
+			       (else
+				'line))))
+      (cond ((and (eq? input-type 'port) (input-port? input))
+	     (let* ((buffer   (make-string lexer-init-buffer-len #\newline))
+		    (read-ptr 1)
+		    (input-f  (lambda () (read-char input))))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    ((and (eq? input-type 'procedure) (procedure? input))
+	     (let* ((buffer   (make-string lexer-init-buffer-len #\newline))
+		    (read-ptr 1)
+		    (input-f  input))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    ((and (eq? input-type 'string) (string? input))
+	     (let* ((buffer   (string-append (string #\newline) input))
+		    (read-ptr (string-length buffer))
+		    (input-f  (lambda () 'eof)))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    (else
+	     (let* ((buffer   (string #\newline))
+		    (read-ptr 1)
+		    (input-f  (lambda () 'eof)))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))))))
+
+; Les fonctions:
+;   lexer-get-func-getc, lexer-get-func-ungetc,
+;   lexer-get-func-line, lexer-get-func-column et lexer-get-func-offset
+(define lexer-get-func-getc
+  (lambda (IS) (cdr (assq 'user-getc IS))))
+(define lexer-get-func-ungetc
+  (lambda (IS) (cdr (assq 'user-ungetc IS))))
+(define lexer-get-func-line
+  (lambda (IS) (cdr (assq 'get-user-line IS))))
+(define lexer-get-func-column
+  (lambda (IS) (cdr (assq 'get-user-column IS))))
+(define lexer-get-func-offset
+  (lambda (IS) (cdr (assq 'get-user-offset IS))))
+
+;
+; Gestion des lexers
+;
+
+; Fabrication de lexer a partir d'arbres de decision
+(define lexer-make-tree-lexer
+  (lambda (tables IS)
+    (letrec
+	(; Contenu de la table
+	 (counters-type        (vector-ref tables 0))
+	 (<<EOF>>-pre-action   (vector-ref tables 1))
+	 (<<ERROR>>-pre-action (vector-ref tables 2))
+	 (rules-pre-actions    (vector-ref tables 3))
+	 (table-nl-start       (vector-ref tables 5))
+	 (table-no-nl-start    (vector-ref tables 6))
+	 (trees-v              (vector-ref tables 7))
+	 (acc-v                (vector-ref tables 8))
+
+	 ; Contenu du IS
+	 (IS-start-go-to-end    (cdr (assq 'start-go-to-end IS)))
+	 (IS-end-go-to-point    (cdr (assq 'end-go-to-point IS)))
+	 (IS-init-lexeme        (cdr (assq 'init-lexeme IS)))
+	 (IS-get-start-line     (cdr (assq 'get-start-line IS)))
+	 (IS-get-start-column   (cdr (assq 'get-start-column IS)))
+	 (IS-get-start-offset   (cdr (assq 'get-start-offset IS)))
+	 (IS-peek-left-context  (cdr (assq 'peek-left-context IS)))
+	 (IS-peek-char          (cdr (assq 'peek-char IS)))
+	 (IS-read-char          (cdr (assq 'read-char IS)))
+	 (IS-get-start-end-text (cdr (assq 'get-start-end-text IS)))
+	 (IS-get-user-line      (cdr (assq 'get-user-line IS)))
+	 (IS-get-user-column    (cdr (assq 'get-user-column IS)))
+	 (IS-get-user-offset    (cdr (assq 'get-user-offset IS)))
+	 (IS-user-getc          (cdr (assq 'user-getc IS)))
+	 (IS-user-ungetc        (cdr (assq 'user-ungetc IS)))
+
+	 ; Resultats
+	 (<<EOF>>-action   #f)
+	 (<<ERROR>>-action #f)
+	 (rules-actions    #f)
+	 (states           #f)
+	 (final-lexer      #f)
+
+	 ; Gestion des hooks
+	 (hook-list '())
+	 (add-hook
+	  (lambda (thunk)
+	    (set! hook-list (cons thunk hook-list))))
+	 (apply-hooks
+	  (lambda ()
+	    (let loop ((l hook-list))
+	      (if (pair? l)
+		  (begin
+		    ((car l))
+		    (loop (cdr l)))))))
+
+	 ; Preparation des actions
+	 (set-action-statics
+	  (lambda (pre-action)
+	    (pre-action final-lexer IS-user-getc IS-user-ungetc)))
+	 (prepare-special-action-none
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda ()
+		       (action "")))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action-line
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (action "" yyline)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action-all
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (action "" yyline yycolumn yyoffset)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-special-action-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-special-action-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-special-action-all  pre-action)))))
+	 (prepare-action-yytext-none
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda ()
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext-line
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext yyline))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext-all
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext yyline yycolumn yyoffset))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-action-yytext-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-action-yytext-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-action-yytext-all  pre-action)))))
+	 (prepare-action-no-yytext-none
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda ()
+		       (start-go-to-end)
+		       (action)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext-line
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (start-go-to-end)
+		       (action yyline)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext-all
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (start-go-to-end)
+		       (action yyline yycolumn yyoffset)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-action-no-yytext-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-action-no-yytext-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-action-no-yytext-all  pre-action)))))
+
+	 ; Fabrique les fonctions de dispatch
+	 (prepare-dispatch-err
+	  (lambda (leaf)
+	    (lambda (c)
+	      #f)))
+	 (prepare-dispatch-number
+	  (lambda (leaf)
+	    (let ((state-function #f))
+	      (let ((result
+		     (lambda (c)
+		       state-function))
+		    (hook
+		     (lambda ()
+		       (set! state-function (vector-ref states leaf)))))
+		(add-hook hook)
+		result))))
+	 (prepare-dispatch-leaf
+	  (lambda (leaf)
+	    (if (eq? leaf 'err)
+		(prepare-dispatch-err leaf)
+		(prepare-dispatch-number leaf))))
+	 (prepare-dispatch-<
+	  (lambda (tree)
+	    (let ((left-tree  (list-ref tree 1))
+		  (right-tree (list-ref tree 2)))
+	      (let ((bound      (list-ref tree 0))
+		    (left-func  (prepare-dispatch-tree left-tree))
+		    (right-func (prepare-dispatch-tree right-tree)))
+		(lambda (c)
+		  (if (< c bound)
+		      (left-func c)
+		      (right-func c)))))))
+	 (prepare-dispatch-=
+	  (lambda (tree)
+	    (let ((left-tree  (list-ref tree 2))
+		  (right-tree (list-ref tree 3)))
+	      (let ((bound      (list-ref tree 1))
+		    (left-func  (prepare-dispatch-tree left-tree))
+		    (right-func (prepare-dispatch-tree right-tree)))
+		(lambda (c)
+		  (if (= c bound)
+		      (left-func c)
+		      (right-func c)))))))
+	 (prepare-dispatch-tree
+	  (lambda (tree)
+	    (cond ((not (pair? tree))
+		   (prepare-dispatch-leaf tree))
+		  ((eq? (car tree) '=)
+		   (prepare-dispatch-= tree))
+		  (else
+		   (prepare-dispatch-< tree)))))
+	 (prepare-dispatch
+	  (lambda (tree)
+	    (let ((dicho-func (prepare-dispatch-tree tree)))
+	      (lambda (c)
+		(and c (dicho-func c))))))
+
+	 ; Fabrique les fonctions de transition (read & go) et (abort)
+	 (prepare-read-n-go
+	  (lambda (tree)
+	    (let ((dispatch-func (prepare-dispatch tree))
+		  (read-char     IS-read-char))
+	      (lambda ()
+		(dispatch-func (read-char))))))
+	 (prepare-abort
+	  (lambda (tree)
+	    (lambda ()
+	      #f)))
+	 (prepare-transition
+	  (lambda (tree)
+	    (if (eq? tree 'err)
+		(prepare-abort     tree)
+		(prepare-read-n-go tree))))
+
+	 ; Fabrique les fonctions d'etats ([set-end] & trans)
+	 (prepare-state-no-acc
+	   (lambda (s r1 r2)
+	     (let ((trans-func (prepare-transition (vector-ref trees-v s))))
+	       (lambda (action)
+		 (let ((next-state (trans-func)))
+		   (if next-state
+		       (next-state action)
+		       action))))))
+	 (prepare-state-yes-no
+	  (lambda (s r1 r2)
+	    (let ((peek-char       IS-peek-char)
+		  (end-go-to-point IS-end-go-to-point)
+		  (new-action1     #f)
+		  (trans-func (prepare-transition (vector-ref trees-v s))))
+	      (let ((result
+		     (lambda (action)
+		       (let* ((c (peek-char))
+			      (new-action
+			       (if (or (not c) (= c lexer-integer-newline))
+				   (begin
+				     (end-go-to-point)
+				     new-action1)
+				   action))
+			      (next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action1 (vector-ref rules-actions r1)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state-diff-acc
+	  (lambda (s r1 r2)
+	    (let ((end-go-to-point IS-end-go-to-point)
+		  (peek-char       IS-peek-char)
+		  (new-action1     #f)
+		  (new-action2     #f)
+		  (trans-func (prepare-transition (vector-ref trees-v s))))
+	      (let ((result
+		     (lambda (action)
+		       (end-go-to-point)
+		       (let* ((c (peek-char))
+			      (new-action
+			       (if (or (not c) (= c lexer-integer-newline))
+				   new-action1
+				   new-action2))
+			      (next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action1 (vector-ref rules-actions r1))
+		       (set! new-action2 (vector-ref rules-actions r2)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state-same-acc
+	  (lambda (s r1 r2)
+	    (let ((end-go-to-point IS-end-go-to-point)
+		  (trans-func (prepare-transition (vector-ref trees-v s)))
+		  (new-action #f))
+	      (let ((result
+		     (lambda (action)
+		       (end-go-to-point)
+		       (let ((next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action (vector-ref rules-actions r1)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state
+	  (lambda (s)
+	    (let* ((acc (vector-ref acc-v s))
+		   (r1 (car acc))
+		   (r2 (cdr acc)))
+	      (cond ((not r1)  (prepare-state-no-acc   s r1 r2))
+		    ((not r2)  (prepare-state-yes-no   s r1 r2))
+		    ((< r1 r2) (prepare-state-diff-acc s r1 r2))
+		    (else      (prepare-state-same-acc s r1 r2))))))
+
+	 ; Fabrique la fonction de lancement du lexage a l'etat de depart
+	 (prepare-start-same
+	  (lambda (s1 s2)
+	    (let ((peek-char    IS-peek-char)
+		  (eof-action   #f)
+		  (start-state  #f)
+		  (error-action #f))
+	      (let ((result
+		     (lambda ()
+		       (if (not (peek-char))
+			   eof-action
+			   (start-state error-action))))
+		    (hook
+		     (lambda ()
+		       (set! eof-action   <<EOF>>-action)
+		       (set! start-state  (vector-ref states s1))
+		       (set! error-action <<ERROR>>-action))))
+		(add-hook hook)
+		result))))
+	 (prepare-start-diff
+	  (lambda (s1 s2)
+	    (let ((peek-char         IS-peek-char)
+		  (eof-action        #f)
+		  (peek-left-context IS-peek-left-context)
+		  (start-state1      #f)
+		  (start-state2      #f)
+		  (error-action      #f))
+	      (let ((result
+		     (lambda ()
+		       (cond ((not (peek-char))
+			      eof-action)
+			     ((= (peek-left-context) lexer-integer-newline)
+			      (start-state1 error-action))
+			     (else
+			      (start-state2 error-action)))))
+		    (hook
+		     (lambda ()
+		       (set! eof-action <<EOF>>-action)
+		       (set! start-state1 (vector-ref states s1))
+		       (set! start-state2 (vector-ref states s2))
+		       (set! error-action <<ERROR>>-action))))
+		(add-hook hook)
+		result))))
+	 (prepare-start
+	  (lambda ()
+	    (let ((s1 table-nl-start)
+		  (s2 table-no-nl-start))
+	      (if (= s1 s2)
+		  (prepare-start-same s1 s2)
+		  (prepare-start-diff s1 s2)))))
+
+	 ; Fabrique la fonction principale
+	 (prepare-lexer-none
+	  (lambda ()
+	    (let ((init-lexeme IS-init-lexeme)
+		  (start-func  (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		((start-func))))))
+	 (prepare-lexer-line
+	  (lambda ()
+	    (let ((init-lexeme    IS-init-lexeme)
+		  (get-start-line IS-get-start-line)
+		  (start-func     (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		(let ((yyline (get-start-line)))
+		  ((start-func) yyline))))))
+	 (prepare-lexer-all
+	  (lambda ()
+	    (let ((init-lexeme      IS-init-lexeme)
+		  (get-start-line   IS-get-start-line)
+		  (get-start-column IS-get-start-column)
+		  (get-start-offset IS-get-start-offset)
+		  (start-func       (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		(let ((yyline   (get-start-line))
+		      (yycolumn (get-start-column))
+		      (yyoffset (get-start-offset)))
+		  ((start-func) yyline yycolumn yyoffset))))))
+	 (prepare-lexer
+	  (lambda ()
+	    (cond ((eq? counters-type 'none) (prepare-lexer-none))
+		  ((eq? counters-type 'line) (prepare-lexer-line))
+		  ((eq? counters-type 'all)  (prepare-lexer-all))))))
+
+      ; Calculer la valeur de <<EOF>>-action et de <<ERROR>>-action
+      (set! <<EOF>>-action   (prepare-special-action <<EOF>>-pre-action))
+      (set! <<ERROR>>-action (prepare-special-action <<ERROR>>-pre-action))
+
+      ; Calculer la valeur de rules-actions
+      (let* ((len (quotient (vector-length rules-pre-actions) 2))
+	     (v (make-vector len)))
+	(let loop ((r (- len 1)))
+	  (if (< r 0)
+	      (set! rules-actions v)
+	      (let* ((yytext? (vector-ref rules-pre-actions (* 2 r)))
+		     (pre-action (vector-ref rules-pre-actions (+ (* 2 r) 1)))
+		     (action (if yytext?
+				 (prepare-action-yytext    pre-action)
+				 (prepare-action-no-yytext pre-action))))
+		(vector-set! v r action)
+		(loop (- r 1))))))
+
+      ; Calculer la valeur de states
+      (let* ((len (vector-length trees-v))
+	     (v (make-vector len)))
+	(let loop ((s (- len 1)))
+	  (if (< s 0)
+	      (set! states v)
+	      (begin
+		(vector-set! v s (prepare-state s))
+		(loop (- s 1))))))
+
+      ; Calculer la valeur de final-lexer
+      (set! final-lexer (prepare-lexer))
+
+      ; Executer les hooks
+      (apply-hooks)
+
+      ; Resultat
+      final-lexer)))
+
+; Fabrication de lexer a partir de listes de caracteres taggees
+(define lexer-make-char-lexer
+  (let* ((char->class
+	  (lambda (c)
+	    (let ((n (char->integer c)))
+	      (list (cons n n)))))
+	 (merge-sort
+	  (lambda (l combine zero-elt)
+	    (if (null? l)
+		zero-elt
+		(let loop1 ((l l))
+		  (if (null? (cdr l))
+		      (car l)
+		      (loop1
+		       (let loop2 ((l l))
+			 (cond ((null? l)
+				l)
+			       ((null? (cdr l))
+				l)
+			       (else
+				(cons (combine (car l) (cadr l))
+				      (loop2 (cddr l))))))))))))
+	 (finite-class-union
+	  (lambda (c1 c2)
+	    (let loop ((c1 c1) (c2 c2) (u '()))
+	      (if (null? c1)
+		  (if (null? c2)
+		      (reverse u)
+		      (loop c1 (cdr c2) (cons (car c2) u)))
+		  (if (null? c2)
+		      (loop (cdr c1) c2 (cons (car c1) u))
+		      (let* ((r1 (car c1))
+			     (r2 (car c2))
+			     (r1start (car r1))
+			     (r1end (cdr r1))
+			     (r2start (car r2))
+			     (r2end (cdr r2)))
+			(if (<= r1start r2start)
+			    (cond ((< (+ r1end 1) r2start)
+				   (loop (cdr c1) c2 (cons r1 u)))
+				  ((<= r1end r2end)
+				   (loop (cdr c1)
+					 (cons (cons r1start r2end) (cdr c2))
+					 u))
+				  (else
+				   (loop c1 (cdr c2) u)))
+			    (cond ((> r1start (+ r2end 1))
+				   (loop c1 (cdr c2) (cons r2 u)))
+				  ((>= r1end r2end)
+				   (loop (cons (cons r2start r1end) (cdr c1))
+					 (cdr c2)
+					 u))
+				  (else
+				   (loop (cdr c1) c2 u))))))))))
+	 (char-list->class
+	  (lambda (cl)
+	    (let ((classes (map char->class cl)))
+	      (merge-sort classes finite-class-union '()))))
+	 (class-<
+	  (lambda (b1 b2)
+	    (cond ((eq? b1 'inf+) #f)
+		  ((eq? b2 'inf-) #f)
+		  ((eq? b1 'inf-) #t)
+		  ((eq? b2 'inf+) #t)
+		  (else (< b1 b2)))))
+	 (finite-class-compl
+	  (lambda (c)
+	    (let loop ((c c) (start 'inf-))
+	      (if (null? c)
+		  (list (cons start 'inf+))
+		  (let* ((r (car c))
+			 (rstart (car r))
+			 (rend (cdr r)))
+		    (if (class-< start rstart)
+			(cons (cons start (- rstart 1))
+			      (loop c rstart))
+			(loop (cdr c) (+ rend 1))))))))
+	 (tagged-chars->class
+	  (lambda (tcl)
+	    (let* ((inverse? (car tcl))
+		   (cl (cdr tcl))
+		   (class-tmp (char-list->class cl)))
+	      (if inverse? (finite-class-compl class-tmp) class-tmp))))
+	 (charc->arc
+	  (lambda (charc)
+	    (let* ((tcl (car charc))
+		   (dest (cdr charc))
+		   (class (tagged-chars->class tcl)))
+	      (cons class dest))))
+	 (arc->sharcs
+	  (lambda (arc)
+	    (let* ((range-l (car arc))
+		   (dest (cdr arc))
+		   (op (lambda (range) (cons range dest))))
+	      (map op range-l))))
+	 (class-<=
+	  (lambda (b1 b2)
+	    (cond ((eq? b1 'inf-) #t)
+		  ((eq? b2 'inf+) #t)
+		  ((eq? b1 'inf+) #f)
+		  ((eq? b2 'inf-) #f)
+		  (else (<= b1 b2)))))
+	 (sharc-<=
+	  (lambda (sharc1 sharc2)
+	    (class-<= (caar sharc1) (caar sharc2))))
+	 (merge-sharcs
+	  (lambda (l1 l2)
+	    (let loop ((l1 l1) (l2 l2))
+	      (cond ((null? l1)
+		     l2)
+		    ((null? l2)
+		     l1)
+		    (else
+		     (let ((sharc1 (car l1))
+			   (sharc2 (car l2)))
+		       (if (sharc-<= sharc1 sharc2)
+			   (cons sharc1 (loop (cdr l1) l2))
+			   (cons sharc2 (loop l1 (cdr l2))))))))))
+	 (class-= eqv?)
+	 (fill-error
+	  (lambda (sharcs)
+	    (let loop ((sharcs sharcs) (start 'inf-))
+	      (cond ((class-= start 'inf+)
+		     '())
+		    ((null? sharcs)
+		     (cons (cons (cons start 'inf+) 'err)
+			   (loop sharcs 'inf+)))
+		    (else
+		     (let* ((sharc (car sharcs))
+			    (h (caar sharc))
+			    (t (cdar sharc)))
+		       (if (class-< start h)
+			   (cons (cons (cons start (- h 1)) 'err)
+				 (loop sharcs h))
+			   (cons sharc (loop (cdr sharcs)
+					     (if (class-= t 'inf+)
+						 'inf+
+						 (+ t 1)))))))))))
+	 (charcs->tree
+	  (lambda (charcs)
+	    (let* ((op (lambda (charc) (arc->sharcs (charc->arc charc))))
+		   (sharcs-l (map op charcs))
+		   (sorted-sharcs (merge-sort sharcs-l merge-sharcs '()))
+		   (full-sharcs (fill-error sorted-sharcs))
+		   (op (lambda (sharc) (cons (caar sharc) (cdr sharc))))
+		   (table (list->vector (map op full-sharcs))))
+	      (let loop ((left 0) (right (- (vector-length table) 1)))
+		(if (= left right)
+		    (cdr (vector-ref table left))
+		    (let ((mid (quotient (+ left right 1) 2)))
+		      (if (and (= (+ left 2) right)
+			       (= (+ (car (vector-ref table mid)) 1)
+				  (car (vector-ref table right)))
+			       (eqv? (cdr (vector-ref table left))
+				     (cdr (vector-ref table right))))
+			  (list '=
+				(car (vector-ref table mid))
+				(cdr (vector-ref table mid))
+				(cdr (vector-ref table left)))
+			  (list (car (vector-ref table mid))
+				(loop left (- mid 1))
+				(loop mid right))))))))))
+    (lambda (tables IS)
+      (let ((counters         (vector-ref tables 0))
+	    (<<EOF>>-action   (vector-ref tables 1))
+	    (<<ERROR>>-action (vector-ref tables 2))
+	    (rules-actions    (vector-ref tables 3))
+	    (nl-start         (vector-ref tables 5))
+	    (no-nl-start      (vector-ref tables 6))
+	    (charcs-v         (vector-ref tables 7))
+	    (acc-v            (vector-ref tables 8)))
+	(let* ((len (vector-length charcs-v))
+	       (v (make-vector len)))
+	  (let loop ((i (- len 1)))
+	    (if (>= i 0)
+		(begin
+		  (vector-set! v i (charcs->tree (vector-ref charcs-v i)))
+		  (loop (- i 1)))
+		(lexer-make-tree-lexer
+		 (vector counters
+			 <<EOF>>-action
+			 <<ERROR>>-action
+			 rules-actions
+			 'decision-trees
+			 nl-start
+			 no-nl-start
+			 v
+			 acc-v)
+		 IS))))))))
+
+; Fabrication d'un lexer a partir de code pre-genere
+(define lexer-make-code-lexer
+  (lambda (tables IS)
+    (let ((<<EOF>>-pre-action   (vector-ref tables 1))
+	  (<<ERROR>>-pre-action (vector-ref tables 2))
+	  (rules-pre-action     (vector-ref tables 3))
+	  (code                 (vector-ref tables 5)))
+      (code <<EOF>>-pre-action <<ERROR>>-pre-action rules-pre-action IS))))
+
+(define lexer-make-lexer
+  (lambda (tables IS)
+    (let ((automaton-type (vector-ref tables 4)))
+      (cond ((eq? automaton-type 'decision-trees)
+	     (lexer-make-tree-lexer tables IS))
+	    ((eq? automaton-type 'tagged-chars-lists)
+	     (lexer-make-char-lexer tables IS))
+	    ((eq? automaton-type 'code)
+	     (lexer-make-code-lexer tables IS))))))
+
+; Module lexparser.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Fonctions auxilliaires du lexer
+;
+
+(define parse-spec-char
+  (lambda (lexeme line column)
+    (make-tok char-tok lexeme line column newline-ch)))
+
+(define parse-digits-char
+  (lambda (lexeme line column)
+    (let* ((num (substring lexeme 1 (string-length lexeme)))
+	   (n (string->number num)))
+      (make-tok char-tok lexeme line column n))))
+
+(define parse-quoted-char
+  (lambda (lexeme line column)
+    (let ((c (string-ref lexeme 1)))
+      (make-tok char-tok lexeme line column (char->integer c)))))
+
+(define parse-ordinary-char
+  (lambda (lexeme line column)
+    (let ((c (string-ref lexeme 0)))
+      (make-tok char-tok lexeme line column (char->integer c)))))
+
+(define extract-id
+  (lambda (s)
+    (let ((len (string-length s)))
+      (substring s 1 (- len 1)))))
+
+(define parse-id
+  (lambda (lexeme line column)
+    (make-tok id-tok lexeme line column (string-downcase lexeme) lexeme)))
+
+(define parse-id-ref
+  (lambda (lexeme line column)
+    (let* ((orig-name (extract-id lexeme))
+	   (name (string-downcase orig-name)))
+    (make-tok subst-tok lexeme line column name orig-name))))
+
+(define parse-power-m
+  (lambda (lexeme line column)
+    (let* ((len (string-length lexeme))
+	   (substr (substring lexeme 1 (- len 1)))
+	   (m (string->number substr))
+	   (range (cons m m)))
+      (make-tok power-tok lexeme line column range))))
+
+(define parse-power-m-inf
+  (lambda (lexeme line column)
+    (let* ((len (string-length lexeme))
+	   (substr (substring lexeme 1 (- len 2)))
+	   (m (string->number substr))
+	   (range (cons m 'inf)))
+      (make-tok power-tok lexeme line column range))))
+
+(define parse-power-m-n
+  (lambda (lexeme line column)
+    (let ((len (string-length lexeme)))
+      (let loop ((comma 2))
+	(if (char=? (string-ref lexeme comma) #\,)
+	    (let* ((sub1 (substring lexeme 1 comma))
+		   (sub2 (substring lexeme (+ comma 1) (- len 1)))
+		   (m (string->number sub1))
+		   (n (string->number sub2))
+		   (range (cons m n)))
+	      (make-tok power-tok lexeme line column range))
+	    (loop (+ comma 1)))))))
+
+
+
+
+;
+; Lexer generique
+;
+
+(define lexer-raw #f)
+(define lexer-stack '())
+
+(define lexer-alist #f)
+
+(define lexer-buffer #f)
+(define lexer-buffer-empty? #t)
+
+(define lexer-history '())
+(define lexer-history-interp #f)
+
+(define init-lexer
+  (lambda (port)
+    (let* ((IS (lexer-make-IS 'port port 'all))
+	   (action-lexer (lexer-make-lexer action-tables IS))
+	   (class-lexer  (lexer-make-lexer class-tables  IS))
+	   (macro-lexer  (lexer-make-lexer macro-tables  IS))
+	   (regexp-lexer (lexer-make-lexer regexp-tables IS))
+	   (string-lexer (lexer-make-lexer string-tables IS)))
+      (set! lexer-raw #f)
+      (set! lexer-stack '())
+      (set! lexer-alist
+	    (list (cons 'action action-lexer)
+		  (cons 'class  class-lexer)
+		  (cons 'macro  macro-lexer)
+		  (cons 'regexp regexp-lexer)
+		  (cons 'string string-lexer)))
+      (set! lexer-buffer-empty? #t)
+      (set! lexer-history '()))))
+
+; Lexer brut
+; S'assurer qu'il n'y a pas de risque de changer de
+; lexer quand le buffer est rempli
+(define push-lexer
+  (lambda (name)
+    (set! lexer-stack (cons lexer-raw lexer-stack))
+    (set! lexer-raw (cdr (assq name lexer-alist)))))
+
+(define pop-lexer
+  (lambda ()
+    (set! lexer-raw (car lexer-stack))
+    (set! lexer-stack (cdr lexer-stack))))
+
+; Traite le "unget" (capacite du unget: 1)
+(define lexer2
+  (lambda ()
+    (if lexer-buffer-empty?
+	(lexer-raw)
+	(begin
+	  (set! lexer-buffer-empty? #t)
+	  lexer-buffer))))
+
+(define lexer2-unget
+  (lambda (tok)
+    (set! lexer-buffer tok)
+    (set! lexer-buffer-empty? #f)))
+
+; Traite l'historique
+(define lexer
+  (lambda ()
+    (let* ((tok (lexer2))
+	   (tok-lexeme (get-tok-lexeme tok))
+	   (hist-lexeme (if lexer-history-interp
+			    (blank-translate tok-lexeme)
+			    tok-lexeme)))
+      (set! lexer-history (cons hist-lexeme lexer-history))
+      tok)))
+
+(define lexer-unget
+  (lambda (tok)
+    (set! lexer-history (cdr lexer-history))
+    (lexer2-unget tok)))
+
+(define lexer-set-blank-history
+  (lambda (b)
+    (set! lexer-history-interp b)))
+
+(define blank-translate
+  (lambda (s)
+    (let ((ss (string-copy s)))
+      (let loop ((i (- (string-length ss) 1)))
+	(cond ((< i 0)
+	       ss)
+	      ((char=? (string-ref ss i) (integer->char tab-ch))
+	       (loop (- i 1)))
+	      ((char=? (string-ref ss i) #\newline)
+	       (loop (- i 1)))
+	      (else
+	       (string-set! ss i #\space)
+	       (loop (- i 1))))))))
+
+(define lexer-get-history
+  (lambda ()
+    (let* ((rightlist (reverse lexer-history))
+	   (str (string-append-list rightlist))
+	   (strlen (string-length str))
+	   (str2 (if (and (> strlen 0)
+			  (char=? (string-ref str (- strlen 1)) #\newline))
+		     str
+		     (string-append str (string #\newline)))))
+      (set! lexer-history '())
+      str2)))
+
+
+
+
+;
+; Traitement des listes de tokens
+;
+
+(define de-anchor-tokens
+  (let ((not-anchor-toks (make-dispatch-table number-of-tokens
+					      (list (cons caret-tok     #f)
+						    (cons dollar-tok    #f)
+						    (cons <<EOF>>-tok   #f)
+						    (cons <<ERROR>>-tok #f))
+					      #t)))
+    (lambda (tok-list)
+      (if (null? tok-list)
+	  '()
+	  (let* ((tok (car tok-list))
+		 (tok-type (get-tok-type tok))
+		 (toks (cdr tok-list))
+		 (new-toks (de-anchor-tokens toks)))
+	    (cond ((vector-ref not-anchor-toks tok-type)
+		   (cons tok new-toks))
+		  ((or (= tok-type caret-tok) (= tok-type dollar-tok))
+		   (let* ((line (get-tok-line tok))
+			  (column (get-tok-column tok))
+			  (attr (if (= tok-type caret-tok) caret-ch dollar-ch))
+			  (new-tok (make-tok char-tok "" line column attr)))
+		     (cons new-tok new-toks)))
+		  ((= tok-type <<EOF>>-tok)
+		   (lex-error (get-tok-line tok)
+			      (get-tok-column tok)
+			      "the <<EOF>> anchor must be used alone"
+			      " and only after %%."))
+		  ((= tok-type <<ERROR>>-tok)
+		   (lex-error (get-tok-line tok)
+			      (get-tok-column tok)
+			      "the <<ERROR>> anchor must be used alone"
+			      " and only after %%."))))))))
+
+(define strip-end
+  (lambda (l)
+    (if (null? (cdr l))
+	'()
+	(cons (car l) (strip-end (cdr l))))))
+
+(define extract-anchors
+  (lambda (tok-list)
+    (let* ((tok1 (car tok-list))
+	   (line (get-tok-line tok1))
+	   (tok1-type (get-tok-type tok1)))
+      (cond ((and (= tok1-type <<EOF>>-tok) (null? (cdr tok-list)))
+	     (make-rule line #t #f #f #f '() #f))
+	    ((and (= tok1-type <<ERROR>>-tok) (null? (cdr tok-list)))
+	     (make-rule line #f #t #f #f '() #f))
+	    (else
+	     (let* ((bol? (= tok1-type caret-tok))
+		    (tok-list2 (if bol? (cdr tok-list) tok-list)))
+	       (if (null? tok-list2)
+		   (make-rule line #f #f bol? #f tok-list2 #f)
+		   (let* ((len (length tok-list2))
+			  (tok2 (list-ref tok-list2 (- len 1)))
+			  (tok2-type (get-tok-type tok2))
+			  (eol? (= tok2-type dollar-tok))
+			  (tok-list3 (if eol?
+					 (strip-end tok-list2)
+					 tok-list2)))
+		     (make-rule line #f #f bol? eol? tok-list3 #f)))))))))
+
+(define char-list->conc
+  (lambda (char-list)
+    (if (null? char-list)
+	(make-re epsilon-re)
+	(let loop ((cl char-list))
+	  (let* ((c (car cl))
+		 (cl2 (cdr cl)))
+	    (if (null? cl2)
+		(make-re char-re c)
+		(make-re conc-re (make-re char-re c) (loop cl2))))))))
+
+(define parse-tokens-atom
+  (let ((action-table
+	 (make-dispatch-table
+	  number-of-tokens
+	  (list (cons lpar-tok
+		      (lambda (tok tok-list macros)
+			(parse-tokens-sub tok-list macros)))
+		(cons dot-tok
+		      (lambda (tok tok-list macros)
+			(cons (make-re class-re dot-class) (cdr tok-list))))
+		(cons subst-tok
+		      (lambda (tok tok-list macros)
+			(let* ((name (get-tok-attr tok))
+			       (ass (assoc name macros)))
+			  (if ass
+			      (cons (cdr ass) (cdr tok-list))
+			      (lex-error (get-tok-line tok)
+					 (get-tok-column tok)
+					 "unknown macro \""
+					 (get-tok-2nd-attr tok)
+					 "\".")))))
+		(cons char-tok
+		      (lambda (tok tok-list macros)
+			(let ((c (get-tok-attr tok)))
+			  (cons (make-re char-re c) (cdr tok-list)))))
+		(cons class-tok
+		      (lambda (tok tok-list macros)
+			(let ((class (get-tok-attr tok)))
+			  (cons (make-re class-re class) (cdr tok-list)))))
+		(cons string-tok
+		      (lambda (tok tok-list macros)
+			(let* ((char-list (get-tok-attr tok))
+			       (re (char-list->conc char-list)))
+			  (cons re (cdr tok-list))))))
+	  (lambda (tok tok-list macros)
+	    (lex-error (get-tok-line tok)
+		       (get-tok-column tok)
+		       "syntax error in regular expression.")))))
+    (lambda (tok-list macros)
+      (let* ((tok (car tok-list))
+	     (tok-type (get-tok-type tok))
+	     (action (vector-ref action-table tok-type)))
+	(action tok tok-list macros)))))
+
+(define check-power-tok
+  (lambda (tok)
+    (let* ((range (get-tok-attr tok))
+	   (start (car range))
+	   (end (cdr range)))
+      (if (or (eq? 'inf end) (<= start end))
+	  range
+	  (lex-error (get-tok-line tok)
+		     (get-tok-column tok)
+		     "incorrect power specification.")))))
+
+(define power->star-plus
+  (lambda (re range)
+    (power->star-plus-rec re (car range) (cdr range))))
+
+(define power->star-plus-rec
+  (lambda (re start end)
+    (cond ((eq? end 'inf)
+	   (cond ((= start 0)
+		  (make-re star-re re))
+		 ((= start 1)
+		  (make-re plus-re re))
+		 (else
+		  (make-re conc-re
+			   re
+			   (power->star-plus-rec re (- start 1) 'inf)))))
+	  ((= start 0)
+	   (cond ((= end 0)
+		  (make-re epsilon-re))
+		 ((= end 1)
+		  (make-re question-re re))
+		 (else
+		  (make-re question-re
+			   (power->star-plus-rec re 1 end)))))
+	  ((= start 1)
+	   (if (= end 1)
+	       re
+	       (make-re conc-re re (power->star-plus-rec re 0 (- end 1)))))
+	  (else
+	   (make-re conc-re
+		    re
+		    (power->star-plus-rec re (- start 1) (- end 1)))))))
+
+(define parse-tokens-fact
+  (let ((not-op-toks (make-dispatch-table number-of-tokens
+					  (list (cons question-tok #f)
+						(cons plus-tok     #f)
+						(cons star-tok     #f)
+						(cons power-tok    #f))
+					  #t)))
+    (lambda (tok-list macros)
+      (let* ((result (parse-tokens-atom tok-list macros))
+	     (re (car result))
+	     (tok-list2 (cdr result)))
+	(let loop ((re re) (tok-list3 tok-list2))
+	  (let* ((tok (car tok-list3))
+		 (tok-type (get-tok-type tok)))
+	    (cond ((vector-ref not-op-toks tok-type)
+		   (cons re tok-list3))
+		  ((= tok-type question-tok)
+		   (loop (make-re question-re re) (cdr tok-list3)))
+		  ((= tok-type plus-tok)
+		   (loop (make-re plus-re re) (cdr tok-list3)))
+		  ((= tok-type star-tok)
+		   (loop (make-re star-re re) (cdr tok-list3)))
+		  ((= tok-type power-tok)
+		   (loop (power->star-plus re (check-power-tok tok))
+			 (cdr tok-list3))))))))))
+
+(define parse-tokens-conc
+  (lambda (tok-list macros)
+    (let* ((result1 (parse-tokens-fact tok-list macros))
+	   (re1 (car result1))
+	   (tok-list2 (cdr result1))
+	   (tok (car tok-list2))
+	   (tok-type (get-tok-type tok)))
+      (cond ((or (= tok-type pipe-tok)
+		 (= tok-type rpar-tok))
+	     result1)
+	    (else ; Autres facteurs
+	     (let* ((result2 (parse-tokens-conc tok-list2 macros))
+		    (re2 (car result2))
+		    (tok-list3 (cdr result2)))
+	       (cons (make-re conc-re re1 re2) tok-list3)))))))
+
+(define parse-tokens-or
+  (lambda (tok-list macros)
+    (let* ((result1 (parse-tokens-conc tok-list macros))
+	   (re1 (car result1))
+	   (tok-list2 (cdr result1))
+	   (tok (car tok-list2))
+	   (tok-type (get-tok-type tok)))
+      (cond ((= tok-type pipe-tok)
+	     (let* ((tok-list3 (cdr tok-list2))
+		    (result2 (parse-tokens-or tok-list3 macros))
+		    (re2 (car result2))
+		    (tok-list4 (cdr result2)))
+	       (cons (make-re or-re re1 re2) tok-list4)))
+	    (else ; rpar-tok
+	     result1)))))
+
+(define parse-tokens-sub
+  (lambda (tok-list macros)
+    (let* ((tok-list2 (cdr tok-list)) ; Manger le lpar-tok
+	   (result (parse-tokens-or tok-list2 macros))
+	   (re (car result))
+	   (tok-list3 (cdr result))
+	   (tok-list4 (cdr tok-list3))) ; Manger le rpar-tok
+      (cons re tok-list4))))
+
+(define parse-tokens-match
+  (lambda (tok-list line)
+    (let loop ((tl tok-list) (count 0))
+      (if (null? tl)
+	  (if (> count 0)
+	      (lex-error line
+			 #f
+			 "mismatched parentheses."))
+	  (let* ((tok (car tl))
+		 (tok-type (get-tok-type tok)))
+	    (cond ((= tok-type lpar-tok)
+		   (loop (cdr tl) (+ count 1)))
+		  ((= tok-type rpar-tok)
+		   (if (zero? count)
+		       (lex-error line
+				  #f
+				  "mismatched parentheses."))
+		   (loop (cdr tl) (- count 1)))
+		  (else
+		   (loop (cdr tl) count))))))))
+
+; Ne traite pas les anchors
+(define parse-tokens
+  (lambda (tok-list macros)
+    (if (null? tok-list)
+	(make-re epsilon-re)
+	(let ((line (get-tok-line (car tok-list))))
+	  (parse-tokens-match tok-list line)
+	  (let* ((begin-par (make-tok lpar-tok "" line 1))
+		 (end-par (make-tok rpar-tok "" line 1)))
+	    (let* ((tok-list2 (append (list begin-par)
+				      tok-list
+				      (list end-par)))
+		   (result (parse-tokens-sub tok-list2 macros)))
+	      (car result))))))) ; (cdr result) == () obligatoirement
+
+(define tokens->regexp
+  (lambda (tok-list macros)
+    (let ((tok-list2 (de-anchor-tokens tok-list)))
+      (parse-tokens tok-list2 macros))))
+
+(define tokens->rule
+  (lambda (tok-list macros)
+    (let* ((rule (extract-anchors tok-list))
+	   (tok-list2 (get-rule-regexp rule))
+	   (tok-list3 (de-anchor-tokens tok-list2))
+	   (re (parse-tokens tok-list3 macros)))
+      (set-rule-regexp rule re)
+      rule)))
+
+; Retourne une paire: <<EOF>>-action et vecteur des regles ordinaires
+(define adapt-rules
+  (lambda (rules)
+    (let loop ((r rules) (revr '()) (<<EOF>>-action #f) (<<ERROR>>-action #f))
+      (if (null? r)
+	  (cons (or <<EOF>>-action default-<<EOF>>-action)
+		(cons (or <<ERROR>>-action default-<<ERROR>>-action)
+		      (list->vector (reverse revr))))
+	  (let ((r1 (car r)))
+	    (cond ((get-rule-eof? r1)
+		   (if <<EOF>>-action
+		       (lex-error (get-rule-line r1)
+				  #f
+				  "the <<EOF>> anchor can be "
+				  "used at most once.")
+		       (loop (cdr r)
+			     revr
+			     (get-rule-action r1)
+			     <<ERROR>>-action)))
+		  ((get-rule-error? r1)
+		   (if <<ERROR>>-action
+		       (lex-error (get-rule-line r1)
+				  #f
+				  "the <<ERROR>> anchor can be "
+				  "used at most once.")
+		       (loop (cdr r)
+			     revr
+			     <<EOF>>-action
+			     (get-rule-action r1))))
+		  (else
+		   (loop (cdr r)
+			 (cons r1 revr)
+			 <<EOF>>-action
+			 <<ERROR>>-action))))))))
+
+
+
+
+;
+; Analyseur de fichier lex
+;
+
+(define parse-hv-blanks
+  (lambda ()
+    (let* ((tok (lexer))
+	   (tok-type (get-tok-type tok)))
+      (if (or (= tok-type hblank-tok)
+	      (= tok-type vblank-tok))
+	  (parse-hv-blanks)
+	  (lexer-unget tok)))))
+
+(define parse-class-range
+  (lambda ()
+    (let* ((tok (lexer))
+	   (tok-type (get-tok-type tok)))
+      (cond ((= tok-type char-tok)
+	     (let* ((c (get-tok-attr tok))
+		    (tok2 (lexer))
+		    (tok2-type (get-tok-type tok2)))
+	       (if (not (= tok2-type minus-tok))
+		   (begin
+		     (lexer-unget tok2)
+		     (cons c c))
+		   (let* ((tok3 (lexer))
+			  (tok3-type (get-tok-type tok3)))
+		     (cond ((= tok3-type char-tok)
+			    (let ((c2 (get-tok-attr tok3)))
+			      (if (> c c2)
+				  (lex-error (get-tok-line tok3)
+					     (get-tok-column tok3)
+					     "bad range specification in "
+					     "character class;"
+					     #\newline
+					     "the start character is "
+					     "higher than the end one.")
+				  (cons c c2))))
+		           ((or (= tok3-type rbrack-tok)
+				(= tok3-type minus-tok))
+			    (lex-error (get-tok-line tok3)
+				       (get-tok-column tok3)
+				       "bad range specification in "
+				       "character class; a specification"
+				       #\newline
+				       "like \"-x\", \"x--\" or \"x-]\" has "
+				       "been used."))
+			   ((= tok3-type eof-tok)
+			    (lex-error (get-tok-line tok3)
+				       #f
+				       "eof of file found while parsing "
+				       "a character class.")))))))
+	    ((= tok-type minus-tok)
+	     (lex-error (get-tok-line tok)
+			(get-tok-column tok)
+			"bad range specification in character class; a "
+			"specification"
+			#\newline
+			"like \"-x\", \"x--\" or \"x-]\" has been used."))
+            ((= tok-type rbrack-tok)
+	     #f)
+	    ((= tok-type eof-tok)
+	     (lex-error (get-tok-line tok)
+			#f
+			"eof of file found while parsing "
+			"a character class."))))))
+
+(define parse-class
+  (lambda (initial-class negative-class? line column)
+    (push-lexer 'class)
+    (let loop ((class initial-class))
+      (let ((new-range (parse-class-range)))
+	(if new-range
+	    (loop (class-union (list new-range) class))
+	    (let ((class (if negative-class?
+			     (class-compl class)
+			     class)))
+	      (pop-lexer)
+	      (make-tok class-tok "" line column class)))))))
+
+(define parse-string
+  (lambda (line column)
+    (push-lexer 'string)
+    (let ((char-list (let loop ()
+		       (let* ((tok (lexer))
+			      (tok-type (get-tok-type tok)))
+			 (cond ((= tok-type char-tok)
+				(cons (get-tok-attr tok) (loop)))
+			       ((= tok-type doublequote-tok)
+				(pop-lexer)
+				'())
+			       (else ; eof-tok
+				(lex-error (get-tok-line tok)
+					   #f
+					   "end of file found while "
+					   "parsing a string.")))))))
+      (make-tok string-tok "" line column char-list))))
+
+(define parse-regexp
+  (let* ((end-action
+	  (lambda (tok loop)
+	    (lexer-unget tok)
+	    (pop-lexer)
+	    (lexer-set-blank-history #f)
+	    `()))
+	 (action-table
+	  (make-dispatch-table
+	   number-of-tokens
+	   (list (cons eof-tok end-action)
+		 (cons hblank-tok end-action)
+		 (cons vblank-tok end-action)
+		 (cons lbrack-tok
+		       (lambda (tok loop)
+			 (let ((tok1 (parse-class (list)
+						  #f
+						  (get-tok-line tok)
+						  (get-tok-column tok))))
+			   (cons tok1 (loop)))))
+		 (cons lbrack-rbrack-tok
+		       (lambda (tok loop)
+			 (let ((tok1 (parse-class
+				      (list (cons rbrack-ch rbrack-ch))
+				      #f
+				      (get-tok-line tok)
+				      (get-tok-column tok))))
+			   (cons tok1 (loop)))))
+		 (cons lbrack-caret-tok
+		       (lambda (tok loop)
+			 (let ((tok1 (parse-class (list)
+						  #t
+						  (get-tok-line tok)
+						  (get-tok-column tok))))
+			   (cons tok1 (loop)))))
+		 (cons lbrack-minus-tok
+		       (lambda (tok loop)
+			 (let ((tok1 (parse-class
+				      (list (cons minus-ch minus-ch))
+				      #f
+				      (get-tok-line tok)
+				      (get-tok-column tok))))
+			   (cons tok1 (loop)))))
+		 (cons doublequote-tok
+		       (lambda (tok loop)
+			 (let ((tok1 (parse-string (get-tok-line tok)
+						   (get-tok-column tok))))
+			   (cons tok1 (loop)))))
+		 (cons illegal-tok
+		       (lambda (tok loop)
+			 (lex-error (get-tok-line tok)
+				    (get-tok-column tok)
+				    "syntax error in macro reference."))))
+	   (lambda (tok loop)
+	     (cons tok (loop))))))
+    (lambda ()
+      (push-lexer 'regexp)
+      (lexer-set-blank-history #t)
+      (parse-hv-blanks)
+      (let loop ()
+	(let* ((tok (lexer))
+	       (tok-type (get-tok-type tok))
+	       (action (vector-ref action-table tok-type)))
+	  (action tok loop))))))
+
+(define parse-ws1-regexp  ; Exige un blanc entre le nom et la RE d'une macro
+  (lambda ()
+    (let* ((tok (lexer))
+	   (tok-type (get-tok-type tok)))
+      (cond ((or (= tok-type hblank-tok) (= tok-type vblank-tok))
+	     (parse-regexp))
+	    (else  ; percent-percent-tok, id-tok ou illegal-tok
+	     (lex-error (get-tok-line tok)
+			(get-tok-column tok)
+			"white space expected."))))))
+
+(define parse-macro
+  (lambda (macros)
+    (push-lexer 'macro)
+    (parse-hv-blanks)
+    (let* ((tok (lexer))
+	   (tok-type (get-tok-type tok)))
+      (cond ((= tok-type id-tok)
+	     (let* ((name (get-tok-attr tok))
+		    (ass (assoc name macros)))
+	       (if ass
+		   (lex-error (get-tok-line tok)
+			      (get-tok-column tok)
+			      "the macro \""
+			      (get-tok-2nd-attr tok)
+			      "\" has already been defined.")
+		   (let* ((tok-list (parse-ws1-regexp))
+			  (regexp (tokens->regexp tok-list macros)))
+		     (pop-lexer)
+		     (cons name regexp)))))
+            ((= tok-type percent-percent-tok)
+	     (pop-lexer)
+	     #f)
+	    ((= tok-type illegal-tok)
+	     (lex-error (get-tok-line tok)
+			(get-tok-column tok)
+			"macro name expected."))
+	    ((= tok-type eof-tok)
+	     (lex-error (get-tok-line tok)
+			#f
+			"end of file found before %%."))))))
+
+(define parse-macros
+  (lambda ()
+    (let loop ((macros '()))
+      (let ((macro (parse-macro macros)))
+	(if macro
+	    (loop (cons macro macros))
+	    macros)))))
+
+(define parse-action-end
+  (lambda (<<EOF>>-action? <<ERROR>>-action? action?)
+    (let ((act (lexer-get-history)))
+      (cond (action?
+	     act)
+	    (<<EOF>>-action?
+	     (string-append act default-<<EOF>>-action))
+	    (<<ERROR>>-action?
+	     (string-append act default-<<ERROR>>-action))
+	    (else
+	     (string-append act default-action))))))
+
+(define parse-action
+  (lambda (<<EOF>>-action? <<ERROR>>-action?)
+    (push-lexer 'action)
+    (let loop ((action? #f))
+      (let* ((tok (lexer))
+	     (tok-type (get-tok-type tok)))
+	(cond ((= tok-type char-tok)
+	       (loop #t))
+	      ((= tok-type hblank-tok)
+	       (loop action?))
+	      ((= tok-type vblank-tok)
+	       (push-lexer 'regexp)
+	       (let* ((tok (lexer))
+		      (tok-type (get-tok-type tok))
+		      (bidon (lexer-unget tok)))
+		 (pop-lexer)
+		 (if (or (= tok-type hblank-tok)
+			 (= tok-type vblank-tok))
+		     (loop action?)
+		     (begin
+		       (pop-lexer)
+		       (parse-action-end <<EOF>>-action?
+					 <<ERROR>>-action?
+					 action?)))))
+	      (else ; eof-tok
+	       (lexer-unget tok)
+	       (pop-lexer)
+	       (parse-action-end <<EOF>>-action?
+				 <<ERROR>>-action?
+				 action?)))))))
+
+(define parse-rule
+  (lambda (macros)
+    (let ((tok-list (parse-regexp)))
+      (if (null? tok-list)
+	  #f
+	  (let* ((rule (tokens->rule tok-list macros))
+		 (action
+		  (parse-action (get-rule-eof? rule) (get-rule-error? rule))))
+	    (set-rule-action rule action)
+	    rule)))))
+
+(define parse-rules
+  (lambda (macros)
+    (parse-action #f #f)
+    (let loop ()
+      (let ((rule (parse-rule macros)))
+	(if rule
+	    (cons rule (loop))
+	    '())))))
+
+(define parser
+  (lambda (filename)
+    (let* ((port (open-input-file filename))
+	   (port-open? #t))
+      (lex-unwind-protect (lambda ()
+			    (if port-open?
+				(close-input-port port))))
+      (init-lexer port)
+      (let* ((macros (parse-macros))
+	     (rules (parse-rules macros)))
+	(close-input-port port)
+	(set! port-open? #f)
+	(adapt-rules rules)))))
+
+; Module re2nfa.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+; Le vecteur d'etats contient la table de transition du nfa.
+; Chaque entree contient les arcs partant de l'etat correspondant.
+; Les arcs sont stockes dans une liste.
+; Chaque arc est une paire (class . destination).
+; Les caracteres d'une classe sont enumeres par ranges.
+; Les ranges sont donnes dans une liste,
+;   chaque element etant une paire (debut . fin).
+; Le symbole eps peut remplacer une classe.
+; L'acceptation est decrite par une paire (acc-if-eol . acc-if-no-eol).
+
+; Quelques variables globales
+(define r2n-counter 0)
+(define r2n-v-arcs '#(#f))
+(define r2n-v-acc '#(#f))
+(define r2n-v-len 1)
+
+; Initialisation des variables globales
+(define r2n-init
+  (lambda ()
+    (set! r2n-counter 0)
+    (set! r2n-v-arcs (vector '()))
+    (set! r2n-v-acc (vector #f))
+    (set! r2n-v-len 1)))
+
+; Agrandissement des vecteurs
+(define r2n-extend-v
+  (lambda ()
+    (let* ((new-len (* 2 r2n-v-len))
+	   (new-v-arcs (make-vector new-len '()))
+	   (new-v-acc (make-vector new-len #f)))
+      (let loop ((i 0))
+	(if (< i r2n-v-len)
+	    (begin
+	      (vector-set! new-v-arcs i (vector-ref r2n-v-arcs i))
+	      (vector-set! new-v-acc i (vector-ref r2n-v-acc i))
+	      (loop (+ i 1)))))
+      (set! r2n-v-arcs new-v-arcs)
+      (set! r2n-v-acc new-v-acc)
+      (set! r2n-v-len new-len))))
+
+; Finalisation des vecteurs
+(define r2n-finalize-v
+  (lambda ()
+    (let* ((new-v-arcs (make-vector r2n-counter))
+	   (new-v-acc (make-vector r2n-counter)))
+      (let loop ((i 0))
+	(if (< i r2n-counter)
+	    (begin
+	      (vector-set! new-v-arcs i (vector-ref r2n-v-arcs i))
+	      (vector-set! new-v-acc i (vector-ref r2n-v-acc i))
+	      (loop (+ i 1)))))
+      (set! r2n-v-arcs new-v-arcs)
+      (set! r2n-v-acc new-v-acc)
+      (set! r2n-v-len r2n-counter))))
+
+; Creation d'etat
+(define r2n-get-state
+  (lambda (acc)
+    (if (= r2n-counter r2n-v-len)
+	(r2n-extend-v))
+    (let ((state r2n-counter))
+      (set! r2n-counter (+ r2n-counter 1))
+      (vector-set! r2n-v-acc state (or acc (cons #f #f)))
+      state)))
+
+; Ajout d'un arc
+(define r2n-add-arc
+  (lambda (start chars end)
+    (vector-set! r2n-v-arcs
+		 start
+		 (cons (cons chars end) (vector-ref r2n-v-arcs start)))))
+
+; Construction de l'automate a partir des regexp
+(define r2n-build-epsilon
+  (lambda (re start end)
+    (r2n-add-arc start 'eps end)))
+
+(define r2n-build-or
+  (lambda (re start end)
+    (let ((re1 (get-re-attr1 re))
+	  (re2 (get-re-attr2 re)))
+      (r2n-build-re re1 start end)
+      (r2n-build-re re2 start end))))
+
+(define r2n-build-conc
+  (lambda (re start end)
+    (let* ((re1 (get-re-attr1 re))
+	   (re2 (get-re-attr2 re))
+	   (inter (r2n-get-state #f)))
+      (r2n-build-re re1 start inter)
+      (r2n-build-re re2 inter end))))
+
+(define r2n-build-star
+  (lambda (re start end)
+    (let* ((re1 (get-re-attr1 re))
+	   (inter1 (r2n-get-state #f))
+	   (inter2 (r2n-get-state #f)))
+      (r2n-add-arc start 'eps inter1)
+      (r2n-add-arc inter1 'eps inter2)
+      (r2n-add-arc inter2 'eps end)
+      (r2n-build-re re1 inter2 inter1))))
+
+(define r2n-build-plus
+  (lambda (re start end)
+    (let* ((re1 (get-re-attr1 re))
+	   (inter1 (r2n-get-state #f))
+	   (inter2 (r2n-get-state #f)))
+      (r2n-add-arc start 'eps inter1)
+      (r2n-add-arc inter2 'eps inter1)
+      (r2n-add-arc inter2 'eps end)
+      (r2n-build-re re1 inter1 inter2))))
+
+(define r2n-build-question
+  (lambda (re start end)
+    (let ((re1 (get-re-attr1 re)))
+      (r2n-add-arc start 'eps end)
+      (r2n-build-re re1 start end))))
+
+(define r2n-build-class
+  (lambda (re start end)
+    (let ((class (get-re-attr1 re)))
+      (r2n-add-arc start class end))))
+
+(define r2n-build-char
+  (lambda (re start end)
+    (let* ((c (get-re-attr1 re))
+	   (class (list (cons c c))))
+      (r2n-add-arc start class end))))
+
+(define r2n-build-re
+  (let ((sub-function-v (vector r2n-build-epsilon
+				r2n-build-or
+				r2n-build-conc
+				r2n-build-star
+				r2n-build-plus
+				r2n-build-question
+				r2n-build-class
+				r2n-build-char)))
+    (lambda (re start end)
+      (let* ((re-type (get-re-type re))
+	     (sub-f (vector-ref sub-function-v re-type)))
+	(sub-f re start end)))))
+
+; Construction de l'automate relatif a une regle
+(define r2n-build-rule
+  (lambda (rule ruleno nl-start no-nl-start)
+    (let* ((re (get-rule-regexp rule))
+	   (bol? (get-rule-bol? rule))
+	   (eol? (get-rule-eol? rule))
+	   (rule-start (r2n-get-state #f))
+	   (rule-end (r2n-get-state (if eol?
+					(cons ruleno #f)
+					(cons ruleno ruleno)))))
+      (r2n-build-re re rule-start rule-end)
+      (r2n-add-arc nl-start 'eps rule-start)
+      (if (not bol?)
+	  (r2n-add-arc no-nl-start 'eps rule-start)))))
+
+; Construction de l'automate complet
+(define re2nfa
+  (lambda (rules)
+    (let ((nb-of-rules (vector-length rules)))
+      (r2n-init)
+      (let* ((nl-start (r2n-get-state #f))
+	     (no-nl-start (r2n-get-state #f)))
+	(let loop ((i 0))
+	  (if (< i nb-of-rules)
+	      (begin
+		(r2n-build-rule (vector-ref rules i)
+				i
+				nl-start
+				no-nl-start)
+		(loop (+ i 1)))))
+	(r2n-finalize-v)
+	(let ((v-arcs r2n-v-arcs)
+	      (v-acc r2n-v-acc))
+	  (r2n-init)
+	  (list nl-start no-nl-start v-arcs v-acc))))))
+
+; Module noeps.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+; Fonction "merge" qui elimine les repetitions
+(define noeps-merge-1
+  (lambda (l1 l2)
+    (cond ((null? l1)
+	   l2)
+	  ((null? l2)
+	   l1)
+	  (else
+	   (let ((t1 (car l1))
+		 (t2 (car l2)))
+	     (cond ((< t1 t2)
+		    (cons t1 (noeps-merge-1 (cdr l1) l2)))
+		   ((= t1 t2)
+		    (cons t1 (noeps-merge-1 (cdr l1) (cdr l2))))
+		   (else
+		    (cons t2 (noeps-merge-1 l1 (cdr l2))))))))))
+
+; Fabrication des voisinages externes
+(define noeps-mkvois
+  (lambda (trans-v)
+    (let* ((nbnodes (vector-length trans-v))
+	   (arcs (make-vector nbnodes '())))
+      (let loop1 ((n 0))
+	(if (< n nbnodes)
+	    (begin
+	      (let loop2 ((trans (vector-ref trans-v n)) (ends '()))
+		(if (null? trans)
+		    (vector-set! arcs n ends)
+		    (let* ((tran (car trans))
+			   (class (car tran))
+			   (end (cdr tran)))
+		      (loop2 (cdr trans) (if (eq? class 'eps)
+					     (noeps-merge-1 ends (list end))
+					     ends)))))
+	      (loop1 (+ n 1)))))
+      arcs)))
+
+; Fabrication des valeurs initiales
+(define noeps-mkinit
+  (lambda (trans-v)
+    (let* ((nbnodes (vector-length trans-v))
+	   (init (make-vector nbnodes)))
+      (let loop ((n 0))
+	(if (< n nbnodes)
+	    (begin
+	      (vector-set! init n (list n))
+	      (loop (+ n 1)))))
+      init)))
+
+; Traduction d'une liste d'arcs
+(define noeps-trad-arcs
+  (lambda (trans dict)
+    (let loop ((trans trans))
+      (if (null? trans)
+	  '()
+	  (let* ((tran (car trans))
+		 (class (car tran))
+		 (end (cdr tran)))
+	    (if (eq? class 'eps)
+		(loop (cdr trans))
+		(let* ((new-end (vector-ref dict end))
+		       (new-tran (cons class new-end)))
+		  (cons new-tran (loop (cdr trans))))))))))
+
+; Elimination des transitions eps
+(define noeps
+  (lambda (nl-start no-nl-start arcs acc)
+    (let* ((digraph-arcs (noeps-mkvois arcs))
+	   (digraph-init (noeps-mkinit arcs))
+	   (dict (digraph digraph-arcs digraph-init noeps-merge-1))
+	   (new-nl-start (vector-ref dict nl-start))
+	   (new-no-nl-start (vector-ref dict no-nl-start)))
+      (let loop ((i (- (vector-length arcs) 1)))
+	(if (>= i 0)
+	    (begin
+	      (vector-set! arcs i (noeps-trad-arcs (vector-ref arcs i) dict))
+	      (loop (- i 1)))))
+      (list new-nl-start new-no-nl-start arcs acc))))
+
+; Module sweep.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+; Preparer les arcs pour digraph
+(define sweep-mkarcs
+  (lambda (trans-v)
+    (let* ((nbnodes (vector-length trans-v))
+	   (arcs-v (make-vector nbnodes '())))
+      (let loop1 ((n 0))
+	(if (< n nbnodes)
+	    (let loop2 ((trans (vector-ref trans-v n)) (arcs '()))
+	      (if (null? trans)
+		  (begin
+		    (vector-set! arcs-v n arcs)
+		    (loop1 (+ n 1)))
+		  (loop2 (cdr trans) (noeps-merge-1 (cdar trans) arcs))))
+	    arcs-v)))))
+
+; Preparer l'operateur pour digraph
+(define sweep-op
+  (let ((acc-min (lambda (rule1 rule2)
+		   (cond ((not rule1)
+			  rule2)
+			 ((not rule2)
+			  rule1)
+			 (else
+			  (min rule1 rule2))))))
+    (lambda (acc1 acc2)
+      (cons (acc-min (car acc1) (car acc2))
+	    (acc-min (cdr acc1) (cdr acc2))))))
+
+; Renumerotation des etats (#f pour etat a eliminer)
+; Retourne (new-nbnodes . dict)
+(define sweep-renum
+  (lambda (dist-acc-v)
+    (let* ((nbnodes (vector-length dist-acc-v))
+	   (dict (make-vector nbnodes)))
+      (let loop ((n 0) (new-n 0))
+	(if (< n nbnodes)
+	    (let* ((acc (vector-ref dist-acc-v n))
+		   (dead? (equal? acc '(#f . #f))))
+	      (if dead?
+		  (begin
+		    (vector-set! dict n #f)
+		    (loop (+ n 1) new-n))
+		  (begin
+		    (vector-set! dict n new-n)
+		    (loop (+ n 1) (+ new-n 1)))))
+	    (cons new-n dict))))))
+
+; Elimination des etats inutiles d'une liste d'etats
+(define sweep-list
+  (lambda (ss dict)
+    (if (null? ss)
+	'()
+	(let* ((olds (car ss))
+	       (news (vector-ref dict olds)))
+	  (if news
+	      (cons news (sweep-list (cdr ss) dict))
+	      (sweep-list (cdr ss) dict))))))
+
+; Elimination des etats inutiles d'une liste d'arcs
+(define sweep-arcs
+  (lambda (arcs dict)
+    (if (null? arcs)
+	'()
+	(let* ((arc (car arcs))
+	       (class (car arc))
+	       (ss (cdr arc))
+	       (new-ss (sweep-list ss dict)))
+	  (if (null? new-ss)
+	      (sweep-arcs (cdr arcs) dict)
+	      (cons (cons class new-ss) (sweep-arcs (cdr arcs) dict)))))))
+
+; Elimination des etats inutiles dans toutes les transitions
+(define sweep-all-arcs
+  (lambda (arcs-v dict)
+    (let loop ((n (- (vector-length arcs-v) 1)))
+      (if (>= n 0)
+	  (begin
+	    (vector-set! arcs-v n (sweep-arcs (vector-ref arcs-v n) dict))
+	    (loop (- n 1)))
+	  arcs-v))))
+
+; Elimination des etats inutiles dans un vecteur
+(define sweep-states
+  (lambda (v new-nbnodes dict)
+    (let ((nbnodes (vector-length v))
+	  (new-v (make-vector new-nbnodes)))
+      (let loop ((n 0))
+	(if (< n nbnodes)
+	    (let ((new-n (vector-ref dict n)))
+	      (if new-n
+		  (vector-set! new-v new-n (vector-ref v n)))
+	      (loop (+ n 1)))
+	    new-v)))))
+
+; Elimination des etats inutiles
+(define sweep
+  (lambda (nl-start no-nl-start arcs-v acc-v)
+    (let* ((digraph-arcs (sweep-mkarcs arcs-v))
+	   (digraph-init acc-v)
+	   (digraph-op sweep-op)
+	   (dist-acc-v (digraph digraph-arcs digraph-init digraph-op))
+	   (result (sweep-renum dist-acc-v))
+	   (new-nbnodes (car result))
+	   (dict (cdr result))
+	   (new-nl-start (sweep-list nl-start dict))
+	   (new-no-nl-start (sweep-list no-nl-start dict))
+	   (new-arcs-v (sweep-states (sweep-all-arcs arcs-v dict)
+				     new-nbnodes
+				     dict))
+	   (new-acc-v (sweep-states acc-v new-nbnodes dict)))
+      (list new-nl-start new-no-nl-start new-arcs-v new-acc-v))))
+
+; Module nfa2dfa.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+; Recoupement de deux arcs
+(define n2d-2arcs
+  (lambda (arc1 arc2)
+    (let* ((class1 (car arc1))
+	   (ss1 (cdr arc1))
+	   (class2 (car arc2))
+	   (ss2 (cdr arc2))
+	   (result (class-sep class1 class2))
+	   (classl (vector-ref result 0))
+	   (classc (vector-ref result 1))
+	   (classr (vector-ref result 2))
+	   (ssl ss1)
+	   (ssc (ss-union ss1 ss2))
+	   (ssr ss2))
+      (vector (if (or (null? classl) (null? ssl)) #f (cons classl ssl))
+	      (if (or (null? classc) (null? ssc)) #f (cons classc ssc))
+	      (if (or (null? classr) (null? ssr)) #f (cons classr ssr))))))
+
+; Insertion d'un arc dans une liste d'arcs a classes distinctes
+(define n2d-insert-arc
+  (lambda (new-arc arcs)
+    (if (null? arcs)
+	(list new-arc)
+	(let* ((arc (car arcs))
+	       (others (cdr arcs))
+	       (result (n2d-2arcs new-arc arc))
+	       (arcl (vector-ref result 0))
+	       (arcc (vector-ref result 1))
+	       (arcr (vector-ref result 2))
+	       (list-arcc (if arcc (list arcc) '()))
+	       (list-arcr (if arcr (list arcr) '())))
+	  (if arcl
+	      (append list-arcc list-arcr (n2d-insert-arc arcl others))
+	      (append list-arcc list-arcr others))))))
+
+; Regroupement des arcs qui aboutissent au meme sous-ensemble d'etats
+(define n2d-factorize-arcs
+  (lambda (arcs)
+    (if (null? arcs)
+	'()
+	(let* ((arc (car arcs))
+	       (arc-ss (cdr arc))
+	       (others-no-fact (cdr arcs))
+	       (others (n2d-factorize-arcs others-no-fact)))
+	  (let loop ((o others))
+	    (if (null? o)
+		(list arc)
+		(let* ((o1 (car o))
+		       (o1-ss (cdr o1)))
+		  (if (equal? o1-ss arc-ss)
+		      (let* ((arc-class (car arc))
+			     (o1-class (car o1))
+			     (new-class (class-union arc-class o1-class))
+			     (new-arc (cons new-class arc-ss)))
+			(cons new-arc (cdr o)))
+		      (cons o1 (loop (cdr o)))))))))))
+
+; Transformer une liste d'arcs quelconques en des arcs a classes distinctes
+(define n2d-distinguish-arcs
+  (lambda (arcs)
+    (let loop ((arcs arcs) (n-arcs '()))
+      (if (null? arcs)
+	  n-arcs
+	  (loop (cdr arcs) (n2d-insert-arc (car arcs) n-arcs))))))
+
+; Transformer une liste d'arcs quelconques en des arcs a classes et a
+; destinations distinctes
+(define n2d-normalize-arcs
+  (lambda (arcs)
+    (n2d-factorize-arcs (n2d-distinguish-arcs arcs))))
+
+; Factoriser des arcs a destination unique (~deterministes)
+(define n2d-factorize-darcs
+  (lambda (arcs)
+    (if (null? arcs)
+	'()
+	(let* ((arc (car arcs))
+	       (arc-end (cdr arc))
+	       (other-arcs (cdr arcs))
+	       (farcs (n2d-factorize-darcs other-arcs)))
+	  (let loop ((farcs farcs))
+	    (if (null? farcs)
+		(list arc)
+		(let* ((farc (car farcs))
+		       (farc-end (cdr farc)))
+		  (if (= farc-end arc-end)
+		      (let* ((arc-class (car arc))
+			     (farc-class (car farc))
+			     (new-class (class-union farc-class arc-class))
+			     (new-arc (cons new-class arc-end)))
+			(cons new-arc (cdr farcs)))
+		      (cons farc (loop (cdr farcs)))))))))))
+
+; Normaliser un vecteur de listes d'arcs
+(define n2d-normalize-arcs-v
+  (lambda (arcs-v)
+    (let* ((nbnodes (vector-length arcs-v))
+	   (new-v (make-vector nbnodes)))
+      (let loop ((n 0))
+	(if (= n nbnodes)
+	    new-v
+	    (begin
+	      (vector-set! new-v n (n2d-normalize-arcs (vector-ref arcs-v n)))
+	      (loop (+ n 1))))))))
+
+; Inserer un arc dans une liste d'arcs a classes distinctes en separant
+; les arcs contenant une partie de la classe du nouvel arc des autres arcs
+; Retourne: (oui . non)
+(define n2d-ins-sep-arc
+  (lambda (new-arc arcs)
+    (if (null? arcs)
+	(cons (list new-arc) '())
+	(let* ((arc (car arcs))
+	       (others (cdr arcs))
+	       (result (n2d-2arcs new-arc arc))
+	       (arcl (vector-ref result 0))
+	       (arcc (vector-ref result 1))
+	       (arcr (vector-ref result 2))
+	       (l-arcc (if arcc (list arcc) '()))
+	       (l-arcr (if arcr (list arcr) '()))
+	       (result (if arcl
+			   (n2d-ins-sep-arc arcl others)
+			   (cons '() others)))
+	       (oui-arcs (car result))
+	       (non-arcs (cdr result)))
+	  (cons (append l-arcc oui-arcs) (append l-arcr non-arcs))))))
+
+; Combiner deux listes d'arcs a classes distinctes
+; Ne tente pas de combiner les arcs qui ont nec. des classes disjointes
+; Conjecture: les arcs crees ont leurs classes disjointes
+; Note: envisager de rajouter un "n2d-factorize-arcs" !!!!!!!!!!!!
+(define n2d-combine-arcs
+  (lambda (arcs1 arcs2)
+    (let loop ((arcs1 arcs1) (arcs2 arcs2) (dist-arcs2 '()))
+      (if (null? arcs1)
+	  (append arcs2 dist-arcs2)
+	  (let* ((arc (car arcs1))
+		 (result (n2d-ins-sep-arc arc arcs2))
+		 (oui-arcs (car result))
+		 (non-arcs (cdr result)))
+	    (loop (cdr arcs1) non-arcs (append oui-arcs dist-arcs2)))))))
+
+; ; 
+; ; Section temporaire: vieille facon de generer le dfa
+; ; Dictionnaire d'etat det.  Recherche lineaire.  Creation naive
+; ; des arcs d'un ensemble d'etats.
+; ; 
+; 
+; ; Quelques variables globales
+; (define n2d-state-dict '#(#f))
+; (define n2d-state-len 1)
+; (define n2d-state-count 0)
+; 
+; ; Fonctions de gestion des entrees du dictionnaire
+; (define make-dentry (lambda (ss) (vector ss #f #f)))
+; 
+; (define get-dentry-ss    (lambda (dentry) (vector-ref dentry 0)))
+; (define get-dentry-darcs (lambda (dentry) (vector-ref dentry 1)))
+; (define get-dentry-acc   (lambda (dentry) (vector-ref dentry 2)))
+; 
+; (define set-dentry-darcs (lambda (dentry arcs) (vector-set! dentry 1 arcs)))
+; (define set-dentry-acc   (lambda (dentry acc)  (vector-set! dentry 2 acc)))
+; 
+; ; Initialisation des variables globales
+; (define n2d-init-glob-vars
+;   (lambda ()
+;     (set! n2d-state-dict (vector #f))
+;     (set! n2d-state-len 1)
+;     (set! n2d-state-count 0)))
+; 
+; ; Extension du dictionnaire
+; (define n2d-extend-dict
+;   (lambda ()
+;     (let* ((new-len (* 2 n2d-state-len))
+; 	   (v (make-vector new-len #f)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (begin
+; 	      (set! n2d-state-dict v)
+; 	      (set! n2d-state-len new-len))
+; 	    (begin
+; 	      (vector-set! v n (vector-ref n2d-state-dict n))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Ajout d'un etat
+; (define n2d-add-state
+;   (lambda (ss)
+;     (let* ((s n2d-state-count)
+; 	   (dentry (make-dentry ss)))
+;       (if (= n2d-state-count n2d-state-len)
+; 	  (n2d-extend-dict))
+;       (vector-set! n2d-state-dict s dentry)
+;       (set! n2d-state-count (+ n2d-state-count 1))
+;       s)))
+; 
+; ; Recherche d'un etat
+; (define n2d-search-state
+;   (lambda (ss)
+;     (let loop ((n 0))
+;       (if (= n n2d-state-count)
+; 	  (n2d-add-state ss)
+; 	  (let* ((dentry (vector-ref n2d-state-dict n))
+; 		 (dentry-ss (get-dentry-ss dentry)))
+; 	    (if (equal? dentry-ss ss)
+; 		n
+; 		(loop (+ n 1))))))))
+; 
+; ; Transformer un arc non-det. en un arc det.
+; (define n2d-translate-arc
+;   (lambda (arc)
+;     (let* ((class (car arc))
+; 	   (ss (cdr arc))
+; 	   (s (n2d-search-state ss)))
+;       (cons class s))))
+; 
+; ; Transformer une liste d'arcs non-det. en ...
+; (define n2d-translate-arcs
+;   (lambda (arcs)
+;     (map n2d-translate-arc arcs)))
+; 
+; ; Trouver le minimum de deux acceptants
+; (define n2d-acc-min2
+;   (let ((acc-min (lambda (rule1 rule2)
+; 		   (cond ((not rule1)
+; 			  rule2)
+; 			 ((not rule2)
+; 			  rule1)
+; 			 (else
+; 			  (min rule1 rule2))))))
+;     (lambda (acc1 acc2)
+;       (cons (acc-min (car acc1) (car acc2))
+; 	    (acc-min (cdr acc1) (cdr acc2))))))
+; 
+; ; Trouver le minimum de plusieurs acceptants
+; (define n2d-acc-mins
+;   (lambda (accs)
+;     (if (null? accs)
+; 	(cons #f #f)
+; 	(n2d-acc-min2 (car accs) (n2d-acc-mins (cdr accs))))))
+; 
+; ; Fabriquer les vecteurs d'arcs et d'acceptance
+; (define n2d-extract-vs
+;   (lambda ()
+;     (let* ((arcs-v (make-vector n2d-state-count))
+; 	   (acc-v (make-vector n2d-state-count)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (cons arcs-v acc-v)
+; 	    (begin
+; 	      (vector-set! arcs-v n (get-dentry-darcs
+; 				     (vector-ref n2d-state-dict n)))
+; 	      (vector-set! acc-v n (get-dentry-acc
+; 				    (vector-ref n2d-state-dict n)))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Effectuer la transformation de l'automate de non-det. a det.
+; (define nfa2dfa
+;   (lambda (nl-start no-nl-start arcs-v acc-v)
+;     (n2d-init-glob-vars)
+;     (let* ((nl-d (n2d-search-state nl-start))
+; 	   (no-nl-d (n2d-search-state no-nl-start)))
+;       (let loop ((n 0))
+; 	(if (< n n2d-state-count)
+; 	    (let* ((dentry (vector-ref n2d-state-dict n))
+; 		   (ss (get-dentry-ss dentry))
+; 		   (arcss (map (lambda (s) (vector-ref arcs-v s)) ss))
+; 		   (arcs (apply append arcss))
+; 		   (dist-arcs (n2d-distinguish-arcs arcs))
+; 		   (darcs (n2d-translate-arcs dist-arcs))
+; 		   (fact-darcs (n2d-factorize-darcs darcs))
+; 		   (accs (map (lambda (s) (vector-ref acc-v s)) ss))
+; 		   (acc (n2d-acc-mins accs)))
+; 	      (set-dentry-darcs dentry fact-darcs)
+; 	      (set-dentry-acc   dentry acc)
+; 	      (loop (+ n 1)))))
+;       (let* ((result (n2d-extract-vs))
+; 	     (new-arcs-v (car result))
+; 	     (new-acc-v (cdr result)))
+; 	(n2d-init-glob-vars)
+; 	(list nl-d no-nl-d new-arcs-v new-acc-v)))))
+
+; ; 
+; ; Section temporaire: vieille facon de generer le dfa
+; ; Dictionnaire d'etat det.  Recherche lineaire.  Creation des
+; ; arcs d'un ensemble d'etats en combinant des ensembles d'arcs a
+; ; classes distinctes.
+; ; 
+; 
+; ; Quelques variables globales
+; (define n2d-state-dict '#(#f))
+; (define n2d-state-len 1)
+; (define n2d-state-count 0)
+; 
+; ; Fonctions de gestion des entrees du dictionnaire
+; (define make-dentry (lambda (ss) (vector ss #f #f)))
+; 
+; (define get-dentry-ss    (lambda (dentry) (vector-ref dentry 0)))
+; (define get-dentry-darcs (lambda (dentry) (vector-ref dentry 1)))
+; (define get-dentry-acc   (lambda (dentry) (vector-ref dentry 2)))
+; 
+; (define set-dentry-darcs (lambda (dentry arcs) (vector-set! dentry 1 arcs)))
+; (define set-dentry-acc   (lambda (dentry acc)  (vector-set! dentry 2 acc)))
+; 
+; ; Initialisation des variables globales
+; (define n2d-init-glob-vars
+;   (lambda ()
+;     (set! n2d-state-dict (vector #f))
+;     (set! n2d-state-len 1)
+;     (set! n2d-state-count 0)))
+; 
+; ; Extension du dictionnaire
+; (define n2d-extend-dict
+;   (lambda ()
+;     (let* ((new-len (* 2 n2d-state-len))
+; 	   (v (make-vector new-len #f)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (begin
+; 	      (set! n2d-state-dict v)
+; 	      (set! n2d-state-len new-len))
+; 	    (begin
+; 	      (vector-set! v n (vector-ref n2d-state-dict n))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Ajout d'un etat
+; (define n2d-add-state
+;   (lambda (ss)
+;     (let* ((s n2d-state-count)
+; 	   (dentry (make-dentry ss)))
+;       (if (= n2d-state-count n2d-state-len)
+; 	  (n2d-extend-dict))
+;       (vector-set! n2d-state-dict s dentry)
+;       (set! n2d-state-count (+ n2d-state-count 1))
+;       s)))
+; 
+; ; Recherche d'un etat
+; (define n2d-search-state
+;   (lambda (ss)
+;     (let loop ((n 0))
+;       (if (= n n2d-state-count)
+; 	  (n2d-add-state ss)
+; 	  (let* ((dentry (vector-ref n2d-state-dict n))
+; 		 (dentry-ss (get-dentry-ss dentry)))
+; 	    (if (equal? dentry-ss ss)
+; 		n
+; 		(loop (+ n 1))))))))
+; 
+; ; Combiner des listes d'arcs a classes dictinctes
+; (define n2d-combine-arcs-l
+;   (lambda (arcs-l)
+;     (if (null? arcs-l)
+; 	'()
+; 	(let* ((arcs (car arcs-l))
+; 	       (other-arcs-l (cdr arcs-l))
+; 	       (other-arcs (n2d-combine-arcs-l other-arcs-l)))
+; 	  (n2d-combine-arcs arcs other-arcs)))))
+; 
+; ; Transformer un arc non-det. en un arc det.
+; (define n2d-translate-arc
+;   (lambda (arc)
+;     (let* ((class (car arc))
+; 	   (ss (cdr arc))
+; 	   (s (n2d-search-state ss)))
+;       (cons class s))))
+; 
+; ; Transformer une liste d'arcs non-det. en ...
+; (define n2d-translate-arcs
+;   (lambda (arcs)
+;     (map n2d-translate-arc arcs)))
+; 
+; ; Trouver le minimum de deux acceptants
+; (define n2d-acc-min2
+;   (let ((acc-min (lambda (rule1 rule2)
+; 		   (cond ((not rule1)
+; 			  rule2)
+; 			 ((not rule2)
+; 			  rule1)
+; 			 (else
+; 			  (min rule1 rule2))))))
+;     (lambda (acc1 acc2)
+;       (cons (acc-min (car acc1) (car acc2))
+; 	    (acc-min (cdr acc1) (cdr acc2))))))
+; 
+; ; Trouver le minimum de plusieurs acceptants
+; (define n2d-acc-mins
+;   (lambda (accs)
+;     (if (null? accs)
+; 	(cons #f #f)
+; 	(n2d-acc-min2 (car accs) (n2d-acc-mins (cdr accs))))))
+; 
+; ; Fabriquer les vecteurs d'arcs et d'acceptance
+; (define n2d-extract-vs
+;   (lambda ()
+;     (let* ((arcs-v (make-vector n2d-state-count))
+; 	   (acc-v (make-vector n2d-state-count)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (cons arcs-v acc-v)
+; 	    (begin
+; 	      (vector-set! arcs-v n (get-dentry-darcs
+; 				     (vector-ref n2d-state-dict n)))
+; 	      (vector-set! acc-v n (get-dentry-acc
+; 				    (vector-ref n2d-state-dict n)))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Effectuer la transformation de l'automate de non-det. a det.
+; (define nfa2dfa
+;   (lambda (nl-start no-nl-start arcs-v acc-v)
+;     (n2d-init-glob-vars)
+;     (let* ((nl-d (n2d-search-state nl-start))
+; 	   (no-nl-d (n2d-search-state no-nl-start))
+; 	   (norm-arcs-v (n2d-normalize-arcs-v arcs-v)))
+;       (let loop ((n 0))
+; 	(if (< n n2d-state-count)
+; 	    (let* ((dentry (vector-ref n2d-state-dict n))
+; 		   (ss (get-dentry-ss dentry))
+; 		   (arcs-l (map (lambda (s) (vector-ref norm-arcs-v s)) ss))
+; 		   (arcs (n2d-combine-arcs-l arcs-l))
+; 		   (darcs (n2d-translate-arcs arcs))
+; 		   (fact-darcs (n2d-factorize-darcs darcs))
+; 		   (accs (map (lambda (s) (vector-ref acc-v s)) ss))
+; 		   (acc (n2d-acc-mins accs)))
+; 	      (set-dentry-darcs dentry fact-darcs)
+; 	      (set-dentry-acc   dentry acc)
+; 	      (loop (+ n 1)))))
+;       (let* ((result (n2d-extract-vs))
+; 	     (new-arcs-v (car result))
+; 	     (new-acc-v (cdr result)))
+; 	(n2d-init-glob-vars)
+; 	(list nl-d no-nl-d new-arcs-v new-acc-v)))))
+
+; ; 
+; ; Section temporaire: vieille facon de generer le dfa
+; ; Dictionnaire d'etat det.  Arbre de recherche.  Creation des
+; ; arcs d'un ensemble d'etats en combinant des ensembles d'arcs a
+; ; classes distinctes.
+; ; 
+; 
+; ; Quelques variables globales
+; (define n2d-state-dict '#(#f))
+; (define n2d-state-len 1)
+; (define n2d-state-count 0)
+; (define n2d-state-tree '#(#f ()))
+; 
+; ; Fonctions de gestion des entrees du dictionnaire
+; (define make-dentry (lambda (ss) (vector ss #f #f)))
+; 
+; (define get-dentry-ss    (lambda (dentry) (vector-ref dentry 0)))
+; (define get-dentry-darcs (lambda (dentry) (vector-ref dentry 1)))
+; (define get-dentry-acc   (lambda (dentry) (vector-ref dentry 2)))
+; 
+; (define set-dentry-darcs (lambda (dentry arcs) (vector-set! dentry 1 arcs)))
+; (define set-dentry-acc   (lambda (dentry acc)  (vector-set! dentry 2 acc)))
+; 
+; ; Fonctions de gestion de l'arbre de recherche
+; (define make-snode (lambda () (vector #f '())))
+; 
+; (define get-snode-dstate   (lambda (snode) (vector-ref snode 0)))
+; (define get-snode-children (lambda (snode) (vector-ref snode 1)))
+; 
+; (define set-snode-dstate
+;   (lambda (snode dstate)   (vector-set! snode 0 dstate)))
+; (define set-snode-children
+;   (lambda (snode children) (vector-set! snode 1 children)))
+; 
+; ; Initialisation des variables globales
+; (define n2d-init-glob-vars
+;   (lambda ()
+;     (set! n2d-state-dict (vector #f))
+;     (set! n2d-state-len 1)
+;     (set! n2d-state-count 0)
+;     (set! n2d-state-tree (make-snode))))
+; 
+; ; Extension du dictionnaire
+; (define n2d-extend-dict
+;   (lambda ()
+;     (let* ((new-len (* 2 n2d-state-len))
+; 	   (v (make-vector new-len #f)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (begin
+; 	      (set! n2d-state-dict v)
+; 	      (set! n2d-state-len new-len))
+; 	    (begin
+; 	      (vector-set! v n (vector-ref n2d-state-dict n))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Ajout d'un etat
+; (define n2d-add-state
+;   (lambda (ss)
+;     (let* ((s n2d-state-count)
+; 	   (dentry (make-dentry ss)))
+;       (if (= n2d-state-count n2d-state-len)
+; 	  (n2d-extend-dict))
+;       (vector-set! n2d-state-dict s dentry)
+;       (set! n2d-state-count (+ n2d-state-count 1))
+;       s)))
+; 
+; ; Recherche d'un etat
+; (define n2d-search-state
+;   (lambda (ss)
+;     (let loop ((s-l ss) (snode n2d-state-tree))
+;       (if (null? s-l)
+; 	  (or (get-snode-dstate snode)
+; 	      (let ((s (n2d-add-state ss)))
+; 		(set-snode-dstate snode s)
+; 		s))
+; 	  (let* ((next-s (car s-l))
+; 		 (alist (get-snode-children snode))
+; 		 (ass (or (assv next-s alist)
+; 			  (let ((ass (cons next-s (make-snode))))
+; 			    (set-snode-children snode (cons ass alist))
+; 			    ass))))
+; 	    (loop (cdr s-l) (cdr ass)))))))
+; 
+; ; Combiner des listes d'arcs a classes dictinctes
+; (define n2d-combine-arcs-l
+;   (lambda (arcs-l)
+;     (if (null? arcs-l)
+; 	'()
+; 	(let* ((arcs (car arcs-l))
+; 	       (other-arcs-l (cdr arcs-l))
+; 	       (other-arcs (n2d-combine-arcs-l other-arcs-l)))
+; 	  (n2d-combine-arcs arcs other-arcs)))))
+; 
+; ; Transformer un arc non-det. en un arc det.
+; (define n2d-translate-arc
+;   (lambda (arc)
+;     (let* ((class (car arc))
+; 	   (ss (cdr arc))
+; 	   (s (n2d-search-state ss)))
+;       (cons class s))))
+; 
+; ; Transformer une liste d'arcs non-det. en ...
+; (define n2d-translate-arcs
+;   (lambda (arcs)
+;     (map n2d-translate-arc arcs)))
+; 
+; ; Trouver le minimum de deux acceptants
+; (define n2d-acc-min2
+;   (let ((acc-min (lambda (rule1 rule2)
+; 		   (cond ((not rule1)
+; 			  rule2)
+; 			 ((not rule2)
+; 			  rule1)
+; 			 (else
+; 			  (min rule1 rule2))))))
+;     (lambda (acc1 acc2)
+;       (cons (acc-min (car acc1) (car acc2))
+; 	    (acc-min (cdr acc1) (cdr acc2))))))
+; 
+; ; Trouver le minimum de plusieurs acceptants
+; (define n2d-acc-mins
+;   (lambda (accs)
+;     (if (null? accs)
+; 	(cons #f #f)
+; 	(n2d-acc-min2 (car accs) (n2d-acc-mins (cdr accs))))))
+; 
+; ; Fabriquer les vecteurs d'arcs et d'acceptance
+; (define n2d-extract-vs
+;   (lambda ()
+;     (let* ((arcs-v (make-vector n2d-state-count))
+; 	   (acc-v (make-vector n2d-state-count)))
+;       (let loop ((n 0))
+; 	(if (= n n2d-state-count)
+; 	    (cons arcs-v acc-v)
+; 	    (begin
+; 	      (vector-set! arcs-v n (get-dentry-darcs
+; 				     (vector-ref n2d-state-dict n)))
+; 	      (vector-set! acc-v n (get-dentry-acc
+; 				    (vector-ref n2d-state-dict n)))
+; 	      (loop (+ n 1))))))))
+; 
+; ; Effectuer la transformation de l'automate de non-det. a det.
+; (define nfa2dfa
+;   (lambda (nl-start no-nl-start arcs-v acc-v)
+;     (n2d-init-glob-vars)
+;     (let* ((nl-d (n2d-search-state nl-start))
+; 	   (no-nl-d (n2d-search-state no-nl-start))
+; 	   (norm-arcs-v (n2d-normalize-arcs-v arcs-v)))
+;       (let loop ((n 0))
+; 	(if (< n n2d-state-count)
+; 	    (let* ((dentry (vector-ref n2d-state-dict n))
+; 		   (ss (get-dentry-ss dentry))
+; 		   (arcs-l (map (lambda (s) (vector-ref norm-arcs-v s)) ss))
+; 		   (arcs (n2d-combine-arcs-l arcs-l))
+; 		   (darcs (n2d-translate-arcs arcs))
+; 		   (fact-darcs (n2d-factorize-darcs darcs))
+; 		   (accs (map (lambda (s) (vector-ref acc-v s)) ss))
+; 		   (acc (n2d-acc-mins accs)))
+; 	      (set-dentry-darcs dentry fact-darcs)
+; 	      (set-dentry-acc   dentry acc)
+; 	      (loop (+ n 1)))))
+;       (let* ((result (n2d-extract-vs))
+; 	     (new-arcs-v (car result))
+; 	     (new-acc-v (cdr result)))
+; 	(n2d-init-glob-vars)
+; 	(list nl-d no-nl-d new-arcs-v new-acc-v)))))
+
+; 
+; Section temporaire: vieille facon de generer le dfa
+; Dictionnaire d'etat det.  Table de hashage.  Creation des
+; arcs d'un ensemble d'etats en combinant des ensembles d'arcs a
+; classes distinctes.
+; 
+
+; Quelques variables globales
+(define n2d-state-dict '#(#f))
+(define n2d-state-len 1)
+(define n2d-state-count 0)
+(define n2d-state-hash '#())
+
+; Fonctions de gestion des entrees du dictionnaire
+(define make-dentry (lambda (ss) (vector ss #f #f)))
+
+(define get-dentry-ss    (lambda (dentry) (vector-ref dentry 0)))
+(define get-dentry-darcs (lambda (dentry) (vector-ref dentry 1)))
+(define get-dentry-acc   (lambda (dentry) (vector-ref dentry 2)))
+
+(define set-dentry-darcs (lambda (dentry arcs) (vector-set! dentry 1 arcs)))
+(define set-dentry-acc   (lambda (dentry acc)  (vector-set! dentry 2 acc)))
+
+; Initialisation des variables globales
+(define n2d-init-glob-vars
+  (lambda (hash-len)
+    (set! n2d-state-dict (vector #f))
+    (set! n2d-state-len 1)
+    (set! n2d-state-count 0)
+    (set! n2d-state-hash (make-vector hash-len '()))))
+
+; Extension du dictionnaire
+(define n2d-extend-dict
+  (lambda ()
+    (let* ((new-len (* 2 n2d-state-len))
+	   (v (make-vector new-len #f)))
+      (let loop ((n 0))
+	(if (= n n2d-state-count)
+	    (begin
+	      (set! n2d-state-dict v)
+	      (set! n2d-state-len new-len))
+	    (begin
+	      (vector-set! v n (vector-ref n2d-state-dict n))
+	      (loop (+ n 1))))))))
+
+; Ajout d'un etat
+(define n2d-add-state
+  (lambda (ss)
+    (let* ((s n2d-state-count)
+	   (dentry (make-dentry ss)))
+      (if (= n2d-state-count n2d-state-len)
+	  (n2d-extend-dict))
+      (vector-set! n2d-state-dict s dentry)
+      (set! n2d-state-count (+ n2d-state-count 1))
+      s)))
+
+; Recherche d'un etat
+(define n2d-search-state
+  (lambda (ss)
+    (let* ((hash-no (if (null? ss) 0 (car ss)))
+	   (alist (vector-ref n2d-state-hash hash-no))
+	   (ass (assoc ss alist)))
+      (if ass
+	  (cdr ass)
+	  (let* ((s (n2d-add-state ss))
+		 (new-ass (cons ss s)))
+	    (vector-set! n2d-state-hash hash-no (cons new-ass alist))
+	    s)))))
+
+; Combiner des listes d'arcs a classes dictinctes
+(define n2d-combine-arcs-l
+  (lambda (arcs-l)
+    (if (null? arcs-l)
+	'()
+	(let* ((arcs (car arcs-l))
+	       (other-arcs-l (cdr arcs-l))
+	       (other-arcs (n2d-combine-arcs-l other-arcs-l)))
+	  (n2d-combine-arcs arcs other-arcs)))))
+
+; Transformer un arc non-det. en un arc det.
+(define n2d-translate-arc
+  (lambda (arc)
+    (let* ((class (car arc))
+	   (ss (cdr arc))
+	   (s (n2d-search-state ss)))
+      (cons class s))))
+
+; Transformer une liste d'arcs non-det. en ...
+(define n2d-translate-arcs
+  (lambda (arcs)
+    (map n2d-translate-arc arcs)))
+
+; Trouver le minimum de deux acceptants
+(define n2d-acc-min2
+  (let ((acc-min (lambda (rule1 rule2)
+		   (cond ((not rule1)
+			  rule2)
+			 ((not rule2)
+			  rule1)
+			 (else
+			  (min rule1 rule2))))))
+    (lambda (acc1 acc2)
+      (cons (acc-min (car acc1) (car acc2))
+	    (acc-min (cdr acc1) (cdr acc2))))))
+
+; Trouver le minimum de plusieurs acceptants
+(define n2d-acc-mins
+  (lambda (accs)
+    (if (null? accs)
+	(cons #f #f)
+	(n2d-acc-min2 (car accs) (n2d-acc-mins (cdr accs))))))
+
+; Fabriquer les vecteurs d'arcs et d'acceptance
+(define n2d-extract-vs
+  (lambda ()
+    (let* ((arcs-v (make-vector n2d-state-count))
+	   (acc-v (make-vector n2d-state-count)))
+      (let loop ((n 0))
+	(if (= n n2d-state-count)
+	    (cons arcs-v acc-v)
+	    (begin
+	      (vector-set! arcs-v n (get-dentry-darcs
+				     (vector-ref n2d-state-dict n)))
+	      (vector-set! acc-v n (get-dentry-acc
+				    (vector-ref n2d-state-dict n)))
+	      (loop (+ n 1))))))))
+
+; Effectuer la transformation de l'automate de non-det. a det.
+(define nfa2dfa
+  (lambda (nl-start no-nl-start arcs-v acc-v)
+    (n2d-init-glob-vars (vector-length arcs-v))
+    (let* ((nl-d (n2d-search-state nl-start))
+	   (no-nl-d (n2d-search-state no-nl-start))
+	   (norm-arcs-v (n2d-normalize-arcs-v arcs-v)))
+      (let loop ((n 0))
+	(if (< n n2d-state-count)
+	    (let* ((dentry (vector-ref n2d-state-dict n))
+		   (ss (get-dentry-ss dentry))
+		   (arcs-l (map (lambda (s) (vector-ref norm-arcs-v s)) ss))
+		   (arcs (n2d-combine-arcs-l arcs-l))
+		   (darcs (n2d-translate-arcs arcs))
+		   (fact-darcs (n2d-factorize-darcs darcs))
+		   (accs (map (lambda (s) (vector-ref acc-v s)) ss))
+		   (acc (n2d-acc-mins accs)))
+	      (set-dentry-darcs dentry fact-darcs)
+	      (set-dentry-acc   dentry acc)
+	      (loop (+ n 1)))))
+      (let* ((result (n2d-extract-vs))
+	     (new-arcs-v (car result))
+	     (new-acc-v (cdr result)))
+	(n2d-init-glob-vars 0)
+	(list nl-d no-nl-d new-arcs-v new-acc-v)))))
+
+; Module prep.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Divers pre-traitements avant l'ecriture des tables
+;
+
+; Passe d'un arc multi-range a une liste d'arcs mono-range
+(define prep-arc->sharcs
+  (lambda (arc)
+    (let* ((range-l (car arc))
+	   (dest (cdr arc))
+	   (op (lambda (range) (cons range dest))))
+      (map op range-l))))
+
+; Compare des arcs courts selon leur premier caractere
+(define prep-sharc-<=
+  (lambda (sharc1 sharc2)
+    (class-<= (caar sharc1) (caar sharc2))))
+
+; Remplit les trous parmi les sharcs avec des arcs "erreur"
+(define prep-fill-error
+  (lambda (sharcs)
+    (let loop ((sharcs sharcs) (start 'inf-))
+      (cond ((class-= start 'inf+)
+	     '())
+	    ((null? sharcs)
+	     (cons (cons (cons start 'inf+) 'err) (loop sharcs 'inf+)))
+	    (else
+	     (let* ((sharc (car sharcs))
+		    (h (caar sharc))
+		    (t (cdar sharc)))
+	       (if (class-< start h)
+		   (cons (cons (cons start (- h 1)) 'err) (loop sharcs h))
+		   (cons sharc (loop (cdr sharcs)
+				     (if (class-= t 'inf+)
+					 'inf+
+					 (+ t 1)))))))))))
+
+; ; Passe d'une liste d'arcs a un arbre de decision
+; ; 1ere methode: seulement des comparaisons <
+; (define prep-arcs->tree
+;   (lambda (arcs)
+;     (let* ((sharcs-l (map prep-arc->sharcs arcs))
+; 	   (sharcs (apply append sharcs-l))
+; 	   (sorted-with-holes (merge-sort sharcs prep-sharc-<=))
+; 	   (sorted (prep-fill-error sorted-with-holes))
+; 	   (op (lambda (sharc) (cons (caar sharc) (cdr sharc))))
+; 	   (table (list->vector (map op sorted))))
+;       (let loop ((left 0) (right (- (vector-length table) 1)))
+; 	(if (= left right)
+; 	    (cdr (vector-ref table left))
+; 	    (let ((mid (quotient (+ left right 1) 2)))
+; 	      (list (car (vector-ref table mid))
+; 		    (loop left (- mid 1))
+; 		    (loop mid right))))))))
+
+; Passe d'une liste d'arcs a un arbre de decision
+; 2eme methode: permettre des comparaisons = quand ca adonne
+(define prep-arcs->tree
+  (lambda (arcs)
+    (let* ((sharcs-l (map prep-arc->sharcs arcs))
+	   (sharcs (apply append sharcs-l))
+	   (sorted-with-holes (merge-sort sharcs prep-sharc-<=))
+	   (sorted (prep-fill-error sorted-with-holes))
+	   (op (lambda (sharc) (cons (caar sharc) (cdr sharc))))
+	   (table (list->vector (map op sorted))))
+      (let loop ((left 0) (right (- (vector-length table) 1)))
+	(if (= left right)
+	    (cdr (vector-ref table left))
+	    (let ((mid (quotient (+ left right 1) 2)))
+	      (if (and (= (+ left 2) right)
+		       (= (+ (car (vector-ref table mid)) 1)
+			  (car (vector-ref table right)))
+		       (eqv? (cdr (vector-ref table left))
+			     (cdr (vector-ref table right))))
+		  (list '=
+			(car (vector-ref table mid))
+			(cdr (vector-ref table mid))
+			(cdr (vector-ref table left)))
+		  (list (car (vector-ref table mid))
+			(loop left (- mid 1))
+			(loop mid right)))))))))
+
+; Determine si une action a besoin de calculer yytext
+(define prep-detect-yytext
+  (lambda (s)
+    (let loop1 ((i (- (string-length s) 6)))
+      (cond ((< i 0)
+	     #f)
+	    ((char-ci=? (string-ref s i) #\y)
+	     (let loop2 ((j 5))
+	       (cond ((= j 0)
+		      #t)
+		     ((char-ci=? (string-ref s (+ i j))
+				 (string-ref "yytext" j))
+		      (loop2 (- j 1)))
+		     (else
+		      (loop1 (- i 1))))))
+	    (else
+	     (loop1 (- i 1)))))))
+
+; Note dans une regle si son action a besoin de yytext
+(define prep-set-rule-yytext?
+  (lambda (rule)
+    (let ((action (get-rule-action rule)))
+      (set-rule-yytext? rule (prep-detect-yytext action)))))
+
+; Note dans toutes les regles si leurs actions ont besoin de yytext
+(define prep-set-rules-yytext?
+  (lambda (rules)
+    (let loop ((n (- (vector-length rules) 1)))
+      (if (>= n 0)
+	  (begin
+	    (prep-set-rule-yytext? (vector-ref rules n))
+	    (loop (- n 1)))))))
+
+; Module output.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Nettoie les actions en enlevant les lignes blanches avant et apres
+;
+
+(define out-split-in-lines
+  (lambda (s)
+    (let ((len (string-length s)))
+      (let loop ((i 0) (start 0))
+	(cond ((= i len)
+	       '())
+	      ((char=? (string-ref s i) #\newline)
+	       (cons (substring s start (+ i 1))
+		     (loop (+ i 1) (+ i 1))))
+	      (else
+	       (loop (+ i 1) start)))))))
+
+(define out-empty-line?
+  (lambda (s)
+    (let ((len (- (string-length s) 1)))
+      (let loop ((i 0))
+	(cond ((= i len)
+	       #t)
+	      ((char-whitespace? (string-ref s i))
+	       (loop (+ i 1)))
+	      (else
+	       #f))))))
+
+; Enleve les lignes vides dans une liste avant et apres l'action
+(define out-remove-empty-lines
+  (lambda (lines)
+    (let loop ((lines lines) (top? #t))
+      (if (null? lines)
+	  '()
+	  (let ((line (car lines)))
+	    (cond ((not (out-empty-line? line))
+		   (cons line (loop (cdr lines) #f)))
+		  (top?
+		   (loop (cdr lines) #t))
+		  (else
+		   (let ((rest (loop (cdr lines) #f)))
+		     (if (null? rest)
+			 '()
+			 (cons line rest))))))))))
+
+; Enleve les lignes vides avant et apres l'action
+(define out-clean-action
+  (lambda (s)
+    (let* ((lines (out-split-in-lines s))
+	   (clean-lines (out-remove-empty-lines lines)))
+      (string-append-list clean-lines))))
+
+
+
+
+;
+; Pretty-printer pour les booleens, la liste vide, les nombres,
+; les symboles, les caracteres, les chaines, les listes et les vecteurs
+;
+
+; Colonne limite pour le pretty-printer (a ne pas atteindre)
+(define out-max-col 76)
+
+(define out-flatten-list
+  (lambda (ll)
+    (let loop ((ll ll) (part-out '()))
+      (if (null? ll)
+	  part-out
+	  (let* ((new-part-out (loop (cdr ll) part-out))
+		 (head (car ll)))
+	    (cond ((null? head)
+		   new-part-out)
+		  ((pair? head)
+		   (loop head new-part-out))
+		  (else
+		   (cons head new-part-out))))))))
+
+(define out-force-string
+  (lambda (obj)
+    (if (char? obj)
+	(string obj)
+	obj)))
+
+; Transforme une liste impropre en une liste propre qui s'ecrit
+; de la meme facon
+(define out-regular-list
+  (let ((symbolic-dot (string->symbol ".")))
+    (lambda (p)
+      (let ((tail (cdr p)))
+	(cond ((null? tail)
+	       p)
+	      ((pair? tail)
+	       (cons (car p) (out-regular-list tail)))
+	      (else
+	       (list (car p) symbolic-dot tail)))))))
+
+; Cree des chaines d'espaces de facon paresseuse
+(define out-blanks
+  (let ((cache-v (make-vector 80 #f)))
+    (lambda (n)
+      (or (vector-ref cache-v n)
+	  (let ((result (make-string n #\space)))
+	    (vector-set! cache-v n result)
+	    result)))))
+
+; Insere le separateur entre chaque element d'une liste non-vide
+(define out-separate
+  (lambda (text-l sep)
+    (if (null? (cdr text-l))
+	text-l
+	(cons (car text-l) (cons sep (out-separate (cdr text-l) sep))))))
+
+; Met des donnees en colonnes.  Retourne comme out-pp-aux-list
+(define out-pp-columns
+  (lambda (left right wmax txt&lens)
+    (let loop1 ((tls txt&lens) (lwmax 0) (lwlast 0) (lines '()))
+      (if (null? tls)
+	  (vector #t 0 lwmax lwlast (reverse lines))
+	  (let loop2 ((tls tls) (len 0) (first? #t) (prev-pad 0) (line '()))
+	    (cond ((null? tls)
+		   (loop1 tls
+			  (max len lwmax)
+			  len
+			  (cons (reverse line) lines)))
+		  ((> (+ left len prev-pad 1 wmax) out-max-col)
+		   (loop1 tls
+			  (max len lwmax)
+			  len
+			  (cons (reverse line) lines)))
+		  (first?
+		   (let ((text     (caar tls))
+			 (text-len (cdar tls)))
+		     (loop2 (cdr tls)
+			    (+ len text-len)
+			    #f
+			    (- wmax text-len)
+			    (cons text line))))
+		  ((pair? (cdr tls))
+		   (let* ((prev-pad-s (out-blanks prev-pad))
+			  (text     (caar tls))
+			  (text-len (cdar tls)))
+		     (loop2 (cdr tls)
+			    (+ len prev-pad 1 text-len)
+			    #f
+			    (- wmax text-len)
+			    (cons text (cons " " (cons prev-pad-s line))))))
+		  (else
+		   (let ((prev-pad-s (out-blanks prev-pad))
+			 (text     (caar tls))
+			 (text-len (cdar tls)))
+		     (if (> (+ left len prev-pad 1 text-len) right)
+			 (loop1 tls
+				(max len lwmax)
+				len
+				(cons (reverse line) lines))
+			 (loop2 (cdr tls)
+				(+ len prev-pad 1 text-len)
+				#f
+				(- wmax text-len)
+				(append (list text " " prev-pad-s)
+					line)))))))))))
+
+; Retourne un vecteur #( multiline? width-all width-max width-last text-l )
+(define out-pp-aux-list
+  (lambda (l left right)
+    (let loop ((l l) (multi? #f) (wall -1) (wmax -1) (wlast -1) (txt&lens '()))
+      (if (null? l)
+	  (cond (multi?
+		 (vector #t wall wmax wlast (map car (reverse txt&lens))))
+		((<= (+ left wall) right)
+		 (vector #f wall wmax wlast (map car (reverse txt&lens))))
+		((<= (+ left wmax 1 wmax) out-max-col)
+		 (out-pp-columns left right wmax (reverse txt&lens)))
+		(else
+		 (vector #t wall wmax wlast (map car (reverse txt&lens)))))
+	  (let* ((obj (car l))
+		 (last? (null? (cdr l)))
+		 (this-right (if last? right out-max-col))
+		 (result (out-pp-aux obj left this-right))
+		 (obj-multi? (vector-ref result 0))
+		 (obj-wmax   (vector-ref result 1))
+		 (obj-wlast  (vector-ref result 2))
+		 (obj-text   (vector-ref result 3)))
+	    (loop (cdr l)
+		  (or multi? obj-multi?)
+		  (+ wall obj-wmax 1)
+		  (max wmax obj-wmax)
+		  obj-wlast
+		  (cons (cons obj-text obj-wmax) txt&lens)))))))
+
+; Retourne un vecteur #( multiline? wmax wlast text )
+(define out-pp-aux
+  (lambda (obj left right)
+    (cond ((boolean? obj)
+	   (vector #f 2 2 (if obj '("#t") '("#f"))))
+	  ((null? obj)
+	   (vector #f 2 2 '("()")))
+	  ((number? obj)
+	   (let* ((s (number->string obj))
+		  (len (string-length s)))
+	     (vector #f len len (list s))))
+	  ((symbol? obj)
+	   (let* ((s (symbol->string obj))
+		  (len (string-length s)))
+	     (vector #f len len (list s))))
+	  ((char? obj)
+	   (cond ((char=? obj #\space)
+		  (vector #f 7 7 (list "#\\space")))
+		 ((char=? obj #\newline)
+		  (vector #f 9 9 (list "#\\newline")))
+		 (else
+		  (vector #f 3 3 (list "#\\" obj)))))
+	  ((string? obj)
+	   (let loop ((i (- (string-length obj) 1))
+		      (len 1)
+		      (text '("\"")))
+	     (if (= i -1)
+		 (vector #f (+ len 1) (+ len 1) (cons "\"" text))
+		 (let ((c (string-ref obj i)))
+		   (cond ((char=? c #\\)
+			  (loop (- i 1) (+ len 2) (cons "\\\\" text)))
+			 ((char=? c #\")
+			  (loop (- i 1) (+ len 2) (cons "\\\"" text)))
+			 (else
+			  (loop (- i 1) (+ len 1) (cons (string c) text))))))))
+	  ((pair? obj)
+	   (let* ((l (out-regular-list obj))
+		  (result (out-pp-aux-list l (+ left 1) (- right 1)))
+		  (multiline? (vector-ref result 0))
+		  (width-all  (vector-ref result 1))
+		  (width-max  (vector-ref result 2))
+		  (width-last (vector-ref result 3))
+		  (text-l     (vector-ref result 4)))
+	     (if multiline?
+		 (let* ((sep (list #\newline (out-blanks left)))
+			(formatted-text (out-separate text-l sep))
+			(text (list "(" formatted-text ")")))
+		   (vector #t
+			   (+ (max width-max (+ width-last 1)) 1)
+			   (+ width-last 2)
+			   text))
+		 (let* ((sep (list " "))
+			(formatted-text (out-separate text-l sep))
+			(text (list "(" formatted-text ")")))
+		   (vector #f (+ width-all 2) (+ width-all 2) text)))))
+	  ((and (vector? obj) (zero? (vector-length obj)))
+	   (vector #f 3 3 '("#()")))
+	  ((vector? obj)
+	   (let* ((l (vector->list obj))
+		  (result (out-pp-aux-list l (+ left 2) (- right 1)))
+		  (multiline? (vector-ref result 0))
+		  (width-all  (vector-ref result 1))
+		  (width-max  (vector-ref result 2))
+		  (width-last (vector-ref result 3))
+		  (text-l     (vector-ref result 4)))
+	     (if multiline?
+		 (let* ((sep (list #\newline (out-blanks (+ left 1))))
+			(formatted-text (out-separate text-l sep))
+			(text (list "#(" formatted-text ")")))
+		   (vector #t
+			   (+ (max width-max (+ width-last 1)) 2)
+			   (+ width-last 3)
+			   text))
+		 (let* ((sep (list " "))
+			(formatted-text (out-separate text-l sep))
+			(text (list "#(" formatted-text ")")))
+		   (vector #f (+ width-all 3) (+ width-all 3) text)))))
+	  (else
+	   (display "Internal error: out-pp")
+	   (newline)))))
+
+; Retourne la chaine a afficher
+(define out-pp
+  (lambda (obj col)
+    (let* ((list-rec-of-strings-n-chars
+	    (vector-ref (out-pp-aux obj col out-max-col) 3))
+	   (list-of-strings-n-chars
+	    (out-flatten-list list-rec-of-strings-n-chars))
+	   (list-of-strings
+	    (map out-force-string list-of-strings-n-chars)))
+      (string-append-list list-of-strings))))
+
+
+
+
+;
+; Nice-printer, plus rapide mais moins beau que le pretty-printer
+;
+
+(define out-np
+  (lambda (obj start)
+    (letrec ((line-pad
+	      (string-append (string #\newline)
+			     (out-blanks (- start 1))))
+	     (step-line
+	      (lambda (p)
+		(set-car! p line-pad)))
+	     (p-bool
+	      (lambda (obj col objw texts hole cont)
+		(let ((text (if obj "#t" "#f")))
+		  (cont (+ col 2) (+ objw 2) (cons text texts) hole))))
+	     (p-number
+	      (lambda (obj col objw texts hole cont)
+		(let* ((text (number->string obj))
+		       (len (string-length text)))
+		  (cont (+ col len) (+ objw len) (cons text texts) hole))))
+	     (p-symbol
+	      (lambda (obj col objw texts hole cont)
+		(let* ((text (symbol->string obj))
+		       (len (string-length text)))
+		  (cont (+ col len) (+ objw len) (cons text texts) hole))))
+	     (p-char
+	      (lambda (obj col objw texts hole cont)
+		(let* ((text
+			(cond ((char=? obj #\space) "#\\space")
+			      ((char=? obj #\newline) "#\\newline")
+			      (else (string-append "#\\" (string obj)))))
+		       (len (string-length text)))
+		  (cont (+ col len) (+ objw len) (cons text texts) hole))))
+	     (p-list
+	      (lambda (obj col objw texts hole cont)
+		(p-tail obj (+ col 1) (+ objw 1) (cons "(" texts) hole cont)))
+	     (p-vector
+	      (lambda (obj col objw texts hole cont)
+		(p-list (vector->list obj)
+			(+ col 1) (+ objw 1) (cons "#" texts) hole cont)))
+	     (p-tail
+	      (lambda (obj col objw texts hole cont)
+		(if (null? obj)
+		    (cont (+ col 1) (+ objw 1) (cons ")" texts) hole)
+		    (p-obj (car obj) col objw texts hole
+			   (make-cdr-cont obj cont)))))
+	     (make-cdr-cont
+	      (lambda (obj cont)
+		(lambda (col objw texts hole)
+		  (cond ((null? (cdr obj))
+			 (cont (+ col 1) (+ objw 1) (cons ")" texts) hole))
+			((> col out-max-col)
+			 (step-line hole)
+			 (let ((hole2 (cons " " texts)))
+			   (p-cdr obj (+ start objw 1) 0 hole2 hole2 cont)))
+			(else
+			 (let ((hole2 (cons " " texts)))
+			   (p-cdr obj (+ col 1) 0 hole2 hole2 cont)))))))
+	     (p-cdr
+	      (lambda (obj col objw texts hole cont)
+		(if (pair? (cdr obj))
+		    (p-tail (cdr obj) col objw texts hole cont)
+		    (p-dot col objw texts hole
+			   (make-cdr-cont (list #f (cdr obj)) cont)))))
+	     (p-dot
+	      (lambda (col objw texts hole cont)
+		(cont (+ col 1) (+ objw 1) (cons "." texts) hole)))
+	     (p-obj
+	      (lambda (obj col objw texts hole cont)
+		(cond ((boolean? obj)
+		       (p-bool obj col objw texts hole cont))
+		      ((number? obj)
+		       (p-number obj col objw texts hole cont))
+		      ((symbol? obj)
+		       (p-symbol obj col objw texts hole cont))
+		      ((char? obj)
+		       (p-char obj col objw texts hole cont))
+		      ((or (null? obj) (pair? obj))
+		       (p-list obj col objw texts hole cont))
+		      ((vector? obj)
+		       (p-vector obj col objw texts hole cont))))))
+      (p-obj obj start 0 '() (cons #f #f)
+	     (lambda (col objw texts hole)
+	       (if (> col out-max-col)
+		   (step-line hole))
+	       (string-append-list (reverse texts)))))))
+
+
+
+
+;
+; Fonction pour afficher une table
+; Appelle la sous-routine adequate pour le type de fin de table
+;
+
+; Affiche la table d'un driver
+(define out-print-table
+  (lambda (args-alist
+	   <<EOF>>-action <<ERROR>>-action rules
+	   nl-start no-nl-start arcs-v acc-v
+	   port)
+    (let* ((filein
+	    (cdr (assq 'filein args-alist)))
+	   (table-name
+	    (cdr (assq 'table-name args-alist)))
+	   (pretty?
+	    (assq 'pp args-alist))
+	   (counters-type
+	    (let ((a (assq 'counters args-alist)))
+	      (if a (cdr a) 'line)))
+	   (counters-param-list
+	    (cond ((eq? counters-type 'none)
+		   ")")
+		  ((eq? counters-type 'line)
+		   " yyline)")
+		  (else ; 'all
+		   " yyline yycolumn yyoffset)")))
+	   (counters-param-list-short
+	    (if (char=? (string-ref counters-param-list 0) #\space)
+		(substring counters-param-list
+			   1
+			   (string-length counters-param-list))
+		counters-param-list))
+	   (clean-eof-action
+	    (out-clean-action <<EOF>>-action))
+	   (clean-error-action
+	    (out-clean-action <<ERROR>>-action))
+	   (rule-op
+	    (lambda (rule) (out-clean-action (get-rule-action rule))))
+	   (rules-l
+	    (vector->list rules))
+	   (clean-actions-l
+	    (map rule-op rules-l))
+	   (yytext?-l
+	    (map get-rule-yytext? rules-l)))
+
+      ; Commentaires prealables
+      (display ";" port)
+      (newline port)
+      (display "; Table generated from the file " port)
+      (display filein port)
+      (display " by SILex 1.0" port)
+      (newline port)
+      (display ";" port)
+      (newline port)
+      (newline port)
+
+      ; Ecrire le debut de la table
+      (display "(define " port)
+      (display table-name port)
+      (newline port)
+      (display "  (vector" port)
+      (newline port)
+
+      ; Ecrire la description du type de compteurs
+      (display "   '" port)
+      (write counters-type port)
+      (newline port)
+
+      ; Ecrire l'action pour la fin de fichier
+      (display "   (lambda (yycontinue yygetc yyungetc)" port)
+      (newline port)
+      (display "     (lambda (yytext" port)
+      (display counters-param-list port)
+      (newline port)
+      (display clean-eof-action port)
+      (display "       ))" port)
+      (newline port)
+
+      ; Ecrire l'action pour le cas d'erreur
+      (display "   (lambda (yycontinue yygetc yyungetc)" port)
+      (newline port)
+      (display "     (lambda (yytext" port)
+      (display counters-param-list port)
+      (newline port)
+      (display clean-error-action port)
+      (display "       ))" port)
+      (newline port)
+
+      ; Ecrire le vecteur des actions des regles ordinaires
+      (display "   (vector" port)
+      (newline port)
+      (let loop ((al clean-actions-l) (yyl yytext?-l))
+	(if (pair? al)
+	    (let ((yytext? (car yyl)))
+	      (display "    " port)
+	      (write yytext? port)
+	      (newline port)
+	      (display "    (lambda (yycontinue yygetc yyungetc)" port)
+	      (newline port)
+	      (if yytext?
+		  (begin
+		    (display "      (lambda (yytext" port)
+		    (display counters-param-list port))
+		  (begin
+		    (display "      (lambda (" port)
+		    (display counters-param-list-short port)))
+	      (newline port)
+	      (display (car al) port)
+	      (display "        ))" port)
+	      (if (pair? (cdr al))
+		  (newline port))
+	      (loop (cdr al) (cdr yyl)))))
+      (display ")" port)
+      (newline port)
+
+      ; Ecrire l'automate
+      (cond ((assq 'portable args-alist)
+	     (out-print-table-chars
+	      pretty?
+	      nl-start no-nl-start arcs-v acc-v
+	      port))
+	    ((assq 'code args-alist)
+	     (out-print-table-code
+	      counters-type (vector-length rules) yytext?-l
+	      nl-start no-nl-start arcs-v acc-v
+	      port))
+	    (else
+	     (out-print-table-data
+	      pretty?
+	      nl-start no-nl-start arcs-v acc-v
+	      port))))))
+
+;
+; Affiche l'automate sous forme d'arbres de decision
+; Termine la table du meme coup
+;
+
+(define out-print-table-data
+  (lambda (pretty? nl-start no-nl-start arcs-v acc-v port)
+    (let* ((len (vector-length arcs-v))
+	   (trees-v (make-vector len)))
+      (let loop ((i 0))
+	(if (< i len)
+	    (begin
+	      (vector-set! trees-v i (prep-arcs->tree (vector-ref arcs-v i)))
+	      (loop (+ i 1)))))
+
+      ; Decrire le format de l'automate
+      (display "   'decision-trees" port)
+      (newline port)
+
+      ; Ecrire l'etat de depart pour le cas "debut de la ligne"
+      (display "   " port)
+      (write nl-start port)
+      (newline port)
+
+      ; Ecrire l'etat de depart pour le cas "pas au debut de la ligne"
+      (display "   " port)
+      (write no-nl-start port)
+      (newline port)
+
+      ; Ecrire la table de transitions
+      (display "   '" port)
+      (if pretty?
+	  (display (out-pp trees-v 5) port)
+	  (display (out-np trees-v 5) port))
+      (newline port)
+
+      ; Ecrire la table des acceptations
+      (display "   '" port)
+      (if pretty?
+	  (display (out-pp acc-v 5) port)
+	  (display (out-np acc-v 5) port))
+
+      ; Ecrire la fin de la table
+      (display "))" port)
+      (newline port))))
+
+;
+; Affiche l'automate sous forme de listes de caracteres taggees
+; Termine la table du meme coup
+;
+
+(define out-print-table-chars
+  (lambda (pretty? nl-start no-nl-start arcs-v acc-v port)
+    (let* ((len (vector-length arcs-v))
+	   (portable-v (make-vector len))
+	   (arc-op (lambda (arc)
+		     (cons (class->tagged-char-list (car arc)) (cdr arc)))))
+      (let loop ((s 0))
+	(if (< s len)
+	    (let* ((arcs (vector-ref arcs-v s))
+		   (port-arcs (map arc-op arcs)))
+	      (vector-set! portable-v s port-arcs)
+	      (loop (+ s 1)))))
+
+      ; Decrire le format de l'automate
+      (display "   'tagged-chars-lists" port)
+      (newline port)
+
+      ; Ecrire l'etat de depart pour le cas "debut de la ligne"
+      (display "   " port)
+      (write nl-start port)
+      (newline port)
+
+      ; Ecrire l'etat de depart pour le cas "pas au debut de la ligne"
+      (display "   " port)
+      (write no-nl-start port)
+      (newline port)
+
+      ; Ecrire la table de transitions
+      (display "   '" port)
+      (if pretty?
+	  (display (out-pp portable-v 5) port)
+	  (display (out-np portable-v 5) port))
+      (newline port)
+
+      ; Ecrire la table des acceptations
+      (display "   '" port)
+      (if pretty?
+	  (display (out-pp acc-v 5) port)
+	  (display (out-np acc-v 5) port))
+
+      ; Ecrire la fin de la table
+      (display "))" port)
+      (newline port))))
+
+;
+; Genere l'automate en code Scheme
+; Termine la table du meme coup
+;
+
+(define out-print-code-trans3
+  (lambda (margin tree action-var port)
+    (newline port)
+    (display (out-blanks margin) port)
+    (cond ((eq? tree 'err)
+	   (display action-var port))
+	  ((number? tree)
+	   (display "(state-" port)
+	   (display tree port)
+	   (display " " port)
+	   (display action-var port)
+	   (display ")" port))
+	  ((eq? (car tree) '=)
+	   (display "(if (= c " port)
+	   (display (list-ref tree 1) port)
+	   (display ")" port)
+	   (out-print-code-trans3 (+ margin 4)
+				  (list-ref tree 2)
+				  action-var
+				  port)
+	   (out-print-code-trans3 (+ margin 4)
+				  (list-ref tree 3)
+				  action-var
+				  port)
+	   (display ")" port))
+	  (else
+	   (display "(if (< c " port)
+	   (display (list-ref tree 0) port)
+	   (display ")" port)
+	   (out-print-code-trans3 (+ margin 4)
+				  (list-ref tree 1)
+				  action-var
+				  port)
+	   (out-print-code-trans3 (+ margin 4)
+				  (list-ref tree 2)
+				  action-var
+				  port)
+	   (display ")" port)))))
+
+(define out-print-code-trans2
+  (lambda (margin tree action-var port)
+    (newline port)
+    (display (out-blanks margin) port)
+    (display "(if c" port)
+    (out-print-code-trans3 (+ margin 4) tree action-var port)
+    (newline port)
+    (display (out-blanks (+ margin 4)) port)
+    (display action-var port)
+    (display ")" port)))
+
+(define out-print-code-trans1
+  (lambda (margin tree action-var port)
+    (newline port)
+    (display (out-blanks margin) port)
+    (if (eq? tree 'err)
+	(display action-var port)
+	(begin
+	  (display "(let ((c (read-char)))" port)
+	  (out-print-code-trans2 (+ margin 2) tree action-var port)
+	  (display ")" port)))))
+
+(define out-print-table-code
+  (lambda (counters nbrules yytext?-l
+	   nl-start no-nl-start arcs-v acc-v
+	   port)
+    (let* ((counters-params
+	    (cond ((eq? counters 'none) ")")
+		  ((eq? counters 'line) " yyline)")
+		  ((eq? counters 'all)  " yyline yycolumn yyoffset)")))
+	   (counters-params-short
+	    (cond ((eq? counters 'none) ")")
+		  ((eq? counters 'line) "yyline)")
+		  ((eq? counters 'all)  "yyline yycolumn yyoffset)")))
+	   (nbstates (vector-length arcs-v))
+	   (trees-v (make-vector nbstates)))
+      (let loop ((s 0))
+	(if (< s nbstates)
+	    (begin
+	      (vector-set! trees-v s (prep-arcs->tree (vector-ref arcs-v s)))
+	      (loop (+ s 1)))))
+
+      ; Decrire le format de l'automate
+      (display "   'code" port)
+      (newline port)
+
+      ; Ecrire l'entete de la fonction
+      (display "   (lambda (<<EOF>>-pre-action" port)
+      (newline port)
+      (display "            <<ERROR>>-pre-action" port)
+      (newline port)
+      (display "            rules-pre-action" port)
+      (newline port)
+      (display "            IS)" port)
+      (newline port)
+
+      ; Ecrire le debut du letrec et les variables d'actions brutes
+      (display "     (letrec" port)
+      (newline port)
+      (display "         ((user-action-<<EOF>> #f)" port)
+      (newline port)
+      (display "          (user-action-<<ERROR>> #f)" port)
+      (newline port)
+      (let loop ((i 0))
+	(if (< i nbrules)
+	    (begin
+	      (display "          (user-action-" port)
+	      (write i port)
+	      (display " #f)" port)
+	      (newline port)
+	      (loop (+ i 1)))))
+
+      ; Ecrire l'extraction des fonctions du IS
+      (display "          (start-go-to-end    " port)
+      (display "(cdr (assq 'start-go-to-end IS)))" port)
+      (newline port)
+      (display "          (end-go-to-point    " port)
+      (display "(cdr (assq 'end-go-to-point IS)))" port)
+      (newline port)
+      (display "          (init-lexeme        " port)
+      (display "(cdr (assq 'init-lexeme IS)))" port)
+      (newline port)
+      (display "          (get-start-line     " port)
+      (display "(cdr (assq 'get-start-line IS)))" port)
+      (newline port)
+      (display "          (get-start-column   " port)
+      (display "(cdr (assq 'get-start-column IS)))" port)
+      (newline port)
+      (display "          (get-start-offset   " port)
+      (display "(cdr (assq 'get-start-offset IS)))" port)
+      (newline port)
+      (display "          (peek-left-context  " port)
+      (display "(cdr (assq 'peek-left-context IS)))" port)
+      (newline port)
+      (display "          (peek-char          " port)
+      (display "(cdr (assq 'peek-char IS)))" port)
+      (newline port)
+      (display "          (read-char          " port)
+      (display "(cdr (assq 'read-char IS)))" port)
+      (newline port)
+      (display "          (get-start-end-text " port)
+      (display "(cdr (assq 'get-start-end-text IS)))" port)
+      (newline port)
+      (display "          (user-getc          " port)
+      (display "(cdr (assq 'user-getc IS)))" port)
+      (newline port)
+      (display "          (user-ungetc        " port)
+      (display "(cdr (assq 'user-ungetc IS)))" port)
+      (newline port)
+
+      ; Ecrire les variables d'actions
+      (display "          (action-<<EOF>>" port)
+      (newline port)
+      (display "           (lambda (" port)
+      (display counters-params-short port)
+      (newline port)
+      (display "             (user-action-<<EOF>> \"\"" port)
+      (display counters-params port)
+      (display "))" port)
+      (newline port)
+      (display "          (action-<<ERROR>>" port)
+      (newline port)
+      (display "           (lambda (" port)
+      (display counters-params-short port)
+      (newline port)
+      (display "             (user-action-<<ERROR>> \"\"" port)
+      (display counters-params port)
+      (display "))" port)
+      (newline port)
+      (let loop ((i 0) (yyl yytext?-l))
+	(if (< i nbrules)
+	    (begin
+	      (display "          (action-" port)
+	      (display i port)
+	      (newline port)
+	      (display "           (lambda (" port)
+	      (display counters-params-short port)
+	      (newline port)
+	      (if (car yyl)
+		  (begin
+		    (display "             (let ((yytext" port)
+		    (display " (get-start-end-text)))" port)
+		    (newline port)
+		    (display "               (start-go-to-end)" port)
+		    (newline port)
+		    (display "               (user-action-" port)
+		    (display i port)
+		    (display " yytext" port)
+		    (display counters-params port)
+		    (display ")))" port)
+		    (newline port))
+		  (begin
+		    (display "             (start-go-to-end)" port)
+		    (newline port)
+		    (display "             (user-action-" port)
+		    (display i port)
+		    (display counters-params port)
+		    (display "))" port)
+		    (newline port)))
+	      (loop (+ i 1) (cdr yyl)))))
+
+      ; Ecrire les variables d'etats
+      (let loop ((s 0))
+	(if (< s nbstates)
+	    (let* ((tree (vector-ref trees-v s))
+		   (acc (vector-ref acc-v s))
+		   (acc-eol (car acc))
+		   (acc-no-eol (cdr acc)))
+	      (display "          (state-" port)
+	      (display s port)
+	      (newline port)
+	      (display "           (lambda (action)" port)
+	      (cond ((not acc-eol)
+		     (out-print-code-trans1 13 tree "action" port))
+		    ((not acc-no-eol)
+		     (newline port)
+		     (if (eq? tree 'err)
+			 (display "             (let* ((c (peek-char))" port)
+			 (display "             (let* ((c (read-char))" port))
+		     (newline port)
+		     (display "                    (new-action (if (o" port)
+		     (display "r (not c) (= c lexer-integer-newline))" port)
+		     (newline port)
+		     (display "                                  " port)
+		     (display "  (begin (end-go-to-point) action-" port)
+		     (display acc-eol port)
+		     (display ")" port)
+		     (newline port)
+		     (display "                       " port)
+		     (display "             action)))" port)
+		     (if (eq? tree 'err)
+			 (out-print-code-trans1 15 tree "new-action" port)
+			 (out-print-code-trans2 15 tree "new-action" port))
+		     (display ")" port))
+		    ((< acc-eol acc-no-eol)
+		     (newline port)
+		     (display "             (end-go-to-point)" port)
+		     (newline port)
+		     (if (eq? tree 'err)
+			 (display "             (let* ((c (peek-char))" port)
+			 (display "             (let* ((c (read-char))" port))
+		     (newline port)
+		     (display "                    (new-action (if (o" port)
+		     (display "r (not c) (= c lexer-integer-newline))" port)
+		     (newline port)
+		     (display "                      " port)
+		     (display "              action-" port)
+		     (display acc-eol port)
+		     (newline port)
+		     (display "                      " port)
+		     (display "              action-" port)
+		     (display acc-no-eol port)
+		     (display ")))" port)
+		     (if (eq? tree 'err)
+			 (out-print-code-trans1 15 tree "new-action" port)
+			 (out-print-code-trans2 15 tree "new-action" port))
+		     (display ")" port))
+		    (else
+		     (let ((action-var
+			    (string-append "action-"
+					   (number->string acc-eol))))
+		       (newline port)
+		       (display "             (end-go-to-point)" port)
+		       (out-print-code-trans1 13 tree action-var port))))
+	      (display "))" port)
+	      (newline port)
+	      (loop (+ s 1)))))
+
+      ; Ecrire la variable de lancement de l'automate
+      (display "          (start-automaton" port)
+      (newline port)
+      (display "           (lambda ()" port)
+      (newline port)
+      (if (= nl-start no-nl-start)
+	  (begin
+	    (display "             (if (peek-char)" port)
+	    (newline port)
+	    (display "                 (state-" port)
+	    (display nl-start port)
+	    (display " action-<<ERROR>>)" port)
+	    (newline port)
+	    (display "                 action-<<EOF>>)" port))
+	  (begin
+	    (display "             (cond ((not (peek-char))" port)
+	    (newline port)
+	    (display "                    action-<<EOF>>)" port)
+	    (newline port)
+	    (display "                   ((= (peek-left-context)" port)
+	    (display " lexer-integer-newline)" port)
+	    (newline port)
+	    (display "                    (state-" port)
+	    (display nl-start port)
+	    (display " action-<<ERROR>>))" port)
+	    (newline port)
+	    (display "                   (else" port)
+	    (newline port)
+	    (display "                    (state-" port)
+	    (display no-nl-start port)
+	    (display " action-<<ERROR>>)))" port)))
+      (display "))" port)
+      (newline port)
+
+      ; Ecrire la fonction principale de lexage
+      (display "          (final-lexer" port)
+      (newline port)
+      (display "           (lambda ()" port)
+      (newline port)
+      (display "             (init-lexeme)" port)
+      (newline port)
+      (cond ((eq? counters 'none)
+	     (display "             ((start-automaton))" port))
+	    ((eq? counters 'line)
+	     (display "             (let ((yyline (get-start-line)))" port)
+	     (newline port)
+	     (display "               ((start-automaton) yyline))" port))
+	    ((eq? counters 'all)
+	     (display "             (let ((yyline (get-start-line))" port)
+	     (newline port)
+	     (display "                   (yycolumn (get-start-column))" port)
+	     (newline port)
+	     (display "                   (yyoffset (get-start-offset)))" port)
+	     (newline port)
+	     (display "               ((start-automat" port)
+	     (display "on) yyline yycolumn yyoffset))" port)))
+      (display "))" port)
+
+      ; Fermer les bindings du grand letrec
+      (display ")" port)
+      (newline port)
+
+      ; Initialiser les variables user-action-XX
+      (display "       (set! user-action-<<EOF>>" port)
+      (display " (<<EOF>>-pre-action" port)
+      (newline port)
+      (display "                                  final-lexer" port)
+      (display " user-getc user-ungetc))" port)
+      (newline port)
+      (display "       (set! user-action-<<ERROR>>" port)
+      (display " (<<ERROR>>-pre-action" port)
+      (newline port)
+      (display "                                    final-lexer" port)
+      (display " user-getc user-ungetc))" port)
+      (newline port)
+      (let loop ((r 0))
+	(if (< r nbrules)
+	    (let* ((str-r (number->string r))
+		   (blanks (out-blanks (string-length str-r))))
+	      (display "       (set! user-action-" port)
+	      (display str-r port)
+	      (display " ((vector-ref rules-pre-action " port)
+	      (display (number->string (+ (* 2 r) 1)) port)
+	      (display ")" port)
+	      (newline port)
+	      (display blanks port)
+	      (display "                           final-lexer " port)
+	      (display "user-getc user-ungetc))" port)
+	      (newline port)
+	      (loop (+ r 1)))))
+
+      ; Faire retourner le lexer final et fermer la table au complet
+      (display "       final-lexer))))" port)
+      (newline port))))
+
+;
+; Fonctions necessaires a l'initialisation automatique du lexer
+;
+
+(define out-print-driver-functions
+  (lambda (args-alist port)
+    (let ((counters   (cdr (or (assq 'counters args-alist) '(z . line))))
+	  (table-name (cdr (assq 'table-name args-alist))))
+      (display ";" port)
+      (newline port)
+      (display "; User functions" port)
+      (newline port)
+      (display ";" port)
+      (newline port)
+      (newline port)
+      (display "(define lexer #f)" port)
+      (newline port)
+      (newline port)
+      (if (not (eq? counters 'none))
+	  (begin
+	    (display "(define lexer-get-line   #f)" port)
+	    (newline port)
+	    (if (eq? counters 'all)
+		(begin
+		  (display "(define lexer-get-column #f)" port)
+		  (newline port)
+		  (display "(define lexer-get-offset #f)" port)
+		  (newline port)))))
+      (display "(define lexer-getc       #f)" port)
+      (newline port)
+      (display "(define lexer-ungetc     #f)" port)
+      (newline port)
+      (newline port)
+      (display "(define lexer-init" port)
+      (newline port)
+      (display "  (lambda (input-type input)" port)
+      (newline port)
+      (display "    (let ((IS (lexer-make-IS input-type input '" port)
+      (write counters port)
+      (display ")))" port)
+      (newline port)
+      (display "      (set! lexer (lexer-make-lexer " port)
+      (display table-name port)
+      (display " IS))" port)
+      (newline port)
+      (if (not (eq? counters 'none))
+	  (begin
+	    (display "      (set! lexer-get-line   (lexer-get-func-line IS))"
+		     port)
+	    (newline port)
+	    (if (eq? counters 'all)
+		(begin
+		  (display
+		   "      (set! lexer-get-column (lexer-get-func-column IS))"
+		   port)
+		  (newline port)
+		  (display
+		   "      (set! lexer-get-offset (lexer-get-func-offset IS))"
+		   port)
+		  (newline port)))))
+      (display "      (set! lexer-getc       (lexer-get-func-getc IS))" port)
+      (newline port)
+      (display "      (set! lexer-ungetc     (lexer-get-func-ungetc IS)))))"
+	       port)
+      (newline port))))
+
+;
+; Fonction principale
+; Affiche une table ou un driver complet
+;
+
+(define output
+  (lambda (args-alist
+	   <<EOF>>-action <<ERROR>>-action rules
+	   nl-start no-nl-start arcs acc)
+    (let* ((fileout          (cdr (assq 'fileout args-alist)))
+	   (port             (open-output-file fileout))
+	   (complete-driver? (cdr (assq 'complete-driver? args-alist))))
+      (if complete-driver?
+	  (begin
+	    (out-print-run-time-lib port)
+	    (newline port)))
+      (out-print-table args-alist
+		       <<EOF>>-action <<ERROR>>-action rules
+		       nl-start no-nl-start arcs acc
+		       port)
+      (if complete-driver?
+	  (begin
+	    (newline port)
+	    (out-print-driver-functions args-alist port)))
+      (close-output-port port))))
+
+; Module output2.scm.
+;
+; Fonction de copiage du fichier run-time
+;
+
+(define out-print-run-time-lib
+  (lambda (port)
+    (display "; *** This file start" port)
+    (display "s with a copy of the " port)
+    (display "file multilex.scm ***" port)
+    (newline port)
+    (display "; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Gestion des Input Systems
+; Fonctions a utiliser par l'usager:
+;   lexer-make-IS, lexer-get-func-getc, lexer-get-func-ungetc,
+;   lexer-get-func-line, lexer-get-func-column et lexer-get-func-offset
+;
+
+; Taille initiale par defaut du buffer d'entree
+(define lexer-init-buffer-len 1024)
+
+; Numero du caractere newline
+(define lexer-integer-newline (char->integer #\\newline))
+
+; Constructeur d'IS brut
+(define lexer-raw-IS-maker
+  (lambda (buffer read-ptr input-f counters)
+    (let ((input-f          input-f)                ; Entree reelle
+	  (buffer           buffer)                 ; Buffer
+	  (buflen           (string-length buffer))
+	  (read-ptr         read-ptr)
+	  (start-ptr        1)                      ; Marque de debut de lexeme
+	  (start-line       1)
+	  (start-column     1)
+	  (start-offset     0)
+	  (end-ptr          1)                      ; Marque de fin de lexeme
+	  (point-ptr        1)                      ; Le point
+	  (user-ptr         1)                      ; Marque de l'usager
+	  (user-line        1)
+	  (user-column      1)
+	  (user-offset      0)
+	  (user-up-to-date? #t))                    ; Concerne la colonne seul.
+      (letrec
+	  ((start-go-to-end-none         ; Fonctions de depl. des marques
+	    (lambda ()
+	      (set! start-ptr end-ptr)))
+	   (start-go-to-end-line
+	    (lambda ()
+	      (let loop ((ptr start-ptr) (line start-line))
+		(if (= ptr end-ptr)
+		    (begin
+		      (set! start-ptr ptr)
+		      (set! start-line line))
+		    (if (char=? (string-ref buffer ptr) #\\newline)
+			(loop (+ ptr 1) (+ line 1))
+			(loop (+ ptr 1) line))))))
+	   (start-go-to-end-all
+	    (lambda ()
+	      (set! start-offset (+ start-offset (- end-ptr start-ptr)))
+	      (let loop ((ptr start-ptr)
+			 (line start-line)
+			 (column start-column))
+		(if (= ptr end-ptr)
+		    (begin
+		      (set! start-ptr ptr)
+		      (set! start-line line)
+		      (set! start-column column))
+		    (if (char=? (string-ref buffer ptr) #\\newline)
+			(loop (+ ptr 1) (+ line 1) 1)
+			(loop (+ ptr 1) line (+ column 1)))))))
+	   (start-go-to-user-none
+	    (lambda ()
+	      (set! start-ptr user-ptr)))
+	   (start-go-to-user-line
+	    (lambda ()
+	      (set! start-ptr user-ptr)
+	      (set! start-line user-line)))
+	   (start-go-to-user-all
+	    (lambda ()
+	      (set! start-line user-line)
+	      (set! start-offset user-offset)
+	      (if user-up-to-date?
+		  (begin
+		    (set! start-ptr user-ptr)
+		    (set! start-column user-column))
+		  (let loop ((ptr start-ptr) (column start-column))
+		    (if (= ptr user-ptr)
+			(begin
+			  (set! start-ptr ptr)
+			  (set! start-column column))
+			(if (char=? (string-ref buffer ptr) #\\newline)
+			    (loop (+ ptr 1) 1)
+			    (loop (+ ptr 1) (+ column 1))))))))
+	   (end-go-to-point
+	    (lambda ()
+	      (set! end-ptr point-ptr)))
+	   (point-go-to-start
+	    (lambda ()
+	      (set! point-ptr start-ptr)))
+	   (user-go-to-start-none
+	    (lambda ()
+	      (set! user-ptr start-ptr)))
+	   (user-go-to-start-line
+	    (lambda ()
+	      (set! user-ptr start-ptr)
+	      (set! user-line start-line)))
+	   (user-go-to-start-all
+	    (lambda ()
+	      (set! user-ptr start-ptr)
+	      (set! user-line start-line)
+	      (set! user-column start-column)
+	      (set! user-offset start-offset)
+	      (set! user-up-to-date? #t)))
+	   (init-lexeme-none             ; Debute un nouveau lexeme
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-none))
+	      (point-go-to-start)))
+	   (init-lexeme-line
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-line))
+	      (point-go-to-start)))
+	   (init-lexeme-all
+	    (lambda ()
+	      (if (< start-ptr user-ptr)
+		  (start-go-to-user-all))
+	      (point-go-to-start)))
+	   (get-start-line               ; Obtention des stats du debut du lxm
+	    (lambda ()
+	      start-line))
+	   (get-start-column
+	    (lambda ()
+	      start-column))
+	   (get-start-offset
+	    (lambda ()
+	      start-offset))
+	   (peek-left-context            ; Obtention de caracteres (#f si EOF)
+	    (lambda ()
+	      (char->integer (string-ref buffer (- start-ptr 1)))))
+	   (peek-char
+	    (lambda ()
+	      (if (< point-ptr read-ptr)
+		  (char->integer (string-ref buffer point-ptr))
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer point-ptr c)
+			  (set! read-ptr (+ point-ptr 1))
+			  (char->integer c))
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  #f))))))
+	   (read-char
+	    (lambda ()
+	      (if (< point-ptr read-ptr)
+		  (let ((c (string-ref buffer point-ptr)))
+		    (set! point-ptr (+ point-ptr 1))
+		    (char->integer c))
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer point-ptr c)
+			  (set! read-ptr (+ point-ptr 1))
+			  (set! point-ptr read-ptr)
+			  (char->integer c))
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  #f))))))
+	   (get-start-end-text           ; Obtention du lexeme
+	    (lambda ()
+	      (substring buffer start-ptr end-ptr)))
+	   (get-user-line-line           ; Fonctions pour l'usager
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-line))
+	      user-line))
+	   (get-user-line-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      user-line))
+	   (get-user-column-all
+	    (lambda ()
+	      (cond ((< user-ptr start-ptr)
+		     (user-go-to-start-all)
+		     user-column)
+		    (user-up-to-date?
+		     user-column)
+		    (else
+		     (let loop ((ptr start-ptr) (column start-column))
+		       (if (= ptr user-ptr)
+			   (begin
+			     (set! user-column column)
+			     (set! user-up-to-date? #t)
+			     column)
+			   (if (char=? (string-ref buffer ptr) #\\newline)
+			       (loop (+ ptr 1) 1)
+			       (loop (+ ptr 1) (+ column 1)))))))))
+	   (get-user-offset-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      user-offset))
+	   (user-getc-none
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-none))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-getc-line
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-line))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    (if (char=? c #\\newline)
+			(set! user-line (+ user-line 1)))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  (if (char=? c #\\newline)
+			      (set! user-line (+ user-line 1)))
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-getc-all
+	    (lambda ()
+	      (if (< user-ptr start-ptr)
+		  (user-go-to-start-all))
+	      (if (< user-ptr read-ptr)
+		  (let ((c (string-ref buffer user-ptr)))
+		    (set! user-ptr (+ user-ptr 1))
+		    (if (char=? c #\\newline)
+			(begin
+			  (set! user-line (+ user-line 1))
+			  (set! user-column 1))
+			(set! user-column (+ user-column 1)))
+		    (set! user-offset (+ user-offset 1))
+		    c)
+		  (let ((c (input-f)))
+		    (if (char? c)
+			(begin
+			  (if (= read-ptr buflen)
+			      (reorganize-buffer))
+			  (string-set! buffer user-ptr c)
+			  (set! read-ptr (+ read-ptr 1))
+			  (set! user-ptr read-ptr)
+			  (if (char=? c #\\newline)
+			      (begin
+				(set! user-line (+ user-line 1))
+				(set! user-column 1))
+			      (set! user-column (+ user-column 1)))
+			  (set! user-offset (+ user-offset 1))
+			  c)
+			(begin
+			  (set! input-f (lambda () 'eof))
+			  'eof))))))
+	   (user-ungetc-none
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (set! user-ptr (- user-ptr 1)))))
+	   (user-ungetc-line
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (begin
+		    (set! user-ptr (- user-ptr 1))
+		    (let ((c (string-ref buffer user-ptr)))
+		      (if (char=? c #\\newline)
+			  (set! user-line (- user-line 1))))))))
+	   (user-ungetc-all
+	    (lambda ()
+	      (if (> user-ptr start-ptr)
+		  (begin
+		    (set! user-ptr (- user-ptr 1))
+		    (let ((c (string-ref buffer user-ptr)))
+		      (if (char=? c #\\newline)
+			  (begin
+			    (set! user-line (- user-line 1))
+			    (set! user-up-to-date? #f))
+			  (set! user-column (- user-column 1)))
+		      (set! user-offset (- user-offset 1)))))))
+	   (reorganize-buffer            ; Decaler ou agrandir le buffer
+	    (lambda ()
+	      (if (< (* 2 start-ptr) buflen)
+		  (let* ((newlen (* 2 buflen))
+			 (newbuf (make-string newlen))
+			 (delta (- start-ptr 1)))
+		    (let loop ((from (- start-ptr 1)))
+		      (if (< from buflen)
+			  (begin
+			    (string-set! newbuf
+					 (- from delta)
+					 (string-ref buffer from))
+			    (loop (+ from 1)))))
+		    (set! buffer    newbuf)
+		    (set! buflen    newlen)
+		    (set! read-ptr  (- read-ptr delta))
+		    (set! start-ptr (- start-ptr delta))
+		    (set! end-ptr   (- end-ptr delta))
+		    (set! point-ptr (- point-ptr delta))
+		    (set! user-ptr  (- user-ptr delta)))
+		  (let ((delta (- start-ptr 1)))
+		    (let loop ((from (- start-ptr 1)))
+		      (if (< from buflen)
+			  (begin
+			    (string-set! buffer
+					 (- from delta)
+					 (string-ref buffer from))
+			    (loop (+ from 1)))))
+		    (set! read-ptr  (- read-ptr delta))
+		    (set! start-ptr (- start-ptr delta))
+		    (set! end-ptr   (- end-ptr delta))
+		    (set! point-ptr (- point-ptr delta))
+		    (set! user-ptr  (- user-ptr delta)))))))
+	(list (cons 'start-go-to-end
+		    (cond ((eq? counters 'none) start-go-to-end-none)
+			  ((eq? counters 'line) start-go-to-end-line)
+			  ((eq? counters 'all ) start-go-to-end-all)))
+	      (cons 'end-go-to-point
+		    end-go-to-point)
+	      (cons 'init-lexeme
+		    (cond ((eq? counters 'none) init-lexeme-none)
+			  ((eq? counters 'line) init-lexeme-line)
+			  ((eq? counters 'all ) init-lexeme-all)))
+	      (cons 'get-start-line
+		    get-start-line)
+	      (cons 'get-start-column
+		    get-start-column)
+	      (cons 'get-start-offset
+		    get-start-offset)
+	      (cons 'peek-left-context
+		    peek-left-context)
+	      (cons 'peek-char
+		    peek-char)
+	      (cons 'read-char
+		    read-char)
+	      (cons 'get-start-end-text
+		    get-start-end-text)
+	      (cons 'get-user-line
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) get-user-line-line)
+			  ((eq? counters 'all ) get-user-line-all)))
+	      (cons 'get-user-column
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) #f)
+			  ((eq? counters 'all ) get-user-column-all)))
+	      (cons 'get-user-offset
+		    (cond ((eq? counters 'none) #f)
+			  ((eq? counters 'line) #f)
+			  ((eq? counters 'all ) get-user-offset-all)))
+	      (cons 'user-getc
+		    (cond ((eq? counters 'none) user-getc-none)
+			  ((eq? counters 'line) user-getc-line)
+			  ((eq? counters 'all ) user-getc-all)))
+	      (cons 'user-ungetc
+		    (cond ((eq? counters 'none) user-ungetc-none)
+			  ((eq? counters 'line) user-ungetc-line)
+			  ((eq? counters 'all ) user-ungetc-all))))))))
+
+; Construit un Input System
+; Le premier parametre doit etre parmi \"port\", \"procedure\" ou \"string\"
+; Prend un parametre facultatif qui doit etre parmi
+; \"none\", \"line\" ou \"all\"
+(define lexer-make-IS
+  (lambda (input-type input . largs)
+    (let ((counters-type (cond ((null? largs)
+				'line)
+			       ((memq (car largs) '(none line all))
+				(car largs))
+			       (else
+				'line))))
+      (cond ((and (eq? input-type 'port) (input-port? input))
+	     (let* ((buffer   (make-string lexer-init-buffer-len #\\newline))
+		    (read-ptr 1)
+		    (input-f  (lambda () (read-char input))))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    ((and (eq? input-type 'procedure) (procedure? input))
+	     (let* ((buffer   (make-string lexer-init-buffer-len #\\newline))
+		    (read-ptr 1)
+		    (input-f  input))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    ((and (eq? input-type 'string) (string? input))
+	     (let* ((buffer   (string-append (string #\\newline) input))
+		    (read-ptr (string-length buffer))
+		    (input-f  (lambda () 'eof)))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))
+	    (else
+	     (let* ((buffer   (string #\\newline))
+		    (read-ptr 1)
+		    (input-f  (lambda () 'eof)))
+	       (lexer-raw-IS-maker buffer read-ptr input-f counters-type)))))))
+
+; Les fonctions:
+;   lexer-get-func-getc, lexer-get-func-ungetc,
+;   lexer-get-func-line, lexer-get-func-column et lexer-get-func-offset
+(define lexer-get-func-getc
+  (lambda (IS) (cdr (assq 'user-getc IS))))
+(define lexer-get-func-ungetc
+  (lambda (IS) (cdr (assq 'user-ungetc IS))))
+(define lexer-get-func-line
+  (lambda (IS) (cdr (assq 'get-user-line IS))))
+(define lexer-get-func-column
+  (lambda (IS) (cdr (assq 'get-user-column IS))))
+(define lexer-get-func-offset
+  (lambda (IS) (cdr (assq 'get-user-offset IS))))
+
+;
+; Gestion des lexers
+;
+
+; Fabrication de lexer a partir d'arbres de decision
+(define lexer-make-tree-lexer
+  (lambda (tables IS)
+    (letrec
+	(; Contenu de la table
+	 (counters-type        (vector-ref tables 0))
+	 (<<EOF>>-pre-action   (vector-ref tables 1))
+	 (<<ERROR>>-pre-action (vector-ref tables 2))
+	 (rules-pre-actions    (vector-ref tables 3))
+	 (table-nl-start       (vector-ref tables 5))
+	 (table-no-nl-start    (vector-ref tables 6))
+	 (trees-v              (vector-ref tables 7))
+	 (acc-v                (vector-ref tables 8))
+
+	 ; Contenu du IS
+	 (IS-start-go-to-end    (cdr (assq 'start-go-to-end IS)))
+	 (IS-end-go-to-point    (cdr (assq 'end-go-to-point IS)))
+	 (IS-init-lexeme        (cdr (assq 'init-lexeme IS)))
+	 (IS-get-start-line     (cdr (assq 'get-start-line IS)))
+	 (IS-get-start-column   (cdr (assq 'get-start-column IS)))
+	 (IS-get-start-offset   (cdr (assq 'get-start-offset IS)))
+	 (IS-peek-left-context  (cdr (assq 'peek-left-context IS)))
+	 (IS-peek-char          (cdr (assq 'peek-char IS)))
+	 (IS-read-char          (cdr (assq 'read-char IS)))
+	 (IS-get-start-end-text (cdr (assq 'get-start-end-text IS)))
+	 (IS-get-user-line      (cdr (assq 'get-user-line IS)))
+	 (IS-get-user-column    (cdr (assq 'get-user-column IS)))
+	 (IS-get-user-offset    (cdr (assq 'get-user-offset IS)))
+	 (IS-user-getc          (cdr (assq 'user-getc IS)))
+	 (IS-user-ungetc        (cdr (assq 'user-ungetc IS)))
+
+	 ; Resultats
+	 (<<EOF>>-action   #f)
+	 (<<ERROR>>-action #f)
+	 (rules-actions    #f)
+	 (states           #f)
+	 (final-lexer      #f)
+
+	 ; Gestion des hooks
+	 (hook-list '())
+	 (add-hook
+	  (lambda (thunk)
+	    (set! hook-list (cons thunk hook-list))))
+	 (apply-hooks
+	  (lambda ()
+	    (let loop ((l hook-list))
+	      (if (pair? l)
+		  (begin
+		    ((car l))
+		    (loop (cdr l)))))))
+
+	 ; Preparation des actions
+	 (set-action-statics
+	  (lambda (pre-action)
+	    (pre-action final-lexer IS-user-getc IS-user-ungetc)))
+	 (prepare-special-action-none
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda ()
+		       (action \"\")))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action-line
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (action \"\" yyline)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action-all
+	  (lambda (pre-action)
+	    (let ((action #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (action \"\" yyline yycolumn yyoffset)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-special-action
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-special-action-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-special-action-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-special-action-all  pre-action)))))
+	 (prepare-action-yytext-none
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda ()
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext-line
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext yyline))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext-all
+	  (lambda (pre-action)
+	    (let ((get-start-end-text IS-get-start-end-text)
+		  (start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (let ((yytext (get-start-end-text)))
+			 (start-go-to-end)
+			 (action yytext yyline yycolumn yyoffset))))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-yytext
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-action-yytext-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-action-yytext-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-action-yytext-all  pre-action)))))
+	 (prepare-action-no-yytext-none
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda ()
+		       (start-go-to-end)
+		       (action)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext-line
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline)
+		       (start-go-to-end)
+		       (action yyline)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext-all
+	  (lambda (pre-action)
+	    (let ((start-go-to-end    IS-start-go-to-end)
+		  (action             #f))
+	      (let ((result
+		     (lambda (yyline yycolumn yyoffset)
+		       (start-go-to-end)
+		       (action yyline yycolumn yyoffset)))
+		    (hook
+		     (lambda ()
+		       (set! action (set-action-statics pre-action)))))
+		(add-hook hook)
+		result))))
+	 (prepare-action-no-yytext
+	  (lambda (pre-action)
+	    (cond ((eq? counters-type 'none)
+		   (prepare-action-no-yytext-none pre-action))
+		  ((eq? counters-type 'line)
+		   (prepare-action-no-yytext-line pre-action))
+		  ((eq? counters-type 'all)
+		   (prepare-action-no-yytext-all  pre-action)))))
+
+	 ; Fabrique les fonctions de dispatch
+	 (prepare-dispatch-err
+	  (lambda (leaf)
+	    (lambda (c)
+	      #f)))
+	 (prepare-dispatch-number
+	  (lambda (leaf)
+	    (let ((state-function #f))
+	      (let ((result
+		     (lambda (c)
+		       state-function))
+		    (hook
+		     (lambda ()
+		       (set! state-function (vector-ref states leaf)))))
+		(add-hook hook)
+		result))))
+	 (prepare-dispatch-leaf
+	  (lambda (leaf)
+	    (if (eq? leaf 'err)
+		(prepare-dispatch-err leaf)
+		(prepare-dispatch-number leaf))))
+	 (prepare-dispatch-<
+	  (lambda (tree)
+	    (let ((left-tree  (list-ref tree 1))
+		  (right-tree (list-ref tree 2)))
+	      (let ((bound      (list-ref tree 0))
+		    (left-func  (prepare-dispatch-tree left-tree))
+		    (right-func (prepare-dispatch-tree right-tree)))
+		(lambda (c)
+		  (if (< c bound)
+		      (left-func c)
+		      (right-func c)))))))
+	 (prepare-dispatch-=
+	  (lambda (tree)
+	    (let ((left-tree  (list-ref tree 2))
+		  (right-tree (list-ref tree 3)))
+	      (let ((bound      (list-ref tree 1))
+		    (left-func  (prepare-dispatch-tree left-tree))
+		    (right-func (prepare-dispatch-tree right-tree)))
+		(lambda (c)
+		  (if (= c bound)
+		      (left-func c)
+		      (right-func c)))))))
+	 (prepare-dispatch-tree
+	  (lambda (tree)
+	    (cond ((not (pair? tree))
+		   (prepare-dispatch-leaf tree))
+		  ((eq? (car tree) '=)
+		   (prepare-dispatch-= tree))
+		  (else
+		   (prepare-dispatch-< tree)))))
+	 (prepare-dispatch
+	  (lambda (tree)
+	    (let ((dicho-func (prepare-dispatch-tree tree)))
+	      (lambda (c)
+		(and c (dicho-func c))))))
+
+	 ; Fabrique les fonctions de transition (read & go) et (abort)
+	 (prepare-read-n-go
+	  (lambda (tree)
+	    (let ((dispatch-func (prepare-dispatch tree))
+		  (read-char     IS-read-char))
+	      (lambda ()
+		(dispatch-func (read-char))))))
+	 (prepare-abort
+	  (lambda (tree)
+	    (lambda ()
+	      #f)))
+	 (prepare-transition
+	  (lambda (tree)
+	    (if (eq? tree 'err)
+		(prepare-abort     tree)
+		(prepare-read-n-go tree))))
+
+	 ; Fabrique les fonctions d'etats ([set-end] & trans)
+	 (prepare-state-no-acc
+	   (lambda (s r1 r2)
+	     (let ((trans-func (prepare-transition (vector-ref trees-v s))))
+	       (lambda (action)
+		 (let ((next-state (trans-func)))
+		   (if next-state
+		       (next-state action)
+		       action))))))
+	 (prepare-state-yes-no
+	  (lambda (s r1 r2)
+	    (let ((peek-char       IS-peek-char)
+		  (end-go-to-point IS-end-go-to-point)
+		  (new-action1     #f)
+		  (trans-func (prepare-transition (vector-ref trees-v s))))
+	      (let ((result
+		     (lambda (action)
+		       (let* ((c (peek-char))
+			      (new-action
+			       (if (or (not c) (= c lexer-integer-newline))
+				   (begin
+				     (end-go-to-point)
+				     new-action1)
+				   action))
+			      (next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action1 (vector-ref rules-actions r1)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state-diff-acc
+	  (lambda (s r1 r2)
+	    (let ((end-go-to-point IS-end-go-to-point)
+		  (peek-char       IS-peek-char)
+		  (new-action1     #f)
+		  (new-action2     #f)
+		  (trans-func (prepare-transition (vector-ref trees-v s))))
+	      (let ((result
+		     (lambda (action)
+		       (end-go-to-point)
+		       (let* ((c (peek-char))
+			      (new-action
+			       (if (or (not c) (= c lexer-integer-newline))
+				   new-action1
+				   new-action2))
+			      (next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action1 (vector-ref rules-actions r1))
+		       (set! new-action2 (vector-ref rules-actions r2)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state-same-acc
+	  (lambda (s r1 r2)
+	    (let ((end-go-to-point IS-end-go-to-point)
+		  (trans-func (prepare-transition (vector-ref trees-v s)))
+		  (new-action #f))
+	      (let ((result
+		     (lambda (action)
+		       (end-go-to-point)
+		       (let ((next-state (trans-func)))
+			 (if next-state
+			     (next-state new-action)
+			     new-action))))
+		    (hook
+		     (lambda ()
+		       (set! new-action (vector-ref rules-actions r1)))))
+		(add-hook hook)
+		result))))
+	 (prepare-state
+	  (lambda (s)
+	    (let* ((acc (vector-ref acc-v s))
+		   (r1 (car acc))
+		   (r2 (cdr acc)))
+	      (cond ((not r1)  (prepare-state-no-acc   s r1 r2))
+		    ((not r2)  (prepare-state-yes-no   s r1 r2))
+		    ((< r1 r2) (prepare-state-diff-acc s r1 r2))
+		    (else      (prepare-state-same-acc s r1 r2))))))
+
+	 ; Fabrique la fonction de lancement du lexage a l'etat de depart
+	 (prepare-start-same
+	  (lambda (s1 s2)
+	    (let ((peek-char    IS-peek-char)
+		  (eof-action   #f)
+		  (start-state  #f)
+		  (error-action #f))
+	      (let ((result
+		     (lambda ()
+		       (if (not (peek-char))
+			   eof-action
+			   (start-state error-action))))
+		    (hook
+		     (lambda ()
+		       (set! eof-action   <<EOF>>-action)
+		       (set! start-state  (vector-ref states s1))
+		       (set! error-action <<ERROR>>-action))))
+		(add-hook hook)
+		result))))
+	 (prepare-start-diff
+	  (lambda (s1 s2)
+	    (let ((peek-char         IS-peek-char)
+		  (eof-action        #f)
+		  (peek-left-context IS-peek-left-context)
+		  (start-state1      #f)
+		  (start-state2      #f)
+		  (error-action      #f))
+	      (let ((result
+		     (lambda ()
+		       (cond ((not (peek-char))
+			      eof-action)
+			     ((= (peek-left-context) lexer-integer-newline)
+			      (start-state1 error-action))
+			     (else
+			      (start-state2 error-action)))))
+		    (hook
+		     (lambda ()
+		       (set! eof-action <<EOF>>-action)
+		       (set! start-state1 (vector-ref states s1))
+		       (set! start-state2 (vector-ref states s2))
+		       (set! error-action <<ERROR>>-action))))
+		(add-hook hook)
+		result))))
+	 (prepare-start
+	  (lambda ()
+	    (let ((s1 table-nl-start)
+		  (s2 table-no-nl-start))
+	      (if (= s1 s2)
+		  (prepare-start-same s1 s2)
+		  (prepare-start-diff s1 s2)))))
+
+	 ; Fabrique la fonction principale
+	 (prepare-lexer-none
+	  (lambda ()
+	    (let ((init-lexeme IS-init-lexeme)
+		  (start-func  (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		((start-func))))))
+	 (prepare-lexer-line
+	  (lambda ()
+	    (let ((init-lexeme    IS-init-lexeme)
+		  (get-start-line IS-get-start-line)
+		  (start-func     (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		(let ((yyline (get-start-line)))
+		  ((start-func) yyline))))))
+	 (prepare-lexer-all
+	  (lambda ()
+	    (let ((init-lexeme      IS-init-lexeme)
+		  (get-start-line   IS-get-start-line)
+		  (get-start-column IS-get-start-column)
+		  (get-start-offset IS-get-start-offset)
+		  (start-func       (prepare-start)))
+	      (lambda ()
+		(init-lexeme)
+		(let ((yyline   (get-start-line))
+		      (yycolumn (get-start-column))
+		      (yyoffset (get-start-offset)))
+		  ((start-func) yyline yycolumn yyoffset))))))
+	 (prepare-lexer
+	  (lambda ()
+	    (cond ((eq? counters-type 'none) (prepare-lexer-none))
+		  ((eq? counters-type 'line) (prepare-lexer-line))
+		  ((eq? counters-type 'all)  (prepare-lexer-all))))))
+
+      ; Calculer la valeur de <<EOF>>-action et de <<ERROR>>-action
+      (set! <<EOF>>-action   (prepare-special-action <<EOF>>-pre-action))
+      (set! <<ERROR>>-action (prepare-special-action <<ERROR>>-pre-action))
+
+      ; Calculer la valeur de rules-actions
+      (let* ((len (quotient (vector-length rules-pre-actions) 2))
+	     (v (make-vector len)))
+	(let loop ((r (- len 1)))
+	  (if (< r 0)
+	      (set! rules-actions v)
+	      (let* ((yytext? (vector-ref rules-pre-actions (* 2 r)))
+		     (pre-action (vector-ref rules-pre-actions (+ (* 2 r) 1)))
+		     (action (if yytext?
+				 (prepare-action-yytext    pre-action)
+				 (prepare-action-no-yytext pre-action))))
+		(vector-set! v r action)
+		(loop (- r 1))))))
+
+      ; Calculer la valeur de states
+      (let* ((len (vector-length trees-v))
+	     (v (make-vector len)))
+	(let loop ((s (- len 1)))
+	  (if (< s 0)
+	      (set! states v)
+	      (begin
+		(vector-set! v s (prepare-state s))
+		(loop (- s 1))))))
+
+      ; Calculer la valeur de final-lexer
+      (set! final-lexer (prepare-lexer))
+
+      ; Executer les hooks
+      (apply-hooks)
+
+      ; Resultat
+      final-lexer)))
+
+; Fabrication de lexer a partir de listes de caracteres taggees
+(define lexer-make-char-lexer
+  (let* ((char->class
+	  (lambda (c)
+	    (let ((n (char->integer c)))
+	      (list (cons n n)))))
+	 (merge-sort
+	  (lambda (l combine zero-elt)
+	    (if (null? l)
+		zero-elt
+		(let loop1 ((l l))
+		  (if (null? (cdr l))
+		      (car l)
+		      (loop1
+		       (let loop2 ((l l))
+			 (cond ((null? l)
+				l)
+			       ((null? (cdr l))
+				l)
+			       (else
+				(cons (combine (car l) (cadr l))
+				      (loop2 (cddr l))))))))))))
+	 (finite-class-union
+	  (lambda (c1 c2)
+	    (let loop ((c1 c1) (c2 c2) (u '()))
+	      (if (null? c1)
+		  (if (null? c2)
+		      (reverse u)
+		      (loop c1 (cdr c2) (cons (car c2) u)))
+		  (if (null? c2)
+		      (loop (cdr c1) c2 (cons (car c1) u))
+		      (let* ((r1 (car c1))
+			     (r2 (car c2))
+			     (r1start (car r1))
+			     (r1end (cdr r1))
+			     (r2start (car r2))
+			     (r2end (cdr r2)))
+			(if (<= r1start r2start)
+			    (cond ((< (+ r1end 1) r2start)
+				   (loop (cdr c1) c2 (cons r1 u)))
+				  ((<= r1end r2end)
+				   (loop (cdr c1)
+					 (cons (cons r1start r2end) (cdr c2))
+					 u))
+				  (else
+				   (loop c1 (cdr c2) u)))
+			    (cond ((> r1start (+ r2end 1))
+				   (loop c1 (cdr c2) (cons r2 u)))
+				  ((>= r1end r2end)
+				   (loop (cons (cons r2start r1end) (cdr c1))
+					 (cdr c2)
+					 u))
+				  (else
+				   (loop (cdr c1) c2 u))))))))))
+	 (char-list->class
+	  (lambda (cl)
+	    (let ((classes (map char->class cl)))
+	      (merge-sort classes finite-class-union '()))))
+	 (class-<
+	  (lambda (b1 b2)
+	    (cond ((eq? b1 'inf+) #f)
+		  ((eq? b2 'inf-) #f)
+		  ((eq? b1 'inf-) #t)
+		  ((eq? b2 'inf+) #t)
+		  (else (< b1 b2)))))
+	 (finite-class-compl
+	  (lambda (c)
+	    (let loop ((c c) (start 'inf-))
+	      (if (null? c)
+		  (list (cons start 'inf+))
+		  (let* ((r (car c))
+			 (rstart (car r))
+			 (rend (cdr r)))
+		    (if (class-< start rstart)
+			(cons (cons start (- rstart 1))
+			      (loop c rstart))
+			(loop (cdr c) (+ rend 1))))))))
+	 (tagged-chars->class
+	  (lambda (tcl)
+	    (let* ((inverse? (car tcl))
+		   (cl (cdr tcl))
+		   (class-tmp (char-list->class cl)))
+	      (if inverse? (finite-class-compl class-tmp) class-tmp))))
+	 (charc->arc
+	  (lambda (charc)
+	    (let* ((tcl (car charc))
+		   (dest (cdr charc))
+		   (class (tagged-chars->class tcl)))
+	      (cons class dest))))
+	 (arc->sharcs
+	  (lambda (arc)
+	    (let* ((range-l (car arc))
+		   (dest (cdr arc))
+		   (op (lambda (range) (cons range dest))))
+	      (map op range-l))))
+	 (class-<=
+	  (lambda (b1 b2)
+	    (cond ((eq? b1 'inf-) #t)
+		  ((eq? b2 'inf+) #t)
+		  ((eq? b1 'inf+) #f)
+		  ((eq? b2 'inf-) #f)
+		  (else (<= b1 b2)))))
+	 (sharc-<=
+	  (lambda (sharc1 sharc2)
+	    (class-<= (caar sharc1) (caar sharc2))))
+	 (merge-sharcs
+	  (lambda (l1 l2)
+	    (let loop ((l1 l1) (l2 l2))
+	      (cond ((null? l1)
+		     l2)
+		    ((null? l2)
+		     l1)
+		    (else
+		     (let ((sharc1 (car l1))
+			   (sharc2 (car l2)))
+		       (if (sharc-<= sharc1 sharc2)
+			   (cons sharc1 (loop (cdr l1) l2))
+			   (cons sharc2 (loop l1 (cdr l2))))))))))
+	 (class-= eqv?)
+	 (fill-error
+	  (lambda (sharcs)
+	    (let loop ((sharcs sharcs) (start 'inf-))
+	      (cond ((class-= start 'inf+)
+		     '())
+		    ((null? sharcs)
+		     (cons (cons (cons start 'inf+) 'err)
+			   (loop sharcs 'inf+)))
+		    (else
+		     (let* ((sharc (car sharcs))
+			    (h (caar sharc))
+			    (t (cdar sharc)))
+		       (if (class-< start h)
+			   (cons (cons (cons start (- h 1)) 'err)
+				 (loop sharcs h))
+			   (cons sharc (loop (cdr sharcs)
+					     (if (class-= t 'inf+)
+						 'inf+
+						 (+ t 1)))))))))))
+	 (charcs->tree
+	  (lambda (charcs)
+	    (let* ((op (lambda (charc) (arc->sharcs (charc->arc charc))))
+		   (sharcs-l (map op charcs))
+		   (sorted-sharcs (merge-sort sharcs-l merge-sharcs '()))
+		   (full-sharcs (fill-error sorted-sharcs))
+		   (op (lambda (sharc) (cons (caar sharc) (cdr sharc))))
+		   (table (list->vector (map op full-sharcs))))
+	      (let loop ((left 0) (right (- (vector-length table) 1)))
+		(if (= left right)
+		    (cdr (vector-ref table left))
+		    (let ((mid (quotient (+ left right 1) 2)))
+		      (if (and (= (+ left 2) right)
+			       (= (+ (car (vector-ref table mid)) 1)
+				  (car (vector-ref table right)))
+			       (eqv? (cdr (vector-ref table left))
+				     (cdr (vector-ref table right))))
+			  (list '=
+				(car (vector-ref table mid))
+				(cdr (vector-ref table mid))
+				(cdr (vector-ref table left)))
+			  (list (car (vector-ref table mid))
+				(loop left (- mid 1))
+				(loop mid right))))))))))
+    (lambda (tables IS)
+      (let ((counters         (vector-ref tables 0))
+	    (<<EOF>>-action   (vector-ref tables 1))
+	    (<<ERROR>>-action (vector-ref tables 2))
+	    (rules-actions    (vector-ref tables 3))
+	    (nl-start         (vector-ref tables 5))
+	    (no-nl-start      (vector-ref tables 6))
+	    (charcs-v         (vector-ref tables 7))
+	    (acc-v            (vector-ref tables 8)))
+	(let* ((len (vector-length charcs-v))
+	       (v (make-vector len)))
+	  (let loop ((i (- len 1)))
+	    (if (>= i 0)
+		(begin
+		  (vector-set! v i (charcs->tree (vector-ref charcs-v i)))
+		  (loop (- i 1)))
+		(lexer-make-tree-lexer
+		 (vector counters
+			 <<EOF>>-action
+			 <<ERROR>>-action
+			 rules-actions
+			 'decision-trees
+			 nl-start
+			 no-nl-start
+			 v
+			 acc-v)
+		 IS))))))))
+
+; Fabrication d'un lexer a partir de code pre-genere
+(define lexer-make-code-lexer
+  (lambda (tables IS)
+    (let ((<<EOF>>-pre-action   (vector-ref tables 1))
+	  (<<ERROR>>-pre-action (vector-ref tables 2))
+	  (rules-pre-action     (vector-ref tables 3))
+	  (code                 (vector-ref tables 5)))
+      (code <<EOF>>-pre-action <<ERROR>>-pre-action rules-pre-action IS))))
+
+(define lexer-make-lexer
+  (lambda (tables IS)
+    (let ((automaton-type (vector-ref tables 4)))
+      (cond ((eq? automaton-type 'decision-trees)
+	     (lexer-make-tree-lexer tables IS))
+	    ((eq? automaton-type 'tagged-chars-lists)
+	     (lexer-make-char-lexer tables IS))
+	    ((eq? automaton-type 'code)
+	     (lexer-make-code-lexer tables IS))))))
+" port)))
+
+; Module main.scm.
+; Copyright (C) 1997 Danny Dube', Universite' de Montre'al.
+; All rights reserved.
+; SILex 1.0.
+
+;
+; Gestion d'erreurs
+;
+
+(define lex-exit-continuation #f)
+(define lex-unwind-protect-list '())
+(define lex-error-filename #f)
+
+(define lex-unwind-protect
+  (lambda (proc)
+    (set! lex-unwind-protect-list (cons proc lex-unwind-protect-list))))
+
+(define lex-error
+  (lambda (line column . l)
+    (let* ((linestr (if line   (number->string line)   #f))
+	   (colstr  (if column (number->string column) #f))
+	   (namelen (string-length lex-error-filename))
+	   (linelen (if line   (string-length linestr) -1))
+	   (collen  (if column (string-length colstr)  -1))
+	   (totallen (+ namelen 1 linelen 1 collen 2)))
+      (display "Lex error:")
+      (newline)
+      (display lex-error-filename)
+      (if line
+	  (begin
+	    (display ":")
+	    (display linestr)))
+      (if column
+	  (begin
+	    (display ":")
+	    (display colstr)))
+      (display ": ")
+      (let loop ((l l))
+	(if (null? l)
+	    (newline)
+	    (let ((item (car l)))
+	      (display item)
+	      (if (equal? '#\newline item)
+		  (let loop2 ((i totallen))
+		    (if (> i 0)
+			(begin
+			  (display #\space)
+			  (loop2 (- i 1))))))
+	      (loop (cdr l)))))
+      (newline)
+      (let loop ((l lex-unwind-protect-list))
+	(if (pair? l)
+	    (begin
+	      ((car l))
+	      (loop (cdr l)))))
+      (lex-exit-continuation #f))))
+
+
+
+
+;
+; Decoupage des arguments
+;
+
+(define lex-recognized-args
+  '(complete-driver?
+    filein
+    table-name
+    fileout
+    counters
+    portable
+    code
+    pp))
+
+(define lex-valued-args
+  '(complete-driver?
+    filein
+    table-name
+    fileout
+    counters))
+
+(define lex-parse-args
+  (lambda (args)
+    (let loop ((args args))
+      (if (null? args)
+	  '()
+	  (let ((sym (car args)))
+	    (cond ((not (symbol? sym))
+		   (lex-error #f #f "bad option list."))
+		  ((not (memq sym lex-recognized-args))
+		   (lex-error #f #f "unrecognized option \"" sym "\"."))
+		  ((not (memq sym lex-valued-args))
+		   (cons (cons sym '()) (loop (cdr args))))
+		  ((null? (cdr args))
+		   (lex-error #f #f "the value of \"" sym "\" not specified."))
+		  (else
+		   (cons (cons sym (cadr args)) (loop (cddr args))))))))))
+
+
+
+
+;
+; Differentes etapes de la fabrication de l'automate
+;
+
+(define lex1
+  (lambda (filein)
+;     (display "lex1: ") (write (get-internal-run-time)) (newline)
+    (parser filein)))
+
+(define lex2
+  (lambda (filein)
+    (let* ((result (lex1 filein))
+	   (<<EOF>>-action (car result))
+	   (<<ERROR>>-action (cadr result))
+	   (rules (cddr result)))
+;       (display "lex2: ") (write (get-internal-run-time)) (newline)
+      (append (list <<EOF>>-action <<ERROR>>-action rules)
+	      (re2nfa rules)))))
+
+(define lex3
+  (lambda (filein)
+    (let* ((result (lex2 filein))
+	   (<<EOF>>-action   (list-ref result 0))
+	   (<<ERROR>>-action (list-ref result 1))
+	   (rules            (list-ref result 2))
+	   (nl-start         (list-ref result 3))
+	   (no-nl-start      (list-ref result 4))
+	   (arcs             (list-ref result 5))
+	   (acc              (list-ref result 6)))
+;       (display "lex3: ") (write (get-internal-run-time)) (newline)
+      (append (list <<EOF>>-action <<ERROR>>-action rules)
+	      (noeps nl-start no-nl-start arcs acc)))))
+
+(define lex4
+  (lambda (filein)
+    (let* ((result (lex3 filein))
+	   (<<EOF>>-action   (list-ref result 0))
+	   (<<ERROR>>-action (list-ref result 1))
+	   (rules            (list-ref result 2))
+	   (nl-start         (list-ref result 3))
+	   (no-nl-start      (list-ref result 4))
+	   (arcs             (list-ref result 5))
+	   (acc              (list-ref result 6)))
+;       (display "lex4: ") (write (get-internal-run-time)) (newline)
+      (append (list <<EOF>>-action <<ERROR>>-action rules)
+	      (sweep nl-start no-nl-start arcs acc)))))
+
+(define lex5
+  (lambda (filein)
+    (let* ((result (lex4 filein))
+	   (<<EOF>>-action   (list-ref result 0))
+	   (<<ERROR>>-action (list-ref result 1))
+	   (rules            (list-ref result 2))
+	   (nl-start         (list-ref result 3))
+	   (no-nl-start      (list-ref result 4))
+	   (arcs             (list-ref result 5))
+	   (acc              (list-ref result 6)))
+;       (display "lex5: ") (write (get-internal-run-time)) (newline)
+      (append (list <<EOF>>-action <<ERROR>>-action rules)
+	      (nfa2dfa nl-start no-nl-start arcs acc)))))
+
+(define lex6
+  (lambda (args-alist)
+    (let* ((filein           (cdr (assq 'filein args-alist)))
+	   (result           (lex5 filein))
+	   (<<EOF>>-action   (list-ref result 0))
+	   (<<ERROR>>-action (list-ref result 1))
+	   (rules            (list-ref result 2))
+	   (nl-start         (list-ref result 3))
+	   (no-nl-start      (list-ref result 4))
+	   (arcs             (list-ref result 5))
+	   (acc              (list-ref result 6)))
+;       (display "lex6: ") (write (get-internal-run-time)) (newline)
+      (prep-set-rules-yytext? rules)
+      (output args-alist
+	      <<EOF>>-action <<ERROR>>-action
+	      rules nl-start no-nl-start arcs acc)
+      #t)))
+
+(define lex7
+  (lambda (args)
+    (call-with-current-continuation
+     (lambda (exit)
+       (set! lex-exit-continuation exit)
+       (set! lex-unwind-protect-list '())
+       (set! lex-error-filename (cadr (memq 'filein args)))
+       (let* ((args-alist (lex-parse-args args))
+	      (result (lex6 args-alist)))
+; 	 (display "lex7: ") (write (get-internal-run-time)) (newline)
+	 result)))))
+
+
+
+
+;
+; Fonctions principales
+;
+
+(define lex
+  (lambda (filein fileout . options)
+    (lex7 (append (list 'complete-driver? #t
+			'filein filein
+			'table-name "lexer-default-table"
+			'fileout fileout)
+		  options))))
+
+(define lex-tables
+  (lambda (filein table-name fileout . options)
+    (lex7 (append (list 'complete-driver? #f
+			'filein filein
+			'table-name table-name
+			'fileout fileout)
+		  options))))
+
+)
Trap