2011-04-23 53 views
1

我看到之前有類似的問題,但我不明白這裏的另一個問題。方案 - 使用let的函數

這裏有兩個功能:

(define x 2) 
(define a 2) 

(define goo 
    (lambda (x) 
    (display x) 
    (lambda (y) (/ x y)))) 

(define foo 
    (let ((f (goo a))) 
    (lambda (x) 
     (if (= x 0) 
      x 
      (f x))))) 

什麼是(foo (foo 0))的返回值?什麼會打印到屏幕上?

據我瞭解,當我在開始運行(foo 0)2將打印出來(我們將進入功能goo),並且返回值將是0。然後,我們將再次輸入foo的功能(foo (foo 0)) =>(foo 0)。我們再次輸入功能goo2將打印出來。但是當我運行它時,2只被打印一次。我想我錯過了關於let及其與lambda的連接的關鍵問題。

回答

2

letfoo定義內,並且因此gooa應用程序中,當foo被定義,而不是當foo評價進行評價。

看看這樣:foo的價值是什麼?這是lambda表達式。 f的綁定關閉了foo,它不是每次對foo進行評估時「重做」。

編輯:這裏是一個例子,而不lambda小號

> (let ((x (sqrt 2))) (* x 3)) 
4.24264068711929 
> (define bar (let ((x (sqrt 2))) (* x 3))) 
> bar 
4.24264068711929 
>   

當你評估bar你是不是再次調用sqrtbar被定義爲let的主體,在這種情況下是表達式的結果。

在您的示例中,let的正文是lambda表達式。但就像我的例子,綁定不會被重新執行。

+0

Tank u。但「let」的正文是: (lambda(x) (if(= x 0) x (f x))) 含義 - 我必須在每次評估「foo」時輸入let。因此,我也輸入了「goo」功能(重新定義)。 我缺少什麼? – Tom 2011-04-23 15:38:16

+0

當x不爲零時,再次評估f;但f是foo定義時評估(goo a)的結果; f已經綁定,每次執行foo時都不會反彈。 – 2011-04-23 15:52:58

+0

看到我的編輯上面的例子,可能會幫助你。 – 2011-04-23 16:03:44