(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)