2013-02-21 66 views
2
(define make (lambda (x) (lambda (y) (cons x (list y))))) 

(let ((x 7) 
     (p (make 4))) 
    (cons x (p 0))) 

我是新來的計劃和功能程序,所以我有點笨重的步行程序,但我得到,如果我使用深度綁定此程序將返回(7 4 0)。說得通。這個程序使用淺層綁定會做什麼?我聽到這聽起來可能聽起來很愚蠢,但是在重新定義的意義上是否是p的?那麼在那種情況下,我們會返回(7 0)?計劃和淺綁定

基本上,我理解深v。淺綁定的概念,但是我覺得我在看Scheme的時候會咕because它,因爲我對它並不熟悉。

回答

0

看到這個維基百科article關於範圍討論(它提到詞法/動態範圍界定和深/淺綁定)記住Scheme是詞法範圍的。威爾尼斯的答案提供了額外的信息。 現在,讓我們來看看一步一步發生的事情在這個代碼片段:

; a variable called x is defined and assigned the value 7 
(let ((x 7) 
; make is called and returns a procedure p, inside its x variable has value 4 
     (p (make 4))) 
; 7 is appended at the head of the result of calling p with y = 0 
    (cons x (p 0))) 

=> '(7 4 0) 

注意的是,在第二行封閉make返回的拉姆達創建的,可變x內將被分配值4xx無關,因爲Scheme在詞彙範圍上。

最後一行是不是一個重新定義,如前面的段落中提到的內部makex是從let表達式定義的x不同。

+0

AFAIK這是錯誤的。淺/深綁定與靜態/動態範圍完全正交。兩者都可以用來實現兩者。查找「重新排序」,它只在靜態範圍的淺層綁定中起作用。 – 2013-02-22 00:33:08

+0

@WillNess也許你可以建議一種方法來重述第一句話?其餘的答案是正確的,不需要投票。最好提供建設性的反饋意見。 – 2013-02-22 01:15:01

+0

我不認爲我在這裏沒有建設性。第一段在整體上是完全錯誤的,我只好倒下了,對不起。 :)它只能被刪除,或者完全重寫。 (最少編輯....完成:)) – 2013-02-22 01:26:21

2

深層或淺層綁定是一種實現技術,不能從程序內部觀察到。程序員的區別在於詞法和動態作用域規則之間,但兩者都可以用這兩種技術中的任何一種來實現(即一種概念與另一種概念無關)。

深度或淺度指的是堆棧框架的選擇來保存給定的外部作用域變量的綁定。在深度綁定中,有一系列幀要被訪問,直到輸入了正確的幀才能保存變量的記錄;在淺層結合中,所有結合都存在於一個淺層環境中。另請參閱「重新排序」(在詞彙範圍界定的淺層結合實施中,這只是有意義的)。

爲了您的具體問題,下詞彙作用域規則的代碼將返回(7 4 0)動態 - (7 7 0),因爲呼叫((lambda(y) (list x y)) 0)x=7結合的動態範圍內進行(如一個側面說明,(cons x (list y))是與(list x y)相同):

x = 7 
p = (lambda (y) (list x y))  ; x=4 is unused, in p=(make 4) 
(cons 7 (p 0)) == (list 7 7 0) ; 'x' in this line and in lambda body for p 
           ; both refer to same binding that is 
           ; in effect, i.e. x=7