2

我花了一天时间阅读The Little Schemerlength≤1一书中的第 166 页;有以下代码:

(((lambda (mk-length)
    (mk-length mk-length))
  (lambda (mk-length)
   (lambda (l)
    (cond
      ((null? l) 0)
      (else (add1 
           ((mk-length eternity)
            (cdr l))))))))
 l)

其中lis(apples)eternityis 如下:

(define eternity 
  (lambda (x)
    (eternity x)))

第 166 页(第 4 版)指出:

当我们申请mk-length一次时,我们得到length≤1

进而

我们可以多次这样做吗?

但我不知道如何做到这一点length≤2

4

1 回答 1

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. 所以在原始函数中,如果我们替换eternitymk-length,那么我写的最后一步将包含(mk-length mk-length)而不是(eternity eternity),从而允许计算继续进行。

于 2012-09-25T22:59:08.370 回答