(define (cons x y) (lambda (m) (m x y))) (define (car z) (z (lambda (p q) p)))
为什么 此处的(car (cons x y))能够正常运行给出解释
乍一看,这东西是什么鬼东西,一片迷茫,仔细一分析
我们将其展开
((lambda (m) (m x y)) (lambda (p q) p))
好像还是看不太懂
这里其实是把后面第二个lambda作为过程参数,传到第一个过程中
这样相当于x y就是第二个函数的参数了
所以,car返回第一个参数
类推,cdr只需将过程里的p改为q即可
(这里,我们把m改成 process可能会好点理解吧)
2-4
要求利用2^a*3^b创建一个序列对(a,b)用来表示非负数
这个比较简单直接给代码
(define (pwr b e) (define (iter count result) (if (= count e) result (iter (+ count 1) (* result b)))) (iter 0 1)) (define (cons a b) (* (pwr 2 a) (pwr 3 b))) (define (reminder x y) (if (< x y) x (reminder (- x y) y))) (define (car z) (define (iter count z) (if (= (reminder z 2) 0) (iter (+ count 1) (/ z 2)) count)) (iter 0 z)) (define (cdr z) (define (iter count z) (if (= (reminder z 3) 0) (iter (+ count 1) (/ z 3)) count)) (iter 0 z))
ex2-5
给出示例代码,要求给出one two 以及+
(define zero (lambda (f) (lambda (x) x))) (define (1+ n) (lambda (f) (lambda (x) (f ((n f) x)))))
one two比较简单,只需将f 的参数变为f(x) f(f(x))即可
(这里的0是指对函数进行0次操作,即返回参数值,而不是0= =个人比较愚钝,纠结了好久)
加法的话就是之前那个+1的函数中(n f)有些难以理解
这里进行简单介绍,这里的n是一个函数,它的作用是将f作为参数,返回n次f的结果
(define one (lambda (f) (lambda (x) (f x)))) (define two (lambda (f) (lambda (x) (f (f x))))) (define (+ a b) (lambda (f) ((a f) ((b f) x)))) ;;Here n is a function that take f as an argument and return nth composition of f(same to a b)