CLtL2 has clarified the distinction between scope and extent. Я беру на себя это по отношению к лексическим и специальным переменным, состоит в том, что лексические переменные «лексически охвачены неопределенной степенью», в то время как специальные переменные «неограниченно охвачены динамическим расширением».Как семантика «лексическая и специальная переменная» реализована под капотом в целом?
Мой вопрос: . лексической и специальной переменной "семантики, реализованной под капотом в целом? «В общем,» я имею в виду, что достаточно общей идеи. Учитывая долгую историю Lisp, должны быть многочисленные оптимизации, которые были применены для реализации этих базовых понятий.
Чтобы начать обсуждение, я рискну предположить, что ниже.
Все начинается с окружающей среды. Среда представляет собой последовательность кадров, причем каждый кадр представляет собой таблицу, которая отображает имена в места (значение которых можно получить и сохранить); каждое такое отображение является привязкой имени к месту. Фреймы связаны взаимосвязанным отношением; имя во внутреннем фрейме может затенять одно и то же имя во внешнем фрейме. Кроме того, привязки в Common Lisp по умолчанию должны быть лексическими, если только declare
-d/declaim
-ed/proclaim
-ed будет особенным.
Существует два аспекта семантики: поиск имени и создание новой привязки.
Создать новую привязку.
lambda
,let
/let*
,labels
/flet
,macrolet
, а макросы, использующие их, создают привязки. Лексическое связывание создается путем создания нового фрейма и наличия текущей лексической среды в среде окружения, созданной вновь созданным фреймом. Специальная привязка (которая должна быть явно объявлена) помещает новое место в верхнюю часть стека, созданного для имени в текущем пакете (стек может быть размещен, возможно, хэш-таблицей на именах) - стек используется для реализации динамическая протяженность, так что, когда форма построения выходит, привязка может быть деконструирована, выбирая стек (вопрос в том, как обеспечить это, возможно, с чем-то вродеunwind-protect
под капотом?).Поиск по названию. Если явно не объявлено специальным, поиск по умолчанию по умолчанию просматривается в лексической среде - через ссылку фрейма, которая была создана во время создания привязки. Первое совпадающее имя в процессе поиска выигрывает. Для специальных имен (которые должны быть явно объявлены так) поиск выполняется, просматривая верхнюю часть стека.
Это, безусловно, интересная тема, и есть много ресурсов для всех, кто ее интересует, но поскольку речь идет не о конкретном программировании, это, вероятно, не относится к переполнению стека. Однако вам может быть повезло с ним на http://programmers.stackexchange.com, что касается концептуальных вопросов разработки программного обеспечения. –
Этот вопрос не соответствует теме, потому что это приглашение к обсуждению, а не вопрос с легкостью. – Vatine