如何做到这一点length≤1不止一次?(How to do this length≤1 more

2019-07-31 20:25发布

我花了一天阅读第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

Answer 1:

假设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) ,使计算继续进行。



文章来源: How to do this length≤1 more than once?