Added forth-level exception handling to repl.
[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
32 ;; TESTING
33
34 (define-macro (backwards . body)
35               (cons 'begin (reverse body)))
36
37 ; Basic iterative summation.  Run this on large numbers to
38 ; test garbage collection and tail-call optimization.
39 (define (sum n)
40
41   (define (sum-iter total count maxcount)
42     (if (> count maxcount)
43       total
44       (sum-iter (+ total count) (+ count 1) maxcount)))
45   
46   (sum-iter 0 1 n))
47
48 ; Recursive summation. Use this to compare with tail call
49 ; optimized iterative algorithm.
50 (define (sum-recurse n)
51   (if (= n 0)
52     0
53     (+ n (sum-recurse (- n 1)))))