Avoid cons* in base.
authorJan Nieuwenhuizen <janneke@gnu.org>
Tue, 18 Oct 2016 06:24:47 +0000 (08:24 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Tue, 18 Oct 2016 06:24:47 +0000 (08:24 +0200)
* module/mes/base-0.mes (cond, simple-let, let): Rewrite without cons*.
* module/mes/base.mes (or): Likewise.

module/mes/base-0.mes
module/mes/base.mes

index 492e2effa7483e23cab8de124a29465c909ba986..e34b9693bc13279a3a49ebf58830a758eee68a59 100644 (file)
         (cons (car rest) (loop (cdr rest)))))
   (loop (cons x rest)))
 
-(define-macro cond
-  (lambda clauses
-    (if (null? clauses) *unspecified*
+(define-macro (cond . clauses)
+  (list 'if (null? clauses) *unspecified*
         (if (null? (cdr clauses))
-            (list 'if (car (car clauses))
-                  (cons* 'begin (car (car clauses)) (cdr (car clauses)))
-                  *unspecified*)
-            (if (eq? (car (cadr clauses)) 'else)
-                (list 'if (car (car clauses))
-                      (cons* 'begin (car (car clauses)) (cdr (car clauses)))
-                      (cons* 'begin *unspecified* (cdr (cadr clauses))))
-                (list 'if (car (car clauses))
-                      (cons* 'begin (car (car clauses)) (cdr (car clauses)))
-                      (cons* 'cond (cdr clauses))))))))
+           (list 'if (car (car clauses))
+                 (list (cons 'lambda (cons '() (cons (car (car clauses)) (cdr (car clauses))))))
+                 *unspecified*)
+           (if (eq? (car (cadr clauses)) 'else)
+               (list 'if (car (car clauses))
+                   (list (cons 'lambda (cons '() (car clauses))))
+                   (list (cons 'lambda (cons '() (cons *unspecified* (cdr (cadr clauses)))))))
+               (list 'if (car (car clauses))
+                   (list (cons 'lambda (cons '() (car clauses))))
+                   (cons 'cond (cdr clauses)))))))
 
 (define else #t)
 
+(define (map f l . r)
+  (if (null? l) '()
+      (if (null? r) (cons (f (car l)) (map f (cdr l)))
+          (if (null? (cdr r))
+              (cons (f (car l) (caar r)) (map f (cdr l) (cdar r)))))))
+
 (define-macro (simple-let bindings . rest)
   (cons (cons 'lambda (cons (map car bindings) rest))
         (map cadr bindings)))
 
 (define-macro (let bindings . rest)
-  (cons* 'simple-let bindings rest))
+  (cons 'simple-let (cons bindings rest)))
index 41f6247dca0a2ca6a16ee047d3cd6036b8fc7263..938cdb88aa3f8f90b30bbe0c0d372df7c037da3d 100644 (file)
@@ -35,7 +35,7 @@
   (if (null? x) #f
       (if (null? (cdr x)) (car x)
           (list 'if (car x) (car x)
-                (cons* 'or (cdr x))))))
+                (cons 'or (cdr x))))))
 
 (define-macro (and . x)
   (if (null? x) #t