Implemented (reverse list).
[scheme.forth.jl.git] / scheme-library.scm
1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; Standard Library Procedures and Macros ;; 
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4
5 ;; LISTS
6
7 (define (null? args)
8   (eq? args ()))
9
10 ; Join two lists together
11 (define (join l1 l2)
12   (if (null? l1)
13     l2
14     (cons (car l1) (join (cdr l1) l2))))
15
16 ; Append an arbitrary number of lists together
17 (define (append . lists)
18   (if (null? lists)
19     ()
20     (if (null? (cdr lists))
21       (car lists)
22       (join (car lists) (apply append (cdr lists))))))
23
24 ; Reverse the contents of a list
25 (define (reverse l)
26   (if (null? l)
27     ()
28     (append (reverse (cdr l)) (list (car l)))))
29
30 ;; LIBRARY FORMS
31 (define-macro (let value . body )
32               (list (list 'lambda (list (car value)) body)) (cdr value))
33
34 ;; TESTING
35
36 ; Basic iterative summation.  Run this on large numbers to
37 ; test garbage collection and tail-call optimization.
38 (define (sum n)
39
40   (define (sum-iter total count maxcount)
41     (if (> count maxcount)
42       total
43       (sum-iter (+ total count) (+ count 1) maxcount)))
44   
45   (sum-iter 0 1 n))
46
47 ; Recursive summation. Use this to compare with tail call
48 ; optimized iterative algorithm.
49 (define (sum-recurse n)
50   (if (= n 0)
51     0
52     (+ n (sum-recurse (- n 1)))))