~ chicken-core (chicken-5) f7d4cb8c2a18ec71ef3ef7d8eed2907499899175


commit f7d4cb8c2a18ec71ef3ef7d8eed2907499899175
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sun Jan 25 22:39:20 2015 +0100
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sun Jan 25 22:39:20 2015 +0100

    Converted all core modules

diff --git a/c-backend.scm b/c-backend.scm
index ccfca618..16a3c315 100644
--- a/c-backend.scm
+++ b/c-backend.scm
@@ -30,7 +30,7 @@
 ;; Same goes for "platform" and "driver".
 (declare
   (unit c-backend)
-  (uses srfi-1 data-structures
+  (uses data-structures
 	c-platform compiler support))
 
 (module chicken.compiler.c-backend
@@ -38,11 +38,13 @@
      ;; For "foreign" (aka chicken-ffi-syntax):
      foreign-type-declaration)
 
-(import chicken scheme foreign srfi-1 data-structures
+(import chicken scheme foreign data-structures
 	chicken.compiler.core
 	chicken.compiler.c-platform
 	chicken.compiler.support)
 
+(include "mini-srfi-1.scm")
+
 ;;; Write atoms to output-port:
 
 (define output #f)
@@ -551,12 +553,12 @@
 		  [direct (lambda-literal-direct ll)] 
 		  [allocated (lambda-literal-allocated ll)] )
 	     (when (>= n small-parameter-limit)
-	       (set! large-signatures (lset-adjoin = large-signatures (add1 n))) )
+	       (set! large-signatures (lset-adjoin large-signatures (add1 n))) )
 	     (gen #t)
 	     (for-each
 	      (lambda (s) 
 		(when (>= s small-parameter-limit)
-		  (set! large-signatures (lset-adjoin = large-signatures (add1 s))) ) )
+		  (set! large-signatures (lset-adjoin large-signatures (add1 s))) ) )
 	      (lambda-literal-callee-signatures ll) )
 	     (cond [(not (eq? 'toplevel id))
 		    (gen "C_noret_decl(" id ")" #t)
@@ -652,8 +654,8 @@
 		      (gen ");}") ]
 		     [(or rest (> (lambda-literal-allocated ll) 0) (lambda-literal-external ll))
 		      (if (and rest (not (eq? rest-mode 'none)))
-			  (set! nsr (lset-adjoin = nsr argc)) 
-			  (set! ns (lset-adjoin = ns argc)) ) ] ) ) ) )
+			  (set! nsr (lset-adjoin nsr argc)) 
+			  (set! ns (lset-adjoin ns argc)) ) ] ) ) ) )
 	 lambda-table)
 	(for-each
 	 (lambda (n)
@@ -683,7 +685,7 @@
 	    [(number? lit) words-per-flonum]
 	    [(symbol? lit) 10]		; size of symbol, and possibly a bucket
 	    [(pair? lit) (+ 3 (literal-size (car lit)) (literal-size (cdr lit)))]
-	    [(vector? lit) (+ 1 (vector-length lit) (reduce + 0 (map literal-size (vector->list lit))))]
+	    [(vector? lit) (+ 1 (vector-length lit) (foldl + 0 (map literal-size (vector->list lit))))]
 	    [(block-variable-literal? lit) 0]
 	    [(##sys#immediate? lit) (bad-literal lit)]
 	    [(##core#inline "C_lambdainfop" lit) 0]
@@ -814,7 +816,7 @@
 		    (gen #t (utype (cdr ubt)) #\space (car ubt) #\;))
 		  ubtemps)))
 	   (cond [(eq? 'toplevel id) 
-		  (let ([ldemand (fold (lambda (lit n) (+ n (literal-size lit))) 0 literals)]
+		  (let ([ldemand (foldl (lambda (n lit) (+ n (literal-size lit))) 0 literals)]
 			[llen (length literals)] )
 		    (gen #t "C_word *a;"
 			 #t "if(toplevel_initialized) C_kontinue(t1,C_SCHEME_UNDEFINED);"
@@ -1116,7 +1118,11 @@
 		     (else ns) ) )
 		  (else ns) ) ) ) )
 
-       (let ((sizestr (fold compute-size "0" argtypes vlist)))
+       (let ((sizestr (let loop ((types argtypes) (vars vlist) (ns "0"))
+			(if (null? types)
+			    ns
+			    (loop (cdr types) (cdr vars) 
+				  (compute-size (car types) (car vars) ns))))))
 	 (gen #t)
 	 (when rname
 	   (gen #t "/* from " (cleanup rname) " */") )
@@ -1145,11 +1151,10 @@
 	 (n (length argtypes))
 	 (vlist (make-argument-list n "t")) )
     (gen #t cls #\space (foreign-type-declaration rtype "") quals #\space name #\()
-    (pair-for-each
-     (lambda (vs ts)
-       (gen (foreign-type-declaration (car ts) (car vs)))
-       (when (pair? (cdr vs)) (gen #\,)) )
-     vlist argtypes)
+    (let loop ((vs vlist) (ts argtypes))
+      (unless (null? vs)
+	(gen (foreign-type-declaration (car ts) (car vs)))
+	(when (pair? (cdr vs)) (gen #\,)) ))
     (gen #\)) ) )
 
 
diff --git a/chicken-install.scm b/chicken-install.scm
index 5b5140d6..22a59e93 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -25,16 +25,18 @@
 
 
 (require-library setup-download setup-api)
-(require-library srfi-1 posix data-structures utils irregex ports extras files)
+(require-library posix data-structures utils irregex ports extras files)
 
 (module main ()
 
-  (import scheme chicken srfi-1 posix data-structures utils irregex ports extras
+  (import scheme chicken posix data-structures utils irregex ports extras
           files)
   (import setup-download setup-api)
 
   (import foreign)
 
+  (include "mini-srfi-1.scm")
+
   (define +default-repository-files+
     ;;XXX keep this up-to-date!
     '("setup-api.so" "setup-api.import.so"
@@ -566,8 +568,8 @@
   (define (install eggs)
     (when *keep-existing*
       (set! eggs
-	(remove 
-	 (lambda (egg) (extension-information (if (pair? egg) (car egg) egg)))
+	(filter
+	 (lambda (egg) (not (extension-information (if (pair? egg) (car egg) egg))))
 	 eggs)))
     (retrieve eggs)
     (unless *retrieve-only*
@@ -650,7 +652,10 @@
 		   (fluid-let ((*host-extension* #f))
 		     (setup tmpcopy)))))))
 	 eggs+dirs+vers
-	 (iota num num -1)))))
+	 (let loop ((i num))
+	   (if (fx= 1 i)
+	       '()
+	       (cons num (loop (fx- i 1)))))))))
 
   (define (delete-stale-binaries)
     (print* "deleting stale binaries ...")
@@ -722,7 +727,8 @@
 		     (else (list egg))))
 	     eggs)
 	    same?)))
-      (unless (lset= same? eggs eggs2)
+      (unless (and (= (length eggs) (length eggs2))
+		   (every (lambda (egg) (find (cut same=? <> egg) eggs2)) eggs))
 	(print "mapped " eggs " to " eggs2))
       eggs2))
 
diff --git a/chicken-profile.scm b/chicken-profile.scm
index e845e68b..fddfef7a 100644
--- a/chicken-profile.scm
+++ b/chicken-profile.scm
@@ -27,11 +27,12 @@
 
 (declare
   (block)
-  (uses srfi-1
-	data-structures
+  (uses data-structures
 	posix
 	utils))
 
+(include "mini-srfi-1.scm")
+
 (define symbol-table-size 3001)
 
 (define sort-by #f)
@@ -228,15 +229,15 @@ EOF
 	   [alignments (list #f #t #t #t #t)]
 	   [spacing 2]
 	   [spacer (make-string spacing #\space)]
-	   [column-widths (fold
-			   (lambda (row max-widths)
+	   [column-widths (foldl
+			   (lambda (max-widths row)
 			     (map max (map string-length row) max-widths))
 			   (list 0 0 0 0 0)
 			   (cons headers data))])
       (define (print-row row)
 	(print (string-intersperse (map format-string row column-widths alignments) spacer)))
       (print-row headers)
-      (print (make-string (+ (reduce + 0 column-widths)
+      (print (make-string (+ (foldl + 0 column-widths)
 			     (* spacing (- (length alignments) 1)))
 			  #\-))
       (for-each print-row data))))
diff --git a/mini-srfi-1.scm b/mini-srfi-1.scm
index e50c2072..4534ebf7 100644
--- a/mini-srfi-1.scm
+++ b/mini-srfi-1.scm
@@ -95,10 +95,10 @@
 	'()
 	(append (car lst) (loop (cdr lst))))))
 
-(define (delete x lst)
+(define (delete x lst #!optional (test eq?))
   (let loop ((lst lst))
     (cond ((null? lst) lst)
-	  ((eq? x (car lst)) (cdr lst))
+	  ((test x (car lst)) (cdr lst))
 	  (else (cons (car lst) (loop (cdr lst)))) ) ) )
 
 (define (first x) (car x))
@@ -107,13 +107,13 @@
 (define (fourth x) (cadddr x))
 (define (fifth x) (car (cddddr x)))
 
-(define (delete-duplicates lst)
+(define (delete-duplicates lst #!optional (test equal?))
   (let loop ((lst lst))
     (if (null? lst)
 	lst
 	(let* ((x (car lst))
 	       (tail (cdr lst))
-	       (new-tail (loop (delete/eq? x tail))))
+	       (new-tail (loop (delete x tail test))))
 	  (if (equal? tail new-tail) 
 	      lst
 	      (cons x new-tail))))))
@@ -182,7 +182,7 @@
 (define (lset<= s1 s2)
   (every (lambda (s) (memq s s2)) s1))
 
-(define (lset= s1 s2)
+(define (lset= s1 s2)+
   (and (eq? (length s1) (length s2))
        (every (lambda (s) (memq s s2)) s1)))
 
diff --git a/rules.make b/rules.make
index c99f7ce6..cdc215c3 100644
--- a/rules.make
+++ b/rules.make
@@ -516,7 +516,7 @@ c-platform.c: c-platform.scm mini-srfi-1.scm \
 		chicken.compiler.optimizer.import.scm \
 		chicken.compiler.support.import.scm \
 		chicken.compiler.core.import.scm
-c-backend.c: c-backend.scm \
+c-backend.c: c-backend.scm mini-srfi-1.scm \
 		chicken.compiler.c-platform.import.scm \
 		chicken.compiler.support.import.scm \
 		chicken.compiler.core.import.scm
@@ -531,6 +531,7 @@ lfa2.c: lfa2.scm chicken.compiler.support.import.scm mini-srfi-1.scm
 compiler-syntax.c: compiler-syntax.scm mini-srfi-1.scm \
 		chicken.compiler.support.import.scm \
 		chicken.compiler.core.import.scm
+support.c: support.scm mini-srfi-1.scm
 
 define profile-flags
 $(if $(filter $(basename $(1)),$(PROFILE_OBJECTS)),-profile)
@@ -606,9 +607,9 @@ $(foreach obj, $(COMPILER_OBJECTS_1),\
 
 csi.c: $(SRCDIR)csi.scm $(SRCDIR)banner.scm
 	$(CHICKEN) $< $(CHICKEN_PROGRAM_OPTIONS) -output-file $@
-chicken-profile.c: $(SRCDIR)chicken-profile.scm
+chicken-profile.c: $(SRCDIR)chicken-profile.scm $(SRCDIR)mini-srfi-1.scm
 	$(CHICKEN) $< $(CHICKEN_PROGRAM_OPTIONS) -output-file $@ 
-chicken-install.c: $(SRCDIR)chicken-install.scm setup-download.c setup-api.c
+chicken-install.c: $(SRCDIR)chicken-install.scm setup-download.c setup-api.c $(SRCDIR)mini-srfi-1.scm
 	$(CHICKEN) $< $(CHICKEN_PROGRAM_OPTIONS) -output-file $@ 
 chicken-uninstall.c: $(SRCDIR)chicken-uninstall.scm $(SRCDIR)mini-srfi-1.scm
 	$(CHICKEN) $< $(CHICKEN_PROGRAM_OPTIONS) -output-file $@ 
diff --git a/support.scm b/support.scm
index ca0f3538..13b15e0a 100644
--- a/support.scm
+++ b/support.scm
@@ -27,7 +27,7 @@
 
 (declare (unit support)
 	 (not inline ##sys#user-read-hook) ; XXX: Is this needed?
-	 (uses data-structures srfi-1 files extras ports) )
+	 (uses data-structures files extras ports) )
 
 (module chicken.compiler.support
     (compiler-cleanup-hook bomb collected-debugging-output debugging
@@ -75,9 +75,10 @@
      ;; in a lot of other places.
      number-type unsafe)
 
-(import chicken scheme foreign data-structures srfi-1 files extras ports)
+(import chicken scheme foreign data-structures files extras ports)
 
 (include "tweaks")
+(include "mini-srfi-1.scm")
 (include "banner")
 
 ;; Evil globals
@@ -136,7 +137,7 @@
   (define (test-mode mode set)
     (if (symbol? mode)
 	(memq mode set)
-	(pair? (lset-intersection eq? mode set))))
+	(pair? (lset-intersection mode set))))
   (cond ((test-mode mode debugging-chicken)
 	 (let ((txt (with-output-to-string thunk)))
 	   (display txt)
@@ -359,9 +360,14 @@
 			  (if (exn? ex) 
 			      (exn-msg ex)
 			      (->string ex) ) ) 
-	(let ([xs (with-input-from-string
+	(let ((xs (with-input-from-string
 		      str
-		    (lambda () (unfold eof-object? values (lambda (x) (read)) (read))))])
+		    (lambda ()
+		      (let loop ((lst '()))
+			(let ((x (read)))
+			  (if (eof-object? x)
+			      (apply values (reverse lst))
+			      (loop (cons x lst)))))))))
 	  (cond [(null? xs) '(##core#undefined)]
 		[(null? (cdr xs)) (car xs)]
 		[else `(begin ,@xs)] ) ) ) ) ) )
@@ -490,7 +496,7 @@
     (define (walk x)
       (cond ((symbol? x) (varnode x))
 	    ((node? x) x)
-	    ((not-pair? x) (bomb "bad expression" x))
+	    ((not (pair? x)) (bomb "bad expression" x))
 	    ((symbol? (car x))
 	     (case (car x)
 	       ((if ##core#undefined) (make-node (car x) '() (map walk (cdr x))))
@@ -559,7 +565,7 @@
 		  (make-node
 		   '##core#foreign-callback-wrapper
 		   (list name (cadr (third x)) (cadr (fourth x)) (cadr (fifth x)))
-		   (list (walk (sixth x))) ) ) )
+		   (list (walk (list-ref x 5))) ) ) )
 	       ((##core#inline_allocate ##core#inline_ref ##core#inline_update
 					##core#inline_loc_ref ##core#inline_loc_update)
 		(make-node (first x) (second x) (map walk (cddr x))) )
@@ -657,21 +663,23 @@
 	      [body (if copy? 
 			(copy-node-tree-and-rename body vars rlist db cfk)
 			body) ] )
-	 (fold-right
-	  (lambda (var val body) (make-node 'let (list var) (list val body)) )
-	  (if rest
-	      (make-node
-	       'let (list (last rlist))
-	       (list (if (null? rargs)
-			 (qnode '())
-			 (make-node
-			  '##core#inline_allocate
-			  (list "C_a_i_list" (* 3 (length rargs))) 
-			  rargs) )
-		     body) )
-	      body)
-	  (take rlist argc)
-	  largs) ) ) ) ) )
+	 (let loop ((vars (take rlist argc))
+		    (vals largs))
+	   (if (null? vars)
+	       (if rest
+		   (make-node
+		    'let (list (last rlist))
+		    (list (if (null? rargs)
+			      (qnode '())
+			      (make-node
+			       '##core#inline_allocate
+			       (list "C_a_i_list" (* 3 (length rargs))) 
+			       rargs) )
+			  body) )
+		   body)
+	       (make-node 'let (list (car vars))
+			  (list (car vals))
+			  (loop (cdr vars) (cdr vals))))))))))
 
 ;; Copy along with the above
 (define (copy-node-tree-and-rename node vars aliases db cfk)
@@ -1299,12 +1307,12 @@
 	  ((##core#variable) 
 	   (let ((var (first params)))
 	     (unless (memq var e)
-	       (set! vars (lset-adjoin eq? vars var))
+	       (set! vars (lset-adjoin vars var))
 	       (unless (variable-visible? var block-compilation) 
-		 (set! hvars (lset-adjoin eq? hvars var))))))
+		 (set! hvars (lset-adjoin hvars var))))))
 	  ((set!)
 	   (let ((var (first params)))
-	     (unless (memq var e) (set! vars (lset-adjoin eq? vars var)))
+	     (unless (memq var e) (set! vars (lset-adjoin vars var)))
 	     (walk (car subs) e) ) )
 	  ((let) 
 	   (walk (first subs) e)
Trap