common-lisp: разница между привязкой и символом

В чем (простыми словами) разница между установкой привязки (LET) и символов (= переменных) в общем lisp?


person martins    schedule 18.04.2010    source источник
comment
Что вы подразумеваете под ... и символами (= переменными)? Можете ли вы привести примеры выражений двух описываемых вами понятий?   -  person Paul Richter    schedule 19.04.2010


Ответы (2)


Символы и переменные - это два очень разных типа сущностей. Символ - это имя чего-либо; переменная - это контейнер для значения. Переменная может быть названа символом.

Связывание - это связь между символом и переменной; когда действует привязка, вы можете ссылаться на переменную по ее имени. let форма создает такую ​​привязку.

person dmitry_vk    schedule 19.04.2010
comment
Извините, если я не достаточно ясно понял. Я просматривал это руководство: en.wikibooks.org/wiki/Common_Lisp/First_steps/Beginner_ В чем разница между: (let ((a 1))) и (setf a 1) - person martins; 19.04.2010
comment
(let ((a 1)) ...) создает переменную (с локальной лексической областью видимости), привязку между символом A и этой переменной (в лексическом контексте внутри let for) и инициализирует ее значением 1. (setf a 1 ) может вести себя по-разному: если есть привязка A, то она меняет свое значение. Если привязки нет, она создает глобальную привязку A и инициализирует ее значением 1. Однако вид глобальной привязки остается неопределенным и различается между реализациями Lisp (и их версиями). Итак, если у вас есть переменная с именем A, setf изменит ее значение; в противном случае результат не указан полностью. - person dmitry_vk; 19.04.2010

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

(setf a 1) устанавливает a в 1 и предполагает, что либо a было ранее определено (с помощью defparameter, defvariable или let), либо что a - новая специальная переменная, которой требуется значение.

Это немного сложнее, но я не уверен, что у меня есть шепелявые слова, чтобы это объяснить.

person Amos    schedule 19.04.2010