2017-07-29 40 views
0

我正在閱讀一本名爲「The Little Schemer」的書,其中的這段代碼以遞歸方式呈現,以查找列表長度而不定義任何函數。在這個不使用define的遞歸Sheme函數中發生了什麼?

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

我種得到了模糊的概念,該函數傳遞一個工具,使更多的本身,而是我一直在迷惑自己,當我嘗試和充分思考的,而當我嘗試複製的東西喜歡它。

有人能更深入地解釋這裏發生了什麼,爲什麼它如此重要(這本書對此有很大的意義)?

+0

繼續閱讀,稍後解釋。如果還不清楚,請查找「Y Combinator」,這就是在這裏玩的概念。 –

回答

1

我建議你嘗試通過它與DrRacket

步進打開時只是粘貼代碼,如果它是與任何清單參數的函數,例如:

(((lambda (mk-length) 
    (mk-length mk-length)) 
(lambda (mk-length) 
    (lambda (l) 
    (cond 
     ((null? l) 0) 
     (else (add1 
       ((mk-length mk-length) 
       (cdr l)))))))) 
'(1 2 3)) 

自己看着辦吧在底部的下拉列表中選擇Choose Language,然後在模式中選擇「帶lambda的中級學生」。這是一個受限制的方案,它的標準功能比標準要少,但是你的代碼將按照書面方式工作。按下RUN鍵後,您會看到一個Step按鈕。按下它,你可以直觀地看到整個事物。

Image of the stepper, showing the very first step!

這顯示了步進操作的方式的第一步。

注意:DrRacket的語言「lambda中級學生」可能不適用於本書中的所有代碼。它是「如何設計程序」一書的一部分,由幾種不同複雜度的語言組成。請參閱this documentation page中允許的表格。 DrRacket支持標準R5RS,R6RS和R7RS,並且它也有一個頑皮的非標準實現,名稱爲#lang racket,它爲您提供大量的庫,但鎖定您只能在此實現中運行。