2009-11-18 13 views
26

Ich habe versucht, mich mit oberflächlicher Bindung und tiefer Bindung zu beschäftigen, wikipedia macht keine gute Arbeit, es richtig zu erklären. Sagen, dass ich den folgenden Code haben, was wäre der Ausgang, wenn die Sprache mitDynamisches Scoping - Tiefe Bindung gegen flache Bindung

dynamischen Scoping verwendet

a) tiefe Bindung

b) flache Bindung?

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

Ist das Python? ist Ihre Frage Sprache Agnotic? Bitte spezifizieren Sie – Shimmy

Antwort

25

tiefere Bindung bindet die Umgebung zum Zeitpunkt der Prozedur als Argument übergeben wird

Shallow Bindung bindet die Umgebung zum Zeitpunkt der Prozedur tatsächlich

Also für dynamischen Scoping mit tiefer Bindung genannt wird Wenn add in die zweite übergeben wird, ist die Umgebung x = 1, y = 3 und das x ist das globale x, also schreibt es 4 in das globale x, welches das vom write_integer aufgenommene ist.

Shallow Bindung quert nur, bis er die nächste Variable findet, die dem Namen entspricht, so die Antwort 1.

+2

Für flache Bindung, wenn ich "write_integer (y)" innerhalb der zweiten Prozedur platzieren würde (vor P()) würde ich 3 oder 2 bekommen? Kann ich den Wert einer globalen Variable auch für flache Bindung nicht ändern? – vvMINOvv

+1

Der dynamische Bereich mit flacher Bindung würde "5" drucken. Dies liegt daran, dass der dynamische Bereich die Bindungen (Variablenwertkombinationen) aus der Methode verwendet, von der er aufgerufen wird. So würde der dynamische Bereich mit seichter Bindung die Bindung 'x = 2' verwenden, im Gegensatz zum dynamischen Bereich mit tiefer Bindung, der (wie @ jjia6395 sagte) 'x = 1' (die Bindung ab wann 'add' in die Methode 'second' als Parameter). –

+0

@AntoineDahan nicht, wenn 'second' dynamisch die neue Bindung für eine neue Variable einführt, die zufälligerweise' x' heißt (wie es durch die Verwendung von 'x: Ganzzahl: = 2' anstelle von' x: = 2' ersichtlich ist), so 'add' (von' second' aufgerufen, während 'second' am Leben ist) ändert das dynamisch erzeugte' x' in 5. Aber 'write_integer (x)' verweist auf das globale 'x'. Dieser Pseudocode ist also irreführend. Es sollte "=" in Definitionen wie 'x: integer = 1' und": = "in mutierenden Zuordnungen wie' x: = x + y' verwendet haben. –