我是Lisp的新手,我正在阅读ANSI Common Lisp中的文本生成器示例,第8章。我按照示例在LET变量“prec”的范围内定义了一个函数“see”,< / p>
(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文件中。
然后当我返回REPL并尝试在加载文件的编译版本后调用see时,发生了错误:
The variable PREV is unbound.
[Condition of type UNBOUND-VARIABLE]
如何正确调用?什么是词法封闭?我很困惑。
感谢您的帮助。
答案 0 :(得分:4)
您似乎已在封闭的prec
表单中键入prev
而不是let
。
词法闭包是“关闭”词汇环境的一部分(因此得名)的功能。在lisp中有许多关于闭包的好的介绍我不会在这里重复,但实质上,let
是操纵词汇环境的最常用方法;在这种情况下,您希望为prev
添加绑定,然后该绑定将可用于表单正文中的代码。您的函数see
将“关闭”此绑定,因此每次调用see
都可以访问它,即使您进行这些调用时,您将不再处于由此建立的词汇环境中。 let
表格。在某种意义上,你可以说函数定义与它绑定。
由于您似乎错误地键入了prev
的名称,因此您的函数正在尝试引用代码中尚未建立的绑定。