2009-11-18 84 views
26

我一直試圖讓我的頭繞着淺層綁定和深度綁定,維基百科沒有做好解釋正確的工作。說我有下面的代碼,將輸出什麼,如果語言使用動態作用域與動態範圍界定 - 深度綁定vs淺綁定

一)深的結合

B)淺約束力?

x: integer := 1 
y: integer := 2 

procedure add 
    x := x + y 

procedure second(P:procedure) 
    x:integer := 2 
    P() 

procedure first 
    y:integer := 3 
    second(add) 

----main starts here--- 
first() 
write_integer(x) 
+0

這是Python的?你的問題語言是否是幽默的?請指定 – Shimmy 2009-12-27 01:50:02

回答

25

深度結合的過程作爲參數

淺結合過去的時間結合環境的過程實際上是所謂

因此,對於深綁定動態範圍設置的時間結合環境當添加到第二個 時,環境是x = 1,y = 3,x是全局x,因此它將4寫入全局x,這是由write_integer拾取的。

淺結合剛剛穿越,直到它找到對應的名稱,以便答案是1

+2

對於淺層綁定,如果我將「write_integer(y)」放在第二個過程(P()之前),我會得到3還是2?對於淺綁定,我是否可以不更改全局變量的值? – vvMINOvv 2012-02-14 00:30:37

+1

帶淺綁定的動態範圍將打印「5」。這是因爲動態作用域使用來自其調用方法的綁定(可變值組合)。因此,具有淺綁定的動態範圍將使用綁定'x = 2',而不像具有深綁定的動態範圍,它將使用(如@ jjia6395所述)'x = 1'(從'add'傳遞到方法'second'作爲參數)。 – 2014-10-09 00:47:25

+0

@AntoineDahan如果'second'動態地爲恰好命名爲'x'的新變量引入新綁定(如使用'x:integer:= 2'而不是'x:= 2')所以'add'(從'second'調用,而'second'處於活動狀態)會動態地將'x'創建爲5,但'write_integer(x)'引用全局'x'。所以,這個僞代碼是誤導性的。它應該在定義中使用「=」,比如'x:integer = 1'和在變異賦值中使用「:=」,如'x:= x + y'。 – 2015-12-29 12:44:36