2

我已經花了一天的時間閱讀第166頁的length≤1Little Schemer;有下面的代碼:如何將此長度≤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

我認爲[這個答案](https://stackoverflow.com/a/48323411/849891)我回答了這個問題,'length≤2'具體(即只有2個,不多)。 –

回答

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。所以在原函數中,如果我們用mk-length替換eternity,那麼我寫的最後一步將包含(mk-length mk-length)而不是(eternity eternity),允許繼續計算。

+0

用'mk-length'代替'永恆',這將是'length≤∞',而不是'length≤2'。 –

相關問題