Обратите внимание, что '(+ 1 2 A) - это не переменная, а форма (кавычка (+ 1 2 A)), которая оценивает объект.A внутри списка - это символ, но это не переменная.
Переменная - это место хранения, обозначаемое символом.
Re: Как работает такой язык, как Лиспделать этот вид оценки во время выполнения?
(Common) Lisp имеет два вида переменных: динамические и лексические.Динамические переменные можно оценивать во время выполнения в том смысле, что вы можете взять символ и определить, имеет ли он привязку динамической переменной, и получить или назначить эту привязку.
Лексические переменные - это те, которые "запекаются""во время компиляции: не существует переносимого способа отразить их по имени.
Оба типа переменных полезны для разных целей.
Динамическая переменная может храниться в месте, котороесвязанный с символом, называется его значение ячейки .(Этот термин фактически появляется в ANSI Common Lisp).Символ используется как своего рода ключ для извлечения ячейки (если она есть).Например, ячейка значения может быть полем cdr
некоторой cons-ячейки, которая хранится в хэш-таблице, где ключи являются символами.Возможны различные реализации.
Существует сложность в том, что Lisp поддерживает локальную привязку динамических переменных: то есть вы можете использовать let
или другие конструкции привязки для создания локальных привязок для динамических переменных, которые скрывают любую существующую привязку.Когда конструкция выходит (любым способом: включая нелокальный выход через throw
и т. Д.), Скрытая привязка восстанавливается.Эта динамическая область видимости должна быть каким-то образом реализована, и это означает, что поиск динамической переменной не обязательно просто преследует указатель от символа на ячейку значения.
Еще одним осложнением является то, что пользователиМногопоточные Lisps хотят иметь привязку динамических переменных к каждому потоку.
Здесь может быть больше информации: http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Dynamic_scoping