;;预备函数
(define (atom? x)(and (not (pair? x))(not (null? x))))
(define (sub1 x)(- x 1))
(define (add1 x)(+ x 1))
;辅助函数,方便用来显示结果
(define-syntax print(syntax-rules ()((_) #f)((_ e) (begin(display 'e)(display " => ")(display e)(newline)))((_ e1 e2 e3 ...)(begin(print e1)(print e2 e3 ...)))))
;测试辅助函数,看看效果
(print(print(print(print(print(print(print(print (+ 1 2 3)))))))))
;;Begin of Chapter 1
(print(atom? 'atom)(atom? "atom")(atom? "turkey")(atom? 1492)(atom? #\u)(atom? "u")(atom? "*abc$")(atom? '(atom))(atom? '(atom turkey or))(atom? atom?)(length '(how are you doing so far))(atom? '())(car '(a b c))(car '((a b c) x y z));;The Law of Car;;The primitive car is defined only for non-empty lists.(car '(((hotdogs)) (and) (pickle) relish))(car (car '(((hotdogs)) (and) (pickle) relish)))(cdr '(a b c))(cdr '((a b c) x y z))(cdr '(hamburger))(cdr '((x) t r))(cdr '(((hotdogs)) (and) (pickle) relish));;The Law of Cdr;;The primitive cdr is defined only for non-empty lists.;;The cdr of any nonempty list is always another list.(car (cdr '((b) (x y) ((c)))))(cdr (cdr '((b) (x y) ((c)))));;Car & Cdr takes any non-empty list.(cons 'peanut '(butter and jelly))(cons '(banana and) '(peanut butter and jelly))(cons '(a b c) '())(cons 'a '());;The Law of Cons;;The primitive cons takes two arguments.;;The second argument to cons must be a list.;;The result is a list.(cons 'a (car '((b) c d)))(cons 'a (cdr '((b) c d)))(null? '())(null? (quote ()));;The Law of Null?;;The primitive null ? is defined only for lists.(atom? 'Harry)(atom? "Harry")(eq? 'harry 'harry)(eq? 'harry "harry");;The Law of Eq?;;The primitive eq? takes two arguments.;;Each must be a nonnumeric atom.(eq? (car '(beans beans we need jelly beans))(car (cdr '(beans beans we need jelly beans)))))
;;End of Chapter 1
;;Begin of Chapter 2
(define (lat? l)(cond((null? l) #t)((atom? (car l))(lat? (cdr l)))(else #f)))
(print(lat? '(jack sprat could eat no chicken fat))(lat? '((jack) sprat could eat no chicken fat))(lat? '(jack (sprat could) eat no chicken fat))(lat? '())
 )
(define (member? a lat)(cond((null? lat) #f)(else (or (equal? (car lat) a)(member? a (cdr lat))))))
;;End of Chapter 2
;;Begin of Chapter 3
(define (rember a lat)(cond((null? lat) '())((equal? (car lat) a) (cdr lat))(else (cons (car lat)(rember a (cdr lat))))))
(define (multirember a lat)(cond((null? lat) '())((equal? (car lat) a) (multirember a (cdr lat)))(else (cons (car lat)(multirember a (cdr lat))))))(define (firsts lat)(cond((null? lat) '())
    (else (cons (car (car lat)) (firsts (cdr lat))))))
(define (insertR new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons old (cons new (cdr lat))))(else (cons (car lat) (insertR new old (cdr lat))))))
(define (multiinsertR new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons old (cons new (multiinsertR new old (cdr lat)))))(else (cons (car lat) (multiinsertR new old (cdr lat))))))
(define (insertL new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons new (cons old (cdr lat))))(else (cons (car lat) (insertL new old (cdr lat))))))
(define (multiinsertL new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons new (cons old (multiinsertL new old (cdr lat)))))(else (cons (car lat) (multiinsertL new old (cdr lat))))))
(define (subst new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons new (cdr lat)))(else (cons (car lat) (subst new old (cdr lat))))))
(define (multisubst new old lat)(cond((null? lat) '())((eq? old (car lat)) (cons new (multisubst new old (cdr lat))))(else (cons (car lat) (multisubst new old (cdr lat))))))
(define (subst2 new o1 o2 lat)(cond((null? lat) '())((or (eq? o1 (car lat))(eq? o2 (car lat)))(cons new (cdr lat)))(else (cons (car lat) (subst2 new o1 o2 (cdr lat))))))
(print(rember 'd '(a b c d e f d h g i m))(multirember 'd '(a b c d e f d h g i m))(firsts'((apple peach p u m pkin)
    (plum pear cherry)(grape raisi n pea)(bean carrot eggplant)))(insertR 'e 'd '(a b c d f g d h))(multiinsertR 'e 'd '(a b c d f g d h))(insertL 'e 'd '(a b c d f g d h))(multiinsertL 'e 'd '(a b c d f g d h))(subst 'e 'd '(a b c d f g d h))(multisubst 'e 'd '(a b c d f g d h))(subst2 'e 'd 'b '(a b c d f g d h)))
;;End of Chapter 3
;;Begin of Chapter 4
;;本章节讨论自然数集
(define (my+ m n)(cond((zero? m) n)(else (add1 (my+ (sub1 m) n)))))
(define (my- m n)(cond((zero? n) m)(else (sub1 (my- m (sub1 n))))))
(define (tup? lat)(cond((null? lat) #t)((number? (car lat)) (tup? (cdr lat)))(else #f)))
(define (addtup tup)(cond((null? tup) 0)(else (my+ (car tup) (addtup (cdr tup))))))
(define (my* m n)(cond((zero? n) 0)(else (my+ m (my* m (sub1 n))))))
(define (tup+ t1 t2)(cond((null? t1) t2)((null? t2) t1)(else (cons(my+ (car t1) (car t2))(tup+ (cdr t1) (cdr t2))))))
(define (my> m n)(cond((zero? m) #f)((zero? n) #t)(else (my> (sub1 m) (sub1 n)))))
(define (my< m n)(cond((zero? n) #f)((zero? m) #t)(else (my< (sub1 m) (sub1 n)))))
(define (my= m n)(cond((and (zero? m) (zero? n)) #t)((or (zero? m) (zero? n)) #f)(else (my= (sub1 m) (sub1 n)))))
(define (my^ m n)(cond((zero? n) 1)(else (my* m (my^ m (sub1 n))))))
(define (my/ m n)(cond((my< m n) 0)(else (add1 (my/ (my- m n) n)))))
(define (my-length lat)(cond((null? lat) 0)(else (add1 (my-length (cdr lat))))))
(define (pick n lat)(if (zero? (sub1 n))(if (null? lat) #f (car lat))(pick (sub1 n) (cdr lat))))
(define (no-nums lat)(cond((null? lat) '())((number? (car lat)) (no-nums (cdr lat)))(else (cons (car lat) (no-nums (cdr lat))))))
(define (all-nums lat)(cond((null? lat) '())((number? (car lat)) (cons (car lat) (all-nums (cdr lat))))(else (all-nums (cdr lat)))))
(define (eqan? a1 a2)(cond((and (number? a1) (number? a2))(my= a1 a2))((or (number? a1) (number? a2))#f)(else (eq? a1 a2))))
(define (occur a lat)(cond((null? lat) 0)((eqan? a (car lat))(add1 (occur a (cdr lat))))(else (occur a (cdr lat)))))
(define (one? n)(my= n 1))
(define (rempick n lat)(cond((one? n) (cdr lat))(else (cons (car lat) (rempick (sub1 n) (cdr lat))))))
(print(atom? 3.1415926)(number? 3.1415926)(add1 67)(sub1 5)(zero? 0)(zero? 1492)(my+ 46 12)(my- 46 12)(tup? '(1 2 3 4 5 667 23 23))(tup? '(1 2 3 4 (5 667) 23 23))(tup? '(1 2 3 4 a 667 b 23))(addtup '(1 2 3 4 5 6 7 8 9))(addtup '(15 6 7 12 3))(my* 3 5)(my* 33 55)(tup+ '(3 6 9 11 4) '(8 5 2 0 7))(tup+ '(3 6 9) '(8 5 2 0 7))(my> 1 2)(my> 1 1)(my> 2 1)(my< 1 2)(my< 1 1)(my< 2 1)(my= 1 2)(my= 1 1)(my= 2 1)(my^ 2 3)(my^ 2 11)(my^ 3 11)(my/ 11 2)(my/ 11 3)(my/ 11 4)(my/ 11 5)(my/ 11 12)(my-length '(1 2 3 4 5 6 7 8 9 a b c d e f g))(pick 3 '(1 2 3 4 5 6 7 8 9 a b c d e f g))(pick 11 '(1 2 3 4 5 6 7 8 9 a b c d e f g))(no-nums '(1 2 3 4 5 6 7 8 9 a b c d e f g))(no-nums '(1 a 2 v 3 4 s 5 6 a 7 8 9 a b c d e f g))(all-nums '(1 2 3 4 5 6 7 8 9 a b c d e f g))(all-nums '(1 a 2 v 3 4 s 5 6 a 7 8 9 a b c d e f g))(eqan? 'a 'b)(eqan? 'a 'a)(eqan? 'a 2)(eqan? 1 2)(eqan? 2 2)(occur 2 '(1 a 2 b 3 c 2 d c 4 n c m 2 5 2 r c y 6 2 7 2 8 9))(occur 'c '(1 a 2 b 3 c 2 d c 4 n c m 2 5 2 r c y 6 2 7 2 8 9))(one? 1)(one? 0)(one? 2)(rempick 6 '(1 a 2 b 3 c)))
;;End of Chapter 4
;;Begin of Chapter 5
(define (rember* a lat)(cond((null? lat) '())((pair? (car lat))(cons (rember* a (car lat))(rember* a (cdr lat))))((eq? a (car lat))(rember* a (cdr lat)))(else (cons (car lat) (rember* a (cdr lat))))))
(define (insertR* new old lat)(cond((null? lat) '())((pair? (car lat))(cons (insertR* new old (car lat))(insertR* new old (cdr lat))))((eq? old (car lat))(cons old (cons new (insertR* new old (cdr lat)))))(else (cons (car lat) (insertR* new old (cdr lat))))))
(define (occur* a lat)(cond((null? lat) 0)((pair? (car lat))(my+ (occur* a (car lat))(occur* a (cdr lat))))((eq? a (car lat))(add1 (occur* a (cdr lat))))(else (occur* a (cdr lat)))))
(define (subst* new old lat)(cond((null? lat) '())((pair? (car lat))(cons (subst* new old (car lat))(subst* new old (cdr lat))))((eq? old (car lat))(cons new (subst* new old (cdr lat))))(else (cons (car lat) (subst* new old (cdr lat))))))
(define (insertL* new old lat)(cond((null? lat) '())((pair? (car lat))(cons (insertL* new old (car lat))(insertL* new old (cdr lat))))((eq? old (car lat))(cons new (cons old (insertL* new old (cdr lat)))))(else (cons (car lat) (insertL* new old (cdr lat))))))
(define (member*? a lat)(cond((null? lat) #f)((pair? (car lat))(or (member*? a (car lat))(member*? a (cdr lat))))((eq? a (car lat)) #t)(else (member*? a (cdr lat)))))
(define (leftmost lat)(cond((atom? (car lat)) (car lat))(else (leftmost (car lat)))))
(define (eqlist? l1 l2)(cond((and (atom? l1) (atom? l2)) (eq? l1 l2))((or (atom? l1) (atom? l2)) #f)((and (null? l1) (null? l1)) #t)((or (null? l1) (null? l1)) #f)(else (and (eqlist? (car l1) (car l2))(eqlist? (cdr l1) (cdr l2))))))
(define (my-equal? s1 s2)(cond((and (atom? s1) (atom? s2))(eqan? s1 s2))((or (atom? s1) (atom? s2)) #f)(else (eqlist? s1 s2))))
;;重写eqlist?,假设参数一定是list
(define (eqlist? l1 l2)(cond((and (null? l1) (null? l1)) #t)((or (null? l1) (null? l1)) #f)(else (and (my-equal? (car l1) (car l2))(eqlist? (cdr l1) (cdr l2))))))
(print(rember* 'cup '((coffee) cup ((tea) cup) (and (hick)) cup))(rember* 'sauce '(((tomato sauce))((bean) sauce)(and ((flying)) sauce)))(insertR* 'roast 'chuck '((how much (wood))
                           could((a (wood) chuck))(((chuck)))(if (a) ((wood chuck)))could chuck wood))(occur* 'banana '((banana)(split ((((banana ice)))(cream (banana))sherbet))(banana)(bread)(banana brandy)))(subst* 'xxx 'banana '((banana)
                        (split ((((banana ice)))(cream (banana))sherbet))(banana)(bread)(banana brandy)))(insertL* 'roast 'chuck '((how much (wood))
                           could((a (wood) chuck))(((chuck)))(if (a) ((wood chuck)))could chuck wood))(member*? 'chips '((potato) (chips ((with) fish) (chips))))(leftmost '((potato) (chips ((with) fish) (chips))))(leftmost '(((hot) (tuna (and))) cheese));;(leftmost '(((() four)) 17 (seventeen)))(eqlist? '(1 2 3 4 5) '(1 2 3 4 a))(eqlist? '(1 2 3 4 (b c d (k l m) e f g) 5) '(1 2 3 4 (b c d (k l m) e f g) 5))(eqlist? '(1 2 3 4 (b c d (k l m) e f g) 5) '(1 2 3 4 (b c d (k 1 m) e f g) 5))(my-equal? '(1 2 3 4 (b c d (k l m) e f g) 5) '(1 2 3 4 (b c d (k 1 m) e f g) 5))(equal? '(1 2 3 4 (b c d (k l m) e f g) 5) '(1 2 3 4 (b c d (k 1 m) e f g) 5)));;End of Chapter 5
;;Begin of Chapter 6
(define (op-num? a)(or (number? a) (eq? a '+) (eq? a '+) (eq? a '*) (eq? a 'x) (eq? a 'my^)))
(define (my-numbered? lat)(cond((atom? lat) (op-num? lat))((null? lat) #t)(else (and (my-numbered? (car lat)) (my-numbered? (cdr lat))))))
;; my-numbered? 不能判断语法结构是否正确
(define (op? a)(or (eq? a '+) (eq? a '+) (eq? a '*) (eq? a 'x) (eq? a 'my^)))
(define (numbered? lat)(cond((atom? lat) (number? lat))((and (= 3 (length lat)) (op? (car (cdr lat)))) (and (numbered? (car lat)) (numbered? (car (cdr (cdr lat))))))(else #f)))(define (value nexp)(cond((atom? nexp) nexp)((eq? '+ (car (cdr nexp))) (my+ (value (car nexp)) (value (car (cdr (cdr nexp))))))((eq? 'x (car (cdr nexp))) (my* (value (car nexp)) (value (car (cdr (cdr nexp))))))((eq? 'my^ (car (cdr nexp))) (my^ (value (car nexp)) (value (car (cdr (cdr nexp))))))(else "value error")))
;; numbered? 检查语法规则符合
;; express -> NUMBER | express op express | (express)
;; op -> + x my^
(define (1st-sub-exp aexp)(car aexp))
(define (2nd-sub-exp aexp)(car (cdr (cdr aexp))))
(define (operator nexp)(car (cdr nexp)))
(define (value nexp)(cond((atom? nexp) nexp)((eq? '+ (operator nexp)) (my+ (value (1st-sub-exp nexp)) (value (2nd-sub-exp nexp))))((eq? 'x (operator nexp)) (my* (value (1st-sub-exp nexp)) (value (2nd-sub-exp nexp))))((eq? 'my^ (operator nexp)) (my^ (value (1st-sub-exp nexp)) (value (2nd-sub-exp nexp))))(else "value error2")))(print(my-numbered? 1)(my-numbered? '(3 + 4 x 5))(my-numbered? '(2 x x x))(my-numbered? '(3 + (4 my^ 5)))(numbered? 1)(numbered? '(3 + 4 x 5))(numbered? '(2 x 2 x 3))(numbered? '(3 + (4 my^ 5)))(numbered? '(3 + 4 4 x 5))(numbered? '(2 x x 2 x 3))(numbered? '(3 + (4 my^ my^ 5)))(value '(3 + (4 my^ 5)))(value '(3 + ((4 x 3) my^ 5)))(value '(() () () ())))

(define (sumber? n)(cond((atom? n) #f)((null? n) #t)(else (and (sumber? (car n)) (sumber? (cdr n))))))
(define (slat? ls)(cond((null? ls) #t)(else (and (sumber? (car ls)) (slat? (cdr ls))))))
(define (sero? n)(null? n))
(define (edd1 n)(cons '() n))
(define (zub1 n)(cdr n))
(define (s+ n1 n2)(cond((sero? n2) n1)(else (s+ (edd1 n1) (zub1 n2)))))
(print(sero? '())(sero? '(()))(sero? '(() ()))(edd1 '())(edd1 (edd1 '()))(sumber? '())(sumber? '(()))(sumber? '(() ()))(sumber? (edd1 '()))(sumber? (edd1 (edd1 '())))(sumber? '(1))(sumber? '((1)))(sumber? '(() (1)))(sumber? (edd1 '(1)))(sumber? (edd1 (edd1 '())))(s+ (edd1 '()) (edd1 (edd1 '())))(slat? '((()) (() ()) (() () ())))(slat? '((()) (() ()) (() () ()))))
;;End of Chapter 6
;;Begin of Chapter 7
(define (set? lat)(cond((null? lat) #t)((member? (car lat) (cdr lat)) #f)(else (set? (cdr lat)))))
(define (makeset lat)(cond((null? lat) '())((member? (car lat) (cdr lat)) (makeset (cdr lat)))(else (cons (car lat) (makeset (cdr lat))))))
(define (subset? s1 s2)(cond((null? s1) #t)((member? (car s1) s2) (subset? (cdr s1) s2))(else #f)))
(define (eqset? s1 s2)(and (subset? s1 s2)(subset? s2 s1)))
(define (intersect? s1 s2)(cond((null? s1) #f)(else (or (member? (car s1) s2)(intersect? (cdr s1) s2)))))(define (intersect s1 s2)(cond((null? s1) '())((member? (car s1) s2) (cons (car s1) (intersect (cdr s1) s2)))(else (intersect (cdr s1) s2))))
(define (union s1 s2)(cond((null? s1) s2)((member? (car s1) s2) (union (cdr s1) s2))(else (cons (car s1) (union (cdr s1) s2)))))
(define (set- s1 s2)(cond((null? s1) '())((member? (car s1) s2) (set- (cdr s1) s2))(else (cons (car s1) (set- (cdr s1) s2)))))
(define (intersectall l-set)(cond((null? l-set) '())((null? (cdr l-set)) (car l-set))(else (intersect (car l-set) (intersectall (cdr l-set))))))
(define (makeset2 lat)(cond((null? lat) '())
    (else (cons (car lat) (makeset2 (multirember (car lat) (cdr lat)))))))
(define (a-pair? x)(cond((or (atom? x) (null? x) (null? (cdr x))) #f)((null? (cdr (cdr x))) #t)(else #f)))
(define (first p)(car p))
(define (second p)(car (cdr p)))
(define (build s1 s2)(cons s1 (cons s2 '())))
(define (third p)(car (cdr (cdr p))))
(define (rel? l)(cond((or (atom? l) (not (set? l))) #f)((null? l) #t)((a-pair? (car l)) (rel? (cdr l)))(else #f)))
;;fun映射
(define (fun? rel)(set? (firsts rel)))
(define (revpair pair)(build (second pair)(first pair)))
(define (revrel rel)(cond((null? rel) '())
    (else (cons (revpair (car rel))(revrel (cdr rel))))))
(define (seconds lat)(cond((null? lat) '())
    (else (cons (second (car lat)) (seconds (cdr lat))))))
(define (fullfun? fun)(and (fun? fun)(set? (seconds fun))))
(define (one-to-one? fun)(set? (seconds fun)))
(print(set? '(apple peaches apple plum))(set? '(apples peaches pears plums))(set? '(apple 3 pear 9 3.0 4))(makeset '(1 2 3 4 3 4 3 4 5 d d d d d d))(makeset '(apple peach pear peach plum apple lemon peach))(makeset2 '(1 2 3 4 3 4 3 4 5 d d d d d d))(makeset2 '(apple peach pear peach plum apple lemon peach))(makeset2 '(apple 3 pear 4 9 apple 3 4))(subset? '(5 chicken wings) '(5 hamburgers2 pieces fried chicken andlight duckling wings))(subset? '(4 pounds of horseradish) '(four pounds chicken and5 ounces horseradish))(eqset? '(1 2 3 4 5 6) '(5 3 1 2 4 6))(eqset? '(1 2 3 4 5 6) '(5 3 l 2 4 6))(intersect? '(1 2 3 a 4 5 6) '(b c d e a f))(intersect? '(1 2 3 a 4 5 6) '(b c d e t f))(intersect? '(stewed tomatoes and macaroni) '(macaroni and cheese))(intersect '(1 2 3 a 4 5 6) '(b c d e a f))(intersect '(1 2 3 a 4 5 6) '(b c d e t f))(union '(1 2 3 a 4 5 6) '(b c d e a f))(union '(1 2 3 a 4 5 6) '(b c d e t f))(set? (union '(1 2 3 a 4 5 6) '(b c d e a f)))(set? (union '(1 2 3 a 4 5 6) '(b c d e t f)))(set- '(1 2 3 4 5 6 7) '(2 3 4))(set- '(1 2 3 4 5 6 7) '(2 3 s 4))(intersectall '((a b c) (c a d e) (e f g h a b)))(intersectall '((6 pears and)(3 peaches and 6 peppers)(8 pears and 6 plums)(and 6 pru nes with some apples)))(a-pair? '(pear pear))(a-pair? '(3 7))(a-pair? '((2) (pair)))(a-pair? '(full (house)))(build 1 2)(set? '((apples peaches)
         (pumpkin pie)(apples peaches)))(rel? '(apples peaches pumpkin pie))(rel? '((apples peaches)
         (pumpkin pie)(apples peaches)))(rel? '((apples peaches) (pumpkin pie)))(rel? '((4 3) (4 2) (7 6) (6 2) (3 4)))(firsts '((apples peaches) (pumpkin pie)))(firsts '((4 3) (4 2) (7 6) (6 2) (3 4)))(fun? '((apples peaches) (pumpkin pie)))(fun? '((4 3) (4 2) (7 6) (6 2) (3 4)))(revrel '((8 a) (pumpkin pie) (got sick)))(revrel (revrel '((8 a) (pumpkin pie) (got sick))))(firsts '((8 3) (4 2) (7 6) (6 2) (3 4)))(firsts '((8 3) (4 8) (7 6) (6 2) (3 4)))(seconds '((8 3) (4 2) (7 6) (6 2) (3 4)))(seconds '((8 3) (4 8) (7 6) (6 2) (3 4)))(fullfun? '((8 3) (4 2) (7 6) (6 2) (3 4)))(fullfun? '((8 3) (4 8) (7 6) (6 2) (3 4))))
;;End of Chapter 7
;;Begin of Chapter 8
(define (rember-f test? a lat)(cond((null? lat) '())((test? (car lat) a) (cdr lat))(else (cons (car lat)(rember-f test? a (cdr lat))))))(define (rember-f test?)(lambda (a lat)(cond((null? lat) '())((test? (car lat) a) (cdr lat))(else (cons (car lat)((rember-f test?) a (cdr lat)))))))(define (seqL new old l)(cons new (cons old l)))
(define (insertL-f test?)(lambda (new old lat)(cond((null? lat) '())((test? (car lat) old) (seqL new old ((insertL-f test?) new old (cdr lat))))(else (cons (car lat) ((insertL-f test?) new old (cdr lat)))))))(define (seqR new old l)(cons old (cons new l)))
(define (insertR-f test?)(lambda (new old lat)(cond((null? lat) '())((test? (car lat) old) (seqR new old ((insertR-f test?) new old (cdr lat))))(else (cons (car lat) ((insertR-f test?) new old (cdr lat)))))))(define (insert-g seq)(lambda (new old lat)(cond((null? lat) '())((equal? (car lat) old) (seq new old ((insert-g seq) new old (cdr lat))))(else (cons (car lat) ((insert-g seq) new old (cdr lat)))))))(define insertL (insert-g seqL))
(define insertR (insert-g seqR))(define insertL (insert-g (lambda (new old l)(cons new (cons old l)))))
(define insertR (insert-g (lambda (new old l)(cons old (cons new l)))))
(define subst (insert-g (lambda (new old l)(cons new l))))(define rember-eq? (rember-f eq?))
(define rember-equal? (rember-f equal?))
(print((rember-f =) 5 '(6 2 5 3))((rember-f eq?) 'jelly '(jelly beans are good))((rember-f eq?) '(pop corn) '(lemonade (pop corn) and (cake)))((rember-f equal?) '(pop corn) '(lemonade (pop corn) and (cake)))(rember-eq? '(pop corn) '(lemonade (pop corn) and (cake)))(rember-equal? '(pop corn) '(lemonade (pop corn) and (cake)))((insertL-f eq?) 'a 1 '(1 2 3 1 4 5 1 3 5 2 1 1 1 1 2 4 2 4 1 1 1 1 1 1))((insertR-f eq?) 'a 1 '(1 2 3 1 4 5 1 3 5 2 1 1 1 1 2 4 2 4 1 1 1 1 1 1))(insertL 'a 1 '(1 2 3 4 1 1 1 d))(insertR 'a 1 '(1 2 3 4 1 1 1 d))(subst 'a 1 '(1 2 3 4 1 1 1 d)))
(define (atom-to-function x)(cond((eq? x '+) my+)((eq? x 'x) my*)((eq? x 'my^) my^)(else "atom-to-function error")))
(define (value nexp)(cond((atom? nexp) nexp)(else ((atom-to-function (car (cdr nexp)))(value (car nexp))(value (car (cdr (cdr nexp))))))))
(define (multirembercol a lat col)(cond((null? lat) (col '() '()))((eq? (car lat) a)(multirembercol a (cdr lat)(lambda (newlat seen)(col newlat(cons (car lat) seen)))))(else (multirembercol a (cdr lat)(lambda (newlat seen)(col (cons (car lat) newlat)seen))))))
(define (evens-only* lat)(cond((null? lat) '())((pair? (car lat)) (cons (evens-only* (car lat))(evens-only* (cdr lat))))((even? (car lat)) (cons (car lat)(evens-only* (cdr lat))))(else (evens-only* (cdr lat)))))
(define (evens-only*&co lat col)(cond((null? lat) (col '() 1 0))((pair? (car lat)) (evens-only*&co (car lat)(lambda (al ap as)(evens-only*&co (cdr lat)(lambda (dl dp ds)(col (cons al dl) (* ap dp) (+ as ds)))))))((even? (car lat)) (evens-only*&co (cdr lat) (lambda (newl p s)(col (cons (car lat) newl) (* (car lat) p) s))))(else (evens-only*&co (cdr lat) (lambda (newl p s)(col newl p (+ (car lat) s)))))))
(print(value '(3 + (4 my^ 5)))(value '(3 + ((4 x 3) my^ 5)))(multirembercol 'tuna '(strawberries tuna and swordfish)(lambda (x y) (null? y)))(multirembercol 'tuna '()(lambda (x y) (null? y)))(multirembercol 'tuna '(tuna)(lambda (x y) (null? y)))(multirembercol 'tuna '(and tuna)(lambda (x y) (null? y)))(multirembercol 'tuna '(strawberries tuna and swordfish)(lambda (x y) (length y)))(multirembercol 'tuna '(strawberries tuna and tuna tuna tuna tuna swordfish tuna)(lambda (x y) (length y)))(evens-only* '(1 2 3 4 5 6 7 8 9 10 11))(evens-only* '(1 2 3 4 (1 2 3 4 5 6 (1 2 3 4 5 (1 2 3 4 5 6 7 8 9 10 11) 6 7 8 9 10 11) 7 8 9 10 11) 5 6 7 8 9 (1 2 3 4 5 6 7 8 9 10 11) 10 11))(evens-only*&co '((9 1 2 8) 3 10 ((9 9) 7 6) 2) (lambda (newl product sum)
                                                   (cons sum(cons product newl)))))
;;End of Chapter 8
;;Begin of Chapter 9
(define (looking a lat)(keep-looking a (pick 1 lat) lat))
(define (keep-looking a sorn lat)(cond((number? sorn)(keep-looking a (pick sorn lat) lat))(else (eq? sorn a))))
(define (shift pair)(build (first (first pair))(build (second (first pair))(second pair))))
(define (align pora)(cond((atom? pora) pora)((a-pair? (first pora)) (align (shift pora)))(else (build (first pora)(align (second pora))))))
(define (length* porn)(cond((atom? porn) 1)(else (+ (length* (car porn))(length* (cdr porn))))))
(print(looking 'caviar '(6 2 4 caviar 5 7 3))(looking 'caviar '(6 2 grits caviar 5 7 3))(shift '((a b) c))(shift '((a b) (c d)))(align '(1 2 3 4 5 6));;(length* '(1 2 3 4 5 6))
 )
(define (eternity x)(eternity x))
;;可以计算length <= 0的情况
(print((lambda (l)(cond((null? l) 0)(else (+ 1 (eternity (cdr l)))))) '()))
;;可以计算length <= 1的情况
(print((lambda (l)(cond((null? l) 0)(else (+ 1 ((lambda (l)(cond((null? l) 0)(else (+ 1 (eternity (cdr l)))))) (cdr l)))))) '(1)))
;;可以计算length <= 2的情况
(print((lambda (l)(cond((null? l) 0)(else (+ 1 ((lambda (l)(cond((null? l) 0)(else (+ 1 ((lambda (l)(cond((null? l) 0)(else (+ 1 (eternity (cdr l)))))) (cdr l)))))) (cdr l)))))) '(1 1)))
;;<=0
(print(((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) eternity) '()))
;;<=1
(print(((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) ((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) eternity)) '(1)))
;;<=2
(print(((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) ((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) ((lambda (length)(lambda (l)(cond((null? l) 0)(else (+ 1 (length (cdr l))))))) eternity))) '(1 1)))
;;<=0
(print(((lambda (mk-length)(mk-length eternity))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))) '()))
;;<=1
(print(((lambda (mk-length)(mk-length(mk-length eternity)))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))) '(1)))
;;<=2
(print(((lambda (mk-length)(mk-length(mk-length(mk-length eternity))))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))) '(1 1)))
;;<=0
(print(((lambda (mk-length)(mk-length mk-length))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))) '()))
;<=1
(print(((lambda (mk-length)(mk-length mk-length))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 ((length eternity) (cdr l)))))))) '(1)))
;
(print(((lambda (mk-length)(mk-length mk-length))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 ((length length) (cdr l)))))))) '(1 2 3 4 5 6 a b c s d e s x c)))
;修改上面函数
;可是进入无限循环
;; (print
;;  (((lambda (mk-length)
;;      (mk-length mk-length))
;;    (lambda (mk-length)
;;      ((lambda (length)
;;         (lambda (l)
;;           (cond
;;             ((null? l) 0)
;;             (else (add1 (length (cdr l)))))))
;;       (mk-length mk-length)))) '(1 2 3 4 5)))

(print(((lambda (mk-length)(mk-length mk-length))(lambda (mk-length)((lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))(lambda (x)((mk-length mk-length) x))))) '(1 2 3 4 5)))
;定义在函数体内就可以引用函数名了
(((lambda (le)((lambda (mk-length)(mk-length mk-length))(lambda (mk-length)(le (lambda (x)((mk-length mk-length) x))))))(lambda (length)(lambda (l)(cond((null? l) 0)(else (add1 (length (cdr l)))))))) '(s d f g e c))
;;定义形式就如同define
(define my-length(lambda (l)(cond((null? l) 0)(else (add1 (my-length (cdr l)))))))
(print (my-length '(1 2 3)))
;;applicative-order Y combinator
(define Y(lambda (le)((lambda (f) (f f))(lambda (f)(le (lambda (x) ((f f) x)))))))
(define (Y le)((lambda (f) (f f))(lambda (f)(le (lambda (x) ((f f) x))))))
;;End of Chapter 9

The Little Schemer的笔记,直接复制放在Racket里面运行,查看结果。

转载于:https://www.cnblogs.com/maxima/p/Prelude.html

The Little Shemer笔记相关推荐

  1. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  2. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  3. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

  4. pandas以前笔记

    # -*- coding: utf-8 -*- """ Created on Sat Jul 21 20:06:20 2018@author: heimi "& ...

  5. PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call

    您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...

  6. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  7. 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  8. 王道考研 计算机网络笔记 第六章:应用层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

  9. 王道考研 计算机网络笔记 第五章:传输层

    本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 第二章:王道考研 计算机网络笔记 第 ...

最新文章

  1. struts基本原理图
  2. python画玫瑰花的代码_python绘制玫瑰的实现代码
  3. mysql自动转库_JAVA自动操作0racle数据库转mysql数据库
  4. ubuntu命令创建用户无法登入问题
  5. 组策略 之 文件夹重定向
  6. 第十篇: 高可用的服务注册中心(Finchley版本)V2.0_dev
  7. linux纯内核直接用吗,Linux:为啥内核有的变量没有初始化就敢直接使用?
  8. Java 画精美图形
  9. HTML5 开源游戏引擎 LayaAir
  10. 第五话 Asp.Net MVC 3.0【MVC实战项目の一】
  11. SPSS卡方检验笔记
  12. Qt各版本官方下载地址
  13. xshell 配置公钥 免密码登陆
  14. AWSome Day 2019 线上云技术课堂(1)
  15. python 列表解析式
  16. Java 后端服务的跨域处理
  17. GIS原理与技术-平时作业
  18. linux内核内存管理slub
  19. 在线免费PDF英文论文全文翻译
  20. vs qt中增加png图标

热门文章

  1. html前端课讲项目特效,前端特效demo | 值得收藏的6个 HTML5 Canvas 实用案例
  2. 刷题知识回顾《五》二叉树的最近公共祖先
  3. android百度地图(卫星图,热力图,交通图)。七
  4. IText5 怎么设置页眉页脚
  5. 【第42篇】MicroNet:以极低的 FLOP 实现图像识别
  6. 【JAVA】 抽象类和接口
  7. day20request和bs4
  8. Android图片加载神器之Fresco,基于各种使用场景的讲解
  9. WWDC20 发布会你看了吗?看完 WWDC20 后的感受
  10. 隆云通管道式一氧化碳传感器