Кажется, что обычным явлением является доступ к лексическому охвату во время компиляции (или статический анализатор, поскольку мой пример находится на Python), основанный просто на местоположении в исходном коде.Имеет ли лексический охват динамический аспект?
Вот очень простой пример, когда одна функция имеет два замыкания с разными значениями для a
.
def elvis(a):
def f(s):
return a + ' for the ' + s
return f
f1 = elvis('one')
f2 = elvis('two')
print f1('money'), f2('show')
У меня нет никаких проблем с идеей, что, когда мы читаем код для функции f
, когда мы видим a
, оно не определенно в f
, поэтому мы выскочим функцию ограждающей и найти один там , и это относится к a
в f
. Расположение в исходном коде достаточно, чтобы сообщить мне, что f
получает значение для a
из охватывающей области.
Но, как описано here, при вызове функции его локальный фрейм расширяет свою родительскую среду. Таким образом, просмотр окружения во время выполнения не является проблемой. Но я не уверен в том, что статический анализатор всегда может выработать , к которому относится закрытие во время компиляции, прежде чем код будет запущен. В приведенном выше примере очевидно, что у elvis
есть два закрытия, и их легко отслеживать, но в других случаях это будет не так просто. Интуитивно я нервничаю, что попытка статического анализа может столкнуться с проблемой остановки вообще.
Точно так же лексическая область видимости имеет динамический аспект, где местоположение в исходном коде говорит нам о том, что область охвата задействована, но не обязательно, к какому закрытию относится? Или это проблема решена в компиляторах, и все ссылки в рамках функций на их закрытие действительно могут быть детализированы подробно статически?
Или ответ зависит от языка программирования - в этом случае лексическая область обзора не такая сильная, как я думал?
[EDIT @comments:
С точки зрения моего примера я могу переформулировать мой вопрос: Я прочитал требования, как «Лексическая разрешение может быть определено во время компиляции,» еще задавался вопросом, как ссылки на значения a
в f1
и f2
можно было бы разработать статически/во время компиляции (в общем).
Решение состоит в том, что лексическое охват не требует так много. Л.С. может сообщить нам, во время компиляции, что что-то под названием a
будет определяться всякий раз, когда я нахожусь в f
(и это, очевидно, может быть выработано статически, это определение лексической области), но определяющее значение значение (или закрытие которого активно): 1) за пределами LS концепция, 2) выполняется во время выполнения (не статически), поэтому в некотором смысле динамична, но, конечно же, 3) использует правило, отличное от динамического охвата.
Сообщение о выводе, цитируемое @PatrickMaupin, гласит: «Некоторая динамическая работа еще должна быть выполнена». ]
Что еще это могло означать? Языки программирования должны быть детерминированными, иначе мы не будем их использовать. Все довольно сложно. – wallyk
Я не уверен, что понимаю этот вопрос. Вы спрашиваете, можно ли определить значения 'f1' и' f2', используя статический анализ? – Barmar
По определению лексический охват является чисто лексическим. Вы просто смотрите на прилагаемую лексическую функцию и ее закрывающую функцию и т. Д. – Barmar