Описание тега 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.


Обычно этот тег предназначен для обозначения вопросов о динамической области видимости и о том, как это влияет на программирование на языках с динамической областью видимости.