2009-11-18 29 views
26

Ho cercato di mettere la mia testa attorno a rilegature basse e rilegature profonde, wikipedia non fa un buon lavoro di spiegarlo correttamente. Dire che ho il seguente codice, quale sarebbe l'uscita sia se la lingua usa scoping dinamico conDynamic Scoping - Deep Binding vs Shallow Binding

un

) profondo legame

b) poco profondo legame?

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

'la Python? la tua domanda è agnotica? si prega di specificare – Shimmy

risposta

25

profondo legame lega l'ambiente al momento la procedura è passato come argomento

Shallow legame lega l'ambiente al momento della procedura è in realtà chiamato

Così, per scoping dinamico con profondo legame quando add viene passato al secondo l'ambiente è x = 1, y = 3 e x è il globale x così scrive 4 nella x globale, che è quella rilevata da write_integer.

Shallow vincolante solo attraversa fino finché non trova la variabile più vicino che corrisponde al nome in modo che la risposta sarebbe 1.

+2

Per il binding superficiale, se dovessi inserire "write_integer (y)" all'interno della procedura secondo (prima di P()) otterrei 3 o 2? Anche per rilegature poco profonde, non posso cambiare il valore di una variabile globale? – vvMINOvv

+1

L'ambito dinamico con rilegatura bassa stamperebbe "5". Questo perché l'ambito dinamico utilizza i collegamenti (combinazioni di valori variabili) dal metodo da cui è chiamato. Quindi l'ambito dinamico con rilegatura bassa userebbe il legame 'x = 2', diversamente dall'ambito dinamico con il legame profondo che userebbe (come @ jjia6395 detto)' x = 1' (il legame da quando 'add' è stato passato nel metodo 'second' come parametro). –

+0

@AntoineDahan non se 'second' introduce dinamicamente il nuovo bind per una nuova variabile che si chiama x' (come evidente dal suo uso di 'x: intero: = 2' invece di' x: = 2'), così 'add' (chiamato da' second', mentre 'second' è vivo) cambia che ha creato dinamicamente' x' a 5. Ma 'write_integer (x)' fa riferimento al 'x' globale. Quindi, questo pseudocodice è fuorviante. avrebbe dovuto usare "=" nelle definizioni, come 'x: intero = 1', e": = "nei compiti mutanti, come' x: = x + y'. –