home *** CD-ROM | disk | FTP | other *** search
- ; From Chapter 1 and Lisp
- (set +1 (lambda (x) (+ x 1)))
- (set list2 (lambda (x y) (cons x (cons y '()))))
- (set list3 (lambda (x y z) (cons x (cons y (cons z '())))))
- (set nth (lambda (n l)
- (if (= n 0) (car l) (nth (- n 1) (cdr l)))))
- (set cadr (lambda (x) (car (cdr x))))
- (set caddr (lambda (x) (car (cdr (cdr x)))))
- (set atom? (lambda (x) (or (null? x) (or (number? x) (symbol? x)))))
- (set equal (lambda (l1 l2)
- (if (atom? l1) (= l1 l2)
- (if (atom? l2) '()
- (if (equal (car l1) (car l2))
- (equal (cdr l1) (cdr l2))
- '())))))
- (set or (lambda (x y) (if x x y)))
- (set not (lambda (x) (if x '() 'T)))
- (set cadar (lambda (l) (car (cdr (car l)))))
- (set caar (lambda (l) (car (car l))))
- (set assoc (lambda (x alist)
- (if (null? alist) '()
- (if (= x (caar alist)) (cadar alist)
- (assoc x (cdr alist))))))
- (set mod (lambda (m n) (- m (* n (/ m n)))))
- (set gcd (lambda (m n)
- (if (= n 0) m (gcd n (mod m n)))))
- (set mkassoc (lambda (x y alist)
- (if (null? alist)
- (cons (list2 x y) '())
- (if (= x (caar alist)) (cons (list2 x y) (cdr alist))
- (cons (car alist) (mkassoc x y (cdr alist)))))))
- (set mkassoc* (lambda (keys values al)
- (if (null? keys) al
- (mkassoc* (cdr keys) (cdr values)
- (mkassoc (car keys) (car values) al)))))
- (set length (lambda (l) (if (null? l) 0 (+1 (length (cdr l))))))
- ; Section 4.1
- (set sort2 (lambda (x y comp)
- (if (comp x y) (list2 x y) (list2 y x))))
- (sort2 7 5 <)
- '(5 7)
- (set compare-pairs (lambda (p1 p2)
- (if (< (car p1) (car p2)) 'T
- (if (< (car p2) (car p1)) '()
- (< (cadr p1) (cadr p2))))))
- (sort2 '(4 5) '(2 9) compare-pairs)
- '((2 9)(4 5))
- (set add (lambda (x) (lambda (y) (+ x y))))
- (set add1 (add 1))
- (add1 4)
- 5
- ; Section 4.2.4
- (set mapcar (lambda (f l)
- (if (null? l) '()
- (cons (f (car l)) (mapcar f (cdr l))))))
- (mapcar number? '(3 a b (5 6)))
- '(T () () ())
- (mapcar add1 '(3 4 5))
- '(4 5 6)
- (set add1* (lambda (l) (mapcar add1 l)))
- (add1* '(3 4 5))
- '(4 5 6)
- (set curry (lambda (f) (lambda (x) (lambda (y) (f x y)))))
- (((curry +) 3) 4)
- 7
- (set mapc (curry mapcar))
- (set add1* (mapc add1))
- (add1* '(3 4 5))
- '(4 5 6)
- (set add1** (mapc add1*))
- (add1** '((2 3)(4 5)))
- '((3 4)(5 6))
- (set combine (lambda (f sum zero)
- (lambda (l) (if (null? l) zero
- (sum (f (car l)) ((combine f sum zero) (cdr l)))))))
- (set sum-squares (combine (lambda (x) (* x x)) + 0))
- (sum-squares '(1 2 3 4))
- 30
- (set id (lambda (x) x))
- (set +/ (combine id + 0))
- (+/ '(1 2 3 4))
- 10
- (set */ (combine id * 1))
- (*/ '(1 2 3 4))
- 24
- (set list-id (combine id cons '()))
- (list-id '(3 4 5))
- '(3 4 5)
- (set alternate-mapc (lambda (f) (combine f cons '())))
- (set cmp-pairs-of-pairs (lambda (t1 t2)
- (if (compare-pairs (car t1) (car t2)) 'T
- (if (compare-pairs (car t2) (car t1)) '()
- (compare-pairs (cadr t1) (cadr t2))))))
- (set lex-order (lambda (<1 <2)
- (lambda (p1 p2)
- (if (<1 (car p1) (car p2)) 'T
- (if (<1 (car p2) (car p1)) '()
- (<2 (cadr p1) (cadr p2)))))))
- (set compare-pairs (lex-order < <))
- (set cmp-pairs-of-pairs
- (lex-order compare-pairs compare-pairs))
- (set student-order (lex-order > <))
- (sort2 '(85 1005) '(95 2170) student-order)
- '((95 2170) (85 1005))
- (sort2 '(85 1005) '(85 2170) student-order)
- '((85 1005) (85 2170))
- (set invert-order (lambda (<) (lambda (x y) (< y x))))
- (sort2 '(85 1005) '(95 2170) (invert-order student-order))
- '((85 1005) (95 2170))
- (set select-cols (lambda (c1 c2)
- (lambda (l) (list2 (nth c1 l) (nth c2 l)))))
- (set compose-binary
- (lambda (f g) (lambda (x y) (g (f x) (f y)))))
- (set compare-cols (lambda (< c1 c2)
- (compose-binary (select-cols c1 c2) <)))
- (set new-student-order (compare-cols student-order 2 1))
- (sort2 '(Kaplan 1005 85 87) '(Reddy 2170 95 92)
- new-student-order)
- '((Reddy 2170 95 92) (Kaplan 1005 85 87))
- (set compose (lambda (f g) (lambda (x) (g (f x)))))
- (set apply-binary (lambda (f)
- (lambda (l) (f (car l) (cadr l)))))
- (set improvement
- (compose (select-cols 3 2)
- (apply-binary -)))
- (set comp-improvement (compose-binary improvement >))
- (sort2 '(Kaplan 1005 85 87) '(Reddy 2170 95 92)
- comp-improvement)
- '((Kaplan 1005 85 87) (Reddy 2170 95 92))
- (set find (lambda (pred lis)
- (if (null? lis) '()
- (if (pred (car lis)) 'T (find pred (cdr lis))))))
- (set nullset '())
- (set addelt (lambda (x s) (if (member? x s) s (cons x s))))
- (set member? (lambda (x s) (find ((curry equal) x) s)))
- (set union (lambda (s1 s2) ((combine id addelt s1) s2)))
- (set s1 (addelt 'a (addelt 'b nullset)))
- '(a b)
- (member? 'a s1)
- 'T
- (member? 'c s1)
- '()
- (set s2 (addelt 'b (addelt 'c nullset)))
- '(b c)
- (set s3 (union s1 s2))
- '(c a b)
- (set sub-alist (lambda (al1 al2)
- (not (find
- (lambda (pair)
- (not (equal (cadr pair) (assoc (car pair) al2))))
- al1))))
- (set =alist (lambda (al1 al2)
- (if (sub-alist al1 al2) (sub-alist al2 al1) '())))
- (=alist '((E coli)(I Magnin)(U Thant))
- '((E coli)(I Ching)(U Thant)))
- '()
- (=alist '((U Thant)(I Ching)(E coli))
- '((E coli)(I Ching)(U Thant)))
- 'T
- (set member? (lambda (x s eqfun)
- (find ((curry eqfun) x) s)))
- (set addelt (lambda (x s eqfun)
- (if (member? x s eqfun) s (cons x s))))
- (set nullset (lambda (eqfun) (list2 eqfun '())))
- (set member? (lambda (x s)
- (find ((curry (car s)) x) (cadr s))))
- (set addelt (lambda (x s)
- (if (member? x s) s (list2 (car s) (cons x (cadr s))))))
- (set mk-set-ops (lambda (eqfun)
- (cons '() ; empty set
- (cons (lambda (x s) (find ((curry eqfun) x) s)) ; member?
- (cons (lambda (x s) ; addelt
- (if (find ((curry eqfun) x) s) s (cons x s)))
- '()
- )))))
- (set list-of-al-ops (mk-set-ops =alist))
- (set al-nullset (car list-of-al-ops))
- (set al-member? (cadr list-of-al-ops))
- (set al-addelt (caddr list-of-al-ops))
- (set gcd* (lambda (l)
- (if (= (car l) 1) 1
- (if (null? (cdr l)) (car l)
- (gcd (car l) (gcd* (cdr l)))))))
- (gcd* '(20 48 32 1))
- 1
- (set gcd* (lambda (l)
- (if (= (car l) 1) 1
- (gcd*-aux (car l) (cdr l)))))
- (set gcd*-aux (lambda (n l)
- (if (null? l) n
- (if (= (car l) 1) 1
- (gcd*-aux (gcd n (car l)) (cdr l))))))
- (gcd* '(20 48 32 1))
- 1
- (set gcd* (lambda (l) (gcd*-aux l id)))
- (set gcd*-aux (lambda (l f)
- (if (= (car l) 1) 1
- (if (null? (cdr l)) (f (car l))
- (gcd*-aux (cdr l)
- (lambda (n) (f (gcd (car l) n))))))))
- (gcd* '(20 48 32 1))
- 1
- (set gcds (lambda (s) (gcds-aux s id)))
- (set gcds-aux (lambda (s f)
- (if (number? s) (if (= s 1) 1 (f s))
- (if (null? (cdr s))
- (gcds-aux (car s) f)
- (gcds-aux (car s)
- (lambda (n) (gcds-aux (cdr s)
- (lambda (p) (f (gcd n p))))))))))
- (gcds '(20 (48 32) (1)))
- 1
- (set rand (lambda (seed) ($\cdots$ seed $\cdots$)))
- (set init-rand (lambda (seed)
- (lambda () (set seed (mod (+ (* seed 9) 5) 1024)))))
- (set rand (init-rand 1))
- '<closure>
- (rand)
- 14
- (rand)
- 131
- ; Section 4.4
- ; Restore required defn. of member?
- (set find (lambda (pred lis)
- (if (null? lis) '()
- (if (pred (car lis)) 'T
- (find pred (cdr lis))))))
- (set member? (lambda (x s) (find ((curry equal) x) s)))
- ;
- (set fun-mod (lambda (f x y) (lambda (z) (if (= x z) y (f z)))))
- (set variable? (lambda (x) (member? x '(X Y))))
- (set empty-subst (lambda (x) 'unbound))
- (set mk-subst-fn
- (lambda (lhs e sigma)
- (if (variable? lhs)
- (if (= (sigma lhs) 'unbound)
- (fun-mod sigma lhs e)
- (if (equal (sigma lhs) e) sigma 'nomatch))
- (if (atom? lhs)
- (if (= lhs e) sigma 'nomatch)
- (if (atom? e) 'nomatch
- (if (= (car lhs) (car e))
- (mk-subst-fn* (cdr lhs) (cdr e) sigma)
- 'nomatch))))))
- (set mk-subst-fn*
- (lambda (lhs-lis exp-lis sigma)
- (if (null? lhs-lis) sigma
- (begin
- (set car-match
- (mk-subst-fn (car lhs-lis) (car exp-lis) sigma))
- (if (= car-match 'nomatch) 'nomatch
- (mk-subst-fn* (cdr lhs-lis) (cdr exp-lis) car-match))))))
- (set extend-to-pat
- (lambda (sigma)
- (lambda (p)
- (if (variable? p) (if (= (sigma p) 'unbound) p (sigma p))
- (if (atom? p) p
- (cons (car p)
- (mapcar (extend-to-pat sigma) (cdr p))))))))
- (set mk-toplvl-rw-fn
- (lambda (rule)
- (lambda (e)
- (begin
- (set induced-subst (mk-subst-fn (car rule) e empty-subst))
- (if (= induced-subst 'nomatch) '()
- ((extend-to-pat induced-subst) (cadr rule)))))))
- (set apply-inside-exp
- (lambda (f)
- (lambda (e)
- (begin
- (set newe (f e))
- (if newe newe
- (if (atom? e) '()
- (begin
- (set newargs ((apply-inside-exp* f) (cdr e)))
- (if newargs (cons (car e) newargs) '()))))))))
- (set apply-inside-exp*
- (lambda (f)
- (lambda (l)
- (if (null? l) '()
- (begin
- (set newfirstarg ((apply-inside-exp f) (car l)))
- (if newfirstarg
- (cons newfirstarg (cdr l))
- (begin
- (set newrestofargs ((apply-inside-exp* f) (cdr l)))
- (if newrestofargs
- (cons (car l) newrestofargs) '()))))))))
- (set mk-rw-fn
- (compose mk-toplvl-rw-fn apply-inside-exp))
- (set failure (lambda (e) '()))
- (set compose-rewrites (lambda (f g)
- (lambda (x)
- ( (lambda (fx) (if fx fx (g x))) (f x)))))
- (set mk-rw-fn*
- (combine mk-rw-fn compose-rewrites failure))
- (set repeat-fn
- (lambda (f)
- (lambda (e)
- (begin
- (set tmp (f e))
- (if tmp ((repeat-fn f) tmp) e)))))
- (set compile-trs
- (compose mk-rw-fn* repeat-fn))
- (set diff-rules '(
- ((Dx x) 1)
- ((Dx c) 0)
- ((Dx (+ X Y)) (+ (Dx X) (Dx Y)))
- ((Dx (- X Y)) (- (Dx X) (Dx Y)))
- ((Dx (* X Y)) (+ (* Y (Dx X)) (* X (Dx Y))))
- ((Dx (/ X Y)) (/ (- (* Y (Dx X)) (* X (Dx Y))) (* Y Y)))))
- (set differentiate (compile-trs diff-rules))
- ;(differentiate '(Dx (+ x c)))
- ;'(+ 1 0)
- ; Section 4.5
- (set formals (lambda (lamexp) (cadr lamexp)))
- (set body (lambda (lamexp) (caddr lamexp)))
- (set funpart (lambda (clo) (cadr clo)))
- (set envpart (lambda (clo) (caddr clo)))
- (set eval (lambda (exp env)
- (if (number? exp) exp
- (if (symbol? exp) (assoc exp env)
- (if (= (car exp) 'quote) (cadr exp)
- (if (= (car exp) 'lambda) (list3 'closure exp env)
- (if (= (car exp) 'if)
- (if (null? (eval (cadr exp) env))
- (eval (cadddr exp) env)
- (eval (caddr exp) env))
- (apply (evallist exp env) env))))))))
- (set evallist (lambda (el env)
- (if (null? el) '()
- (cons (eval (car el) env)
- (evallist (cdr el) env)))))
- (set apply (lambda (el env)
- (if (closure? (car el))
- (apply-closure (car el) (cdr el))
- (apply-value-op (car el) (cdr el)))))
- (set apply-closure (lambda (clo args)
- (eval (body (funpart clo))
- (mkassoc* (formals (funpart clo)) args (envpart clo)))))
- (set apply-value-op (lambda (primop args)
- (if (= (length args) 1)
- (apply-unary-op (cadr primop) (car args))
- (apply-binary-op (cadr primop) (car args) (cadr args)))))
- (set closure? (lambda (f) (= (car f) 'closure)))
- (set primop? (lambda (f) (= (car f) 'primop)))
- (set valueops '(
- (+ (primop +))
- (- (primop -))
- (cons (primop cons))
- (* (primop *))
- (/ (primop /))
- (< (primop <))
- (> (primop >))
- (= (primop =))
- (cdr (primop cdr))
- (car (primop car))
- (number? (primop number?))
- (list? (primop list?))
- (symbol? (primop symbol?))
- (null? (primop null?))
- (closure? (primop closure?))
- (primop? (primop primop?))))
- (set apply-binary-op (lambda (f x y)
- (if (= f 'cons) (cons x y)
- (if (= f '+) (+ x y)
- (if (= f '-) (- x y)
- (if (= f '*) (* x y)
- (if (= f '/) (/ x y)
- (if (= f '<) (< x y)
- (if (= f '>) (> x y)
- (if (= f '=) (= x y) 'error!))))))))))
- (set apply-unary-op (lambda (f x)
- (if (= f 'car) (car x)
- (if (= f 'cdr) (cdr x)
- (if (= f 'number?) (number? x)
- (if (= f 'list?) (list? x)
- (if (= f 'symbol?) (symbol? x)
- (if (= f 'closure?) (closure? x)
- (if (= f 'primop?) (primop? x)
- (if (= f 'null?) (null? x) 'error!))))))))))
- (set E (mkassoc 'double (eval '(lambda (a) (+ a a)) valueops) valueops))
- '((+ (primop +)) (- (primop -)) ...
- (double (closure (lambda (a) (+ a a)) ... )))
- (eval '(double 4) E)
- 8
- ; Section 4.7.6
- (set eval (lambda (exp env)
- (if (number? exp) exp
- (if (symbol? exp) (assoc exp env)
- (if (= (car exp) 'quote) (cadr exp)
- (if (= (car exp) 'lambda) exp ; closure is not formed
- (if (= (car exp) 'if)
- (if (null? (eval (cadr exp) env))
- (eval (cadddr exp) env)
- (eval (caddr exp) env))
- (apply (evallist exp env) env))))))))
- (set apply (lambda (el env)
- (if (lambda? (car el))
- (apply-lambda (car el) (cdr el) env)
- (apply-value-op (car el) (cdr el)))))
- (set apply-lambda (lambda (lam args env)
- (eval (body lam)
- (mkassoc* (formals lam) args env))))
- (set lambda? (lambda (f) (= (car f) 'lambda)))
- (set E (mkassoc 's (eval 10 valueops) valueops))
- (set E (mkassoc 'f (eval '(lambda (x) (+ x s)) E) E))
- (set E (mkassoc 'g (eval '(lambda (s) (f (+ s 11))) E) E))
- (eval '(g 5) E)
- 21
- (set E
- (mkassoc 'add (eval '(lambda (x) (lambda (y) (+ x y))) E) E))
- (set E (mkassoc 'add1 (eval '(add 1) E) E))
- (set E (mkassoc 'f (eval '(lambda (x) (add1 x)) E) E))
- (eval '(f 5) E)
- 10
- quit
-