Recursion 如何做这个长度≤;不止一次?

Recursion 如何做这个长度≤;不止一次?,recursion,scheme,y-combinator,the-little-schemer,anonymous-recursion,Recursion,Scheme,Y Combinator,The Little Schemer,Anonymous Recursion,我花了一天时间阅读166页的长度≤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是(苹果)和永恒如下:

我花了一天时间阅读166页的
长度≤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
(苹果)
永恒
如下:

(define eternity 
  (lambda (x)
    (eternity x)))
第166页(第四版)规定:

当我们应用
mk length
一次时,我们得到
length≤1

然后

我们可以不止一次这样做吗


但是我不知道如何获得
长度≤2

假设
l
(苹果橙子)
,那么它将这样计算(注意
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) '())))

在这里,经过两个步骤,
永恒
最终被应用,但我们希望它调用
mk length
。因此在原始函数中,如果我们用
mk length
替换
永恒
,那么我编写的最后一个步骤将包含
(mk length mk length)
,而不是
(永恒)
,允许继续计算。

使用
mk length
而不是
eventure
这将是
length≤∞,而不是
长度≤2
。我想我的回答是关于
长度的≤2
特别是(即仅2个,不超过2个)。