Updated README.
[scheme.forth.jl.git] / scheme-library.scm
index ffe02ea..484f500 100644 (file)
 (define (cddr l) (cdr (cdr l)))
 (define (cadar l) (car (cdr (car l))))
 
+; Return number of items in list
+(define (length l)
+  (define (iter a count)
+    (if (null? a)
+      count
+      (iter (cdr a) (+ count 1))))
+  (iter l 0))
+
 ; Join two lists together
 (define (join l1 l2)
   (if (null? l1)
                 (error "cond requires at least one clause.")
                 (expand-clauses clauses)))
 
+; and
+
+(define (expand-and-expressions expressions)
+  (let ((first (car expressions))
+        (rest (cdr expressions)))
+    (if (null? rest)
+      first
+      `(if ,first
+         ,(expand-and-expressions rest)
+         #f))))
+
+(define-macro (and . expressions)
+              (if (null? expressions)
+                #t
+                (expand-and-expressions expressions)))
+
+; or
+
+(define (expand-or-expressions expressions)
+  (if (null? expressions)
+    #f
+    (let ((first (car expressions))
+          (rest (cdr expressions))
+          (val (gensym)))
+      `(let ((,val ,first))
+         (if ,val
+            ,val
+            ,(expand-or-expressions rest))))))
+
+(define-macro (or . expressions)
+              (expand-or-expressions expressions))
+
+
 ;; TESTING
 
 (define-macro (backwards . body)