+;; Some simple procedures useful for implementation testing.
+
+; Basic iterative summation. Run this on large numbers to
+; test garbage collection and tail-call optimization.
+(define (sum n)
+
+ (define (sum-iter total count maxcount)
+ (if (> count maxcount)
+ total
+ (sum-iter (+ total count) (+ count 1) maxcount)))
+
+ (sum-iter 0 1 n))
+
+; Recursive summation. Use this to compare with tail call
+; optimized iterative algorithm.
+(define (sum-recurse n)
+ (if (= n 0)
+ 0
+ (+ n (sum-recurse (- n 1)))))
+
+(define (null? args)
+ (eq? args ()))
+
+; Join two lists together
+(define (join l1 l2)
+ (if (null? l1)
+ l2
+ (cons (car l1) (join (cdr l1) l2))))
+
+; Append an arbitrary number of lists together
+(define (append . lists)
+ (if (null? lists)
+ ()
+ (if (null? (cdr lists))
+ (car lists)
+ (join (car lists) (apply append (cdr lists))))))
+
+; Macro definitions
+(define-macro (let value . body )
+ (list (list 'lambda (list (car value)) body)) (cdr value))