~ chicken-core (chicken-5) 4656323ef76ad9b2c1097c80f5d4226dae1c0ec7


commit 4656323ef76ad9b2c1097c80f5d4226dae1c0ec7
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Mar 14 14:27:36 2011 +0100
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Mar 14 14:27:36 2011 +0100

    qq simplification

diff --git a/distribution/manifest b/distribution/manifest
index abdc28fe..181792be 100644
--- a/distribution/manifest
+++ b/distribution/manifest
@@ -97,6 +97,7 @@ support.scm
 tcp.scm
 tests/thread-list.scm
 tests/gobble.scm
+tests/trav2.scm
 tests/test-optional.scm
 tests/arithmetic-test.scm
 tests/arithmetic-test.32.expected
diff --git a/expand.scm b/expand.scm
index 8efd4460..27d3f0dd 100644
--- a/expand.scm
+++ b/expand.scm
@@ -1406,17 +1406,17 @@
 		       (else
 			`(##sys#cons ,(walk head n) ,(walk tail n)) ) ) ) ) ) )
       (define (simplify x)
-	(cond ((match-expression x '(##sys#cons a '()) '(a))
-	       => (lambda (env) (simplify `(##sys#list ,(##sys#slot (assq 'a env) 1)))) )
+	(cond ((match-expression x '(##sys#cons a (##core#quote ())) '(a))
+	       => (lambda (env) (simplify `(##sys#list ,(cdr (assq 'a env))))) )
 	      ((match-expression x '(##sys#cons a (##sys#list . b)) '(a b))
 	       => (lambda (env)
-		    (let ([bxs (assq 'b env)])
+		    (let ((bxs (assq 'b env)))
 		      (if (fx< (length bxs) 32)
-			  (simplify `(##sys#list ,(##sys#slot (assq 'a env) 1)
+			  (simplify `(##sys#list ,(cdr (assq 'a env))
 						 ,@(cdr bxs) ) ) 
 			  x) ) ) )
-	      ((match-expression x '(##sys#append a '()) '(a))
-	       => (lambda (env) (##sys#slot (assq 'a env) 1)) )
+	      ((match-expression x '(##sys#append a (##core#quote ())) '(a))
+	       => (lambda (env) (cdr (assq 'a env))) )
 	      (else x) ) )
       (##sys#check-syntax 'quasiquote form '(_ _))
       (walk (cadr form) 0) ) ) ) )
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 4f6677d4..c8827f5e 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -43,6 +43,8 @@ compile="../csc -compiler $CHICKEN -v -I.. -L.. -include-path .. -o a.out"
 compile_s="../csc -s -compiler $CHICKEN -v -I.. -L.. -include-path .."
 interpret="../csi -n -include-path .."
 
+rm -f *.exe *.so *.o *.import.* a.out
+
 echo "======================================== compiler tests ..."
 $compile compiler-tests.scm
 ./a.out
@@ -125,6 +127,8 @@ $compile syntax-tests.scm
 echo "======================================== syntax tests (2, compiled) ..."
 $compile syntax-tests-2.scm
 ./a.out
+$compile trav2.scm
+./a.out
 
 echo "======================================== meta-syntax tests ..."
 $interpret -bnq meta-syntax-test.scm -e '(import foo)' -e "(assert (equal? '((1)) (bar 1 2)))" -e "(assert (equal? '(list 1 2 3) (listify)))"
diff --git a/tests/trav2.scm b/tests/trav2.scm
new file mode 100644
index 00000000..f3e309f8
--- /dev/null
+++ b/tests/trav2.scm
@@ -0,0 +1,145 @@
+;;; TRAV2 --  Benchmark which creates and traverses a tree structure.
+ 
+(define (make-node)
+  (vector 'node '() '() (snb) #f #f #f #f #f #f #f))
+
+(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))
+        ((= n 0)
+         (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)))
+               ((= n 0) (let ((x (car q))) (set-cdr! q p) x))))))
+ 
+(define (traverse-select n q)
+  (do ((n n (- n 1))
+       (q (car q) (cdr q)))
+      ((= n 0) (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 
+	 ;; this caused an endless loop in ##sys#append, due to a failing
+	 ;; quasiquote-expansion simplification:
+	 (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))
+        ((= m 0)
+         (set! a `(,(begin (set-cdr! p a) p)))
+         (do ((unused a)
+              (used (add (traverse-remove 0 a) '()))
+              (x '())
+              (y '()))
+             ((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 (= n 0) (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)))
+      ((= i 0))
+    (traverse *root*)
+    (traverse *root*)
+    (traverse *root*)
+    (traverse *root*)
+    (traverse *root*)))
+
+;;; to initialize, call:  (init-traverse)
+;;; to run traverse, call:  (run-traverse)
+
+(print "init ...")
+(init-traverse)
+(print "run ...")
+(run-traverse)
Trap