Описание тега dynamic-scope
Динамическое определение области видимости - это метод определения области видимости переменной, который использует стек вызовов для определения того, какое значение должна иметь несвязанная переменная (переменная, которая определена вне выполняемой в данный момент функции). Языки с динамической областью видимости будут искать стек вызовов (сначала вызывающий, затем вызывающий и т. Д.), Чтобы найти несвязанные переменные.
Более популярный метод определения области видимости - лексическая область видимости (альтернативно статическая область видимости) - использует исходный код программы, чтобы выяснить, как разместить области видимости. Например, рассмотрим следующий код Python:
def increment_by(x):
def inner(y):
return x + y
return inner
def main():
add_two = increment_by(2)
x = 12
print(add_two(12))
main()
На выходе эта программа выдаст число 14; это потому, что когда Python видит несвязанное имя с именемx
, он смотрит, как он был определен в функции increment_by
, поскольку inner
был определен внутри increment_by
в исходном коде программы. когдаincrement_by
был выполнен для производства inner
функция x
было равно 2, поэтому Python использует значение 2 для переменной x
внутри inner
.
Однако язык Emacs Lisp имеет динамическую область видимости, в отличие от Python - эквивалентный код в Elisp:
(defun increment-by (x)
;; This is actually the function called inner, but without a name
(lambda (y) (+ x y)))
(defun main ()
(let ((add-two (increment-by 2))
(x 12))
(funcall add-two 10)))
(main)
При запуске внутри Emacs приведенный выше код вернет значение 22; это потому, что, когда Elisp видит несвязанное имя с именемx
, он будет смотреть, какое значение дал вызывающийx
. посколькуmain
звонки increment-by
, Элисп видит, что main
определены x
равным 12, и поэтому использует значение 12 для x
.
Обычно этот тег предназначен для обозначения вопросов о динамической области видимости и о том, как это влияет на программирование на языках с динамической областью видимости.