2012-09-13 3 views
2

Я новичок в Lisp, и я читал о примере текстового генератора в ANSI Common Lisp, глава 8. Я следую примеру и задал функцию «видеть» в области переменной LET «prec»,Несвязанная переменная в Common Lisp

(let ((prec '|.|)) 
    (defun see (symb) 
    (let ((pair (assoc symb (gethash prev *words*)))) 
     (if (null pair) 
     (push (cons symb 1) (gethash prev *words*)) 
     (incf (cdr pair)))) 
    (setf prev symb))) 

и сохранил его в файле lisp.

Затем, когда я вернулся в РЕПЛ и попытался вызвать увидеть после загрузки скомпилированных версий файла произошла ошибка:

The variable PREV is unbound. [Condition of type UNBOUND-VARIABLE]

Как вызвать видеть правильно? А для чего лексическое закрытие? Я все смущен.

Спасибо за помощь.

ответ

4

Похоже, вы набрали prec вместо prev в прилагаемой форме let.

Лексические замыкания - это функции, которые «закрывают» часть лексической среды (отсюда и название). Есть много хороших представлений о закрытии в lisp, которые я не буду повторять здесь, но, по существу, let является наиболее распространенным способом манипулирования лексической средой; в этом случае вы хотите добавить привязку для prev, которая затем будет доступна для кода внутри тела формы. Ваша функция see будет «закрывать» эту привязку, и поэтому каждый звонок к see имеет к ней доступ, хотя, когда вы совершаете эти вызовы, вы больше не будете в лексической среде, установленной формой let. Вы могли бы сказать, что определение функции берет привязку к ней, в некотором смысле.

Как вы, кажется, неправильно набрали имя prev, ваша функция пытается ссылаться на привязку, которая не была установлена ​​в этой точке кода.

+0

Извините, но я не ответил ранее. Теперь, когда вы указали опечатку, я чувствую себя очень неловко, чтобы опубликовать это, даже не заметив этого! Благодарим за терпение, и ваше разъяснение лексического закрытия является лучшим и самым кратким, что я видел до сих пор! – user1667687

Смежные вопросы