Динамическое определение объема - Глубокая привязка против мелкой привязки

Я пытался разобраться в мелкой и глубокой привязке, Википедия не может объяснить это должным образом. Скажем, у меня есть следующий код, что будет на выходе, если язык использует динамическую область видимости с

а) глубокое связывание

б) неглубокая привязка?

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)

2 ответа

Решение

Глубокая привязка связывает среду в момент передачи процедуры в качестве аргумента.

Неглубокое связывание связывает окружающую среду во время фактического вызова процедуры

Таким образом, для динамической области видимости с глубоким связыванием, когда add передается во секунду, среда имеет вид x = 1, y = 3, а x - это глобальный x, поэтому он записывает 4 в глобальный x, который выбирается write_integer.

Неглубокая привязка проходит только до тех пор, пока не найдет ближайшую переменную, соответствующую имени, поэтому ответом будет 1.

A ) При глубоком связывании мы имеем дело со средой add, в которой x относится к глобальному x, а y относится к y, локальному к первому (последняя выполненная функция, которая имеет объявление y)

x (глобальный) = x (глобальный) + y (локальный): x = 1 + 3 = 4

б) При поверхностном связывании мы имеем дело со средой второго, в которой x относится к x, локальному к второму, а y относится к y, локальному к первому (последняя выполненная функция, которая имеет объявление y)

x (локальный) = x (локальный) + y (локальный): x = 2 + 3 = 5

НО: write_integer(x) выводит глобальный x, равный 1

в заключение

а) 4

б) 1

Мелкое связывание должно быть 5. определения: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=15&lngWId=6

Другие вопросы по тегам