我花了一天时间阅读 The Little Schemer 一书中的第166页length≤1
;有以下代码:
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
((mk-length eternity)
(cdr l))))))))
l)
其中l
为(apples)
,eternity
如下:
(define eternity
(lambda (x)
(eternity x)))
第166页(第4版)指出:
当我们应用
mk-length
一次时,我们会获得length≤1
然后
我们能不止一次这样做吗?
但我不知道如何才能获得length≤2
?
答案 0 :(得分:3)
假设l
是(apples oranges)
,那么它会像这样评估(请注意mk-length
绑定到(lambda (mk-length) ...)
函数本身:
(cond ((null? l) 0)
(else (add1 ((mk-length eternity) (cdr l)))))
==>
(add1 ((mk-length eternity) '(oranges)))
==>
(add1 ((lambda (l) (cond ((null? l) 0
(else (add1 ((eternity eternity) (cdr l))))))))
==>
(add1 (add1 ((eternity eternity) '())))
所以在这里,经过两个步骤,eternity
最终被应用,但我们想要的是它调用mk-length
。因此,在原始函数中,如果我们将eternity
替换为mk-length
,那么我写的最后一步将包含(mk-length mk-length)
而不是(eternity eternity)
,从而允许计算继续进行。