Alcance Dinámico-Encuadernación Profunda vs Encuadernación superficial


He estado tratando de conseguir mi cabeza alrededor de encuadernación superficial y encuadernación profunda, wikipedia no hace un buen trabajo de explicarlo correctamente. Digamos que tengo el siguiente código, ¿cuál sería la salida si el lenguaje utiliza el alcance dinámico con

A) unión profunda

B) unión superficial?

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)
Author: imz -- Ivan Zakharyaschev, 2009-11-18

2 answers

El enlace profundo enlaza el entorno en el momento en que se pasa el procedimiento como argumento

La unión superficial se une al entorno en el momento en que el procedimiento se llama realmente

Así que para el ámbito dinámico con enlace profundo cuando add se pasa al segundo el entorno es x = 1 , y = 3 y el x es el global x por lo que escribe 4 en el global x, que es el recogido por el write_integer.

El enlace superficial solo atraviesa hasta que encuentra la variable más cercana que corresponde al nombre por lo que la respuesta sería 1.

 25
Author: John Jiang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-28 23:14:18
 -3
Author: pranav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-13 04:20:06