Common Lisp中的未绑定变量

时间:2012-09-13 06:47:35

标签: common-lisp

我是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]

如何正确调用?什么是词法封闭?我很困惑。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

您似乎已在封闭的prec表单中键入prev而不是let

词法闭包是“关闭”词汇环境的一部分(因此得名)的功能。在lisp中有许多关于闭包的好的介绍我不会在这里重复,但实质上,let是操纵词汇环境的最常用方法;在这种情况下,您希望为prev添加绑定,然后该绑定将可用于表单正文中的代码。您的函数see将“关闭”此绑定,因此每次调用see都可以访问它,即使您进行这些调用时,您将不再处于由此建立的词汇环境中。 let表格。在某种意义上,你可以说函数定义与它绑定。

由于您似乎错误地键入了prev的名称,因此您的函数正在尝试引用代码中尚未建立的绑定。