home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
500-599
/
ff524.lzh
/
Kamin
/
P-Distr.lzh
/
code.sch
< prev
next >
Wrap
Text File
|
1989-06-27
|
14KB
|
418 lines
; 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