Что чем разница между переменной и символом в LISP?

С точки зрения области действия? Актуальная реализация в памяти? Синтаксис? Например, если (пусть a 1) Является ли 'a' переменной или символом?

22
задан Gilles 'SO- stop being evil' 28 August 2010 в 10:53
поделиться

4 ответа

символ — это название вещи. переменная — это изменяемый указатель на изменяемое место хранения.

В фрагменте кода, который вы показали, как let, так и a являются символами. В рамках блока let символ a обозначает переменную, которая в данный момент привязана к значению 1.

Но имя вещи не есть сама вещь. Символ a не является переменной. Это имя переменной. Но только в этом конкретном контексте. В другом контексте имя a может относиться к совершенно другой вещи.

Пример: символ jaguar может, в зависимости от контекста, обозначать

11
ответ дан 29 November 2019 в 04:04
поделиться

Lisp использует окружения, которые похожи на карты (ключ -> значение), но с дополнительными встроенными механизмами для связывания окружений и управления привязками.

Итак, символы в значительной степени являются ключами (кроме символов специальной формы) и указывают на значение,
то есть функция , целое число , список и т. д.
Поскольку Common Lisp дает вам возможность изменять значения, то есть с помощью setq, символы в некоторых контекстах
(ваш пример) также являются переменными.

4
ответ дан 29 November 2019 в 04:04
поделиться

Цитата из Common Lisp HyperSpec:

символ n. объект типа символ.

переменная n. a связывание в «переменном» пространстве имен.

связывание н. связь между именем и тем, что обозначает имя. (…)

Пояснение времени.

То, что Лисп называет символами, довольно близко к тому, что многие языки называют переменными. В первом приближении символы имеют значения; когда вы вычисляете выражение x, значением выражения является значение символа x; когда вы пишете (setq x 3), вы присваиваете новое значение x. В терминологии Лиспа (setq x 3) связывает значение 3 с символом x.

Свойство Лиспа, которого нет в большинстве языков, заключается в том, что символы являются обычными объектами (символы являются объектами первого класса в терминологии языков программирования). Когда вы пишете (setq x y), значение x становится таким же, каким было значение y во время присваивания. Но вы можете написать (setq x 'y), и в этом случае значение x будет символом y.

Концептуально говоря, существует окружение, которое представляет собой ассоциативную таблицу от символов к значениям. Оценка символа означает поиск его в текущей среде.(Среды также являются объектами первого класса, но это выходит за рамки этого ответа.) binding относится к конкретной записи в среде. Однако есть дополнительная сложность.

Большинство диалектов Лиспа имеют несколько пространств имен, по крайней мере, пространство имен переменных и пространство имен функций. На самом деле среда может содержать несколько записей для одного символа, по одной записи для каждого пространства имен. Переменная, строго говоря, является записью в окружении в пространстве имен переменных. В повседневной терминологии Лиспа символ часто упоминается как переменная, когда вас интересует его привязка в качестве переменной.

Например, в (setq a 1) или (пусть ((a 1)) ...), a — символ. Но поскольку конструкции воздействуют на привязку переменной для символа a, в этом контексте принято ссылаться на a как на переменную.

С другой стороны, в (defun a (...) ...) или (flet ((a (x) ...)) ...), a также является символом, но эти конструкции действуют на привязку его функции, поэтому a не будет считаться переменной.

В большинстве случаев, когда символ появляется в выражении без кавычек, он оценивается путем поиска привязки его переменной. Основное исключение состоит в том, что в вызове функции (foo arg1 arg2 ...) используется привязка функции для foo. Значение символа в кавычках 'x или (кавычки x) равно самому себе, как и в любом выражении в кавычках.Конечно, существует множество специальных форм, где вам не нужно заключать символ в кавычки, в том числе setq, let, flet, defun и др.

13
ответ дан 29 November 2019 в 04:04
поделиться

Символ — это объект данных Lisp. «Форма» Лиспа означает объект Лиспа, предназначенный для оценки. Когда сам символ используется как форма Лиспа, т. е. когда вы вычисляете символ, результатом является значение, связанное с этим символом. Способ, которым значения связаны с символами, является глубокой частью языка Лисп. Независимо от того, объявлен ли символ «особым» или нет, сильно меняется способ работы оценки.

Лексические значения обозначаются символами, но вы не можете сами манипулировать этими символами как объектами. На мой взгляд, объяснять что-либо в Лиспе с точки зрения «указателей» или «местоположений» — не лучший способ.

3
ответ дан 29 November 2019 в 04:04
поделиться