2013-08-29 8 views
3

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 под капотом?).

  • Поиск по названию. Если явно не объявлено специальным, поиск по умолчанию по умолчанию просматривается в лексической среде - через ссылку фрейма, которая была создана во время создания привязки. Первое совпадающее имя в процессе поиска выигрывает. Для специальных имен (которые должны быть явно объявлены так) поиск выполняется, просматривая верхнюю часть стека.

+0

Это, безусловно, интересная тема, и есть много ресурсов для всех, кто ее интересует, но поскольку речь идет не о конкретном программировании, это, вероятно, не относится к переполнению стека. Однако вам может быть повезло с ним на http://programmers.stackexchange.com, что касается концептуальных вопросов разработки программного обеспечения. –

+2

Этот вопрос не соответствует теме, потому что это приглашение к обсуждению, а не вопрос с легкостью. – Vatine

ответ

1

Я думаю, этот вопрос, вероятно, получите мигрировал в programmers.stackexchange.com, но есть некоторые другие вопросы по StackOverflow, которые предоставляют ответы на некоторые из этих вопросов, хотя никто, что я нашел до сих пор не являются точными копиями. Посмотрите:

Кроме того, для чего это стоит, вы, вероятно, обнаружите, что в транслируемых языках, лексическая среда «поиск» на самом деле не требует большого поиска и может быть скомпилирован в ссылку на постоянную память времени в лексическую среду (которая по-прежнему является своего рода поиском, но вся работа определяется заранее, и во время выполнения требуется только поиск).

+0

Спасибо за комментарии и ссылки, Джошуа. Я не нашел эти ответы, прежде чем спрашивать у меня. Они весьма актуальны для моего вопроса. –