2013-04-07 17 views
0

最近我開始學習方案語言我不明白方案定義,拉姆達,讓我清楚

但我真的不知道如何解決這個問題。

(define A 
    (lambda() 
    (let* ((x 2) 
      (C (lambda (P) 
       (let ((x 4)) 
        (P)))) 
      (D (lambda() 
       x)) 
      (B (lambda() 
       (let ((x 3)) 
        (C D))))) 
     B))) 

問:打印什麼?如何進行淺層綁定和深度綁定?

我簡要了解了define,lambda,let *但我不知道要解決這個問題。 我該如何解決它?請詳細解釋

+0

就我個人而言,我什至不記得讓或讓*意味着什麼,所以我會不參與討論。但是由於邁克爾斯科特的書籍涵蓋了這麼多種語言,所以我認爲你手邊可能沒有Scheme翻譯。這個看起來不錯:http://repl.it/languages/Scheme(只需按Ctrl-Enter來評估你的表情)對不起,我不能更有幫助。 – 2013-04-07 06:11:05

+0

如果你正在學習Scheme,我會說它是值得安裝一個漂亮,簡單和完整的環境,比如http://racket-lang.org。 – uselpa 2013-04-07 08:49:40

+0

我已經在膩子上使用了mit-scheme。但是當我執行該代碼時,它會打印值:a。我不知道爲什麼 – 2013-04-07 10:17:22

回答

2

過程的返回過程B.議論,

(A) 

返回。如果你希望它被執行

#<procedure:B> 

,你必須運行

((A)) 

哪一個實際上打電話給B並且返回

2 

那麼發生了什麼? 調用B將調用C作爲參數。 C將因此調用D(與參數P綁定)。 D返回x,所以打印的是在過程D中綁定到x的任何值。由於Scheme在詞彙範圍內,並且D對x沒有任何綁定,所以使用詞法上下文的綁定,該綁定來自

(let* ((x 2) 

這就是爲什麼打印2,而不管其他綁定到D可能存在於其他程序。

+0

謝謝你解釋。但我有點困惑,因此「C將調用D(與參數P綁定)」意味着什麼。 – 2013-04-07 10:28:13

+0

B用參數D調用C,C中的內容與P相關。然後調用P,所以這實際上調用D. – uselpa 2013-04-07 12:31:11

+0

啊,非常感謝。我明白。 – 2013-04-07 12:38:42