2009-11-18 16 views
26

He estado tratando de entender que el encuadernado superficial y el encuadernado profundo, wikipedia no hace un buen trabajo al explicarlo correctamente. Decir que tengo el siguiente código, lo que podría ser la salida si el idioma que utiliza el ámbito dinámico conAlcance dinámico - Encuadernación profunda frente a Encolado poco profundo

un

) la unión profunda

b) poco profunda unión?

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

Es ésta Python? ¿Tu lenguaje de preguntas es agnótico? por favor especifique – Shimmy

Respuesta

25

profunda unión se une al medio ambiente en el momento del procedimiento se pasa como argumento

superficial de unión se une al medio ambiente en el momento del procedimiento se llama en realidad

Así que para el ámbito dinámico con profunda unión cuando add pasa al segundo , el entorno es x = 1, y = 3 y x es la x global, por lo que escribe 4 en la x global, que es la que tomó el write_integer.

superficial vinculante simplemente atraviesa arriba hasta que encuentra la variable más cercana que se corresponde con el nombre por lo que la respuesta sería 1.

+2

Para uniones superficiales, si tuviera que colocar "write_integer (y)" dentro del procedimiento en segundo lugar (antes de P()) ¿obtendría 3 o 2? También para enlaces superficiales, ¿no puedo cambiar el valor de una variable global? – vvMINOvv

+1

El ámbito dinámico con enlace poco profundo imprimiría "5". Esto se debe a que el alcance dinámico usa los enlaces (combinaciones de valores variables) del método desde el que se llama. Entonces el alcance dinámico con enlace superficial usaría el enlace 'x = 2', a diferencia del alcance dinámico con enlace profundo que usaría (como @jjia6395 dijo)' x = 1' (el enlace desde cuando 'add' se pasó al método 'segundo' como parámetro). –

+0

@AntoineDahan no si 'segundo' introduce dinámicamente el nuevo enlace para una nueva variable que se llama' x' (como se evidencia por el uso de 'x: integer: = 2' en lugar de' x: = 2'), entonces 'add' (llamado desde' second', mientras 'second' está activo) cambia que dinámicamente creó' x' a 5. Pero 'write_integer (x)' hace referencia al 'x' global. Entonces, este pseudocódigo es engañoso. debería haber usado "=" en definiciones, como 'x: integer = 1', y": = "en asignaciones de mutación, como' x: = x + y'. –

Cuestiones relacionadas