Use `values\' and `call-with-values\'.
authorKeisuke Nishida <kxn30@po.cwru.edu>
Fri, 6 Oct 2000 00:39:44 +0000 (00:39 +0000)
committerKeisuke Nishida <kxn30@po.cwru.edu>
Fri, 6 Oct 2000 00:39:44 +0000 (00:39 +0000)
vm/compile.scm

index 9baf2a4..cc7bc07 100644 (file)
   (make-code:constant env (car args)))
 
 (define (canon-formals formals)
-  ;; foo             -> (() . foo)
-  ;; (foo bar baz)   -> ((foo bar baz) . #f)
-  ;; (foo bar . baz) -> ((foo bar) . baz)
+  ;; foo             -> (), foo
+  ;; (foo bar baz)   -> (foo bar baz), #f
+  ;; (foo bar . baz) -> (foo bar), baz
   (cond ((symbol? formals)
-        (cons '() formals))
+        (values '() formals))
        ((or (null? formals)
             (null? (cdr (last-pair formals))))
-        (cons formals #f))
+        (values formals #f))
        (else
         (let* ((copy (list-copy formals))
                (pair (last-pair copy))
                (last (cdr pair)))
           (set-cdr! pair '())
-          (cons copy last)))))
+          (values copy last)))))
 
 (define (parse-lambda args env)
   (let ((formals (car args)) (body (cdr args)))
-    (let* ((pair (canon-formals formals))
-          (reqs (car pair))
-          (rest (cdr pair))
-          (syms (append reqs (if rest (list rest) '())))
-          (new-env (make-env syms env)))
-      (make-code:program env (length reqs) (if rest #t #f)
-                        (parse-begin body new-env)))))
+    (call-with-values (lambda () (canon-formals formals))
+      (lambda (reqs rest)
+       (let* ((syms (append reqs (if rest (list rest) '())))
+              (new-env (make-env syms env)))
+         (make-code:program env (length reqs) (if rest #t #f)
+                            (parse-begin body new-env)))))))
 
 (define (parse-set! args env)
   (let ((var (env-ref env (car args)))