Implemented cond as macro.
authorTim Vaughan <tgvaughan@gmail.com>
Sun, 6 Nov 2016 03:53:35 +0000 (16:53 +1300)
committerTim Vaughan <tgvaughan@gmail.com>
Sun, 6 Nov 2016 03:53:57 +0000 (16:53 +1300)
scheme-library.scm
scheme-primitives.4th

index 9a9358c..ffe02ea 100644 (file)
 
 ; cond
 
+(define (cond-predicate clause) (car clause))
+(define (cond-actions clause) (cdr clause))
+(define (cond-else-clause? clause)
+  (eq? (cond-predicate clause) 'else))
+
+(define (expand-clauses clauses)
+  (if (null? clauses)
+    (none)
+    (let ((first (car clauses))
+          (rest (cdr clauses)))
+      (if (cond-else-clause? first)
+        (if (null? rest)
+          `(begin ,@(cond-actions first))
+          (error "else clause isn't last in cond expression."))
+        `(if ,(cond-predicate first)
+           (begin ,@(cond-actions first))
+           ,(expand-clauses rest))))))
+
+(define-macro (cond . clauses)
+              (if (null? clauses)
+                (error "cond requires at least one clause.")
+                (expand-clauses clauses)))
 
 ;; TESTING
 
index 38fe2e0..edf5894 100644 (file)
@@ -483,6 +483,13 @@ defer display
     drop symbol-type
 ; make-primitive gensym
 
+( Generate the NONE object indicating an unspecified return value. )
+:noname ( args -- result )
+    0 ensure-arg-count
+    
+    none
+; make-primitive none
+
 \ }}}
 
 \ vim:fdm=marker