2012-09-13 60 views
2

我是Lisp的新手,我正在阅读有关ANSI Common Lisp第8章中的文本生成器示例。我遵循该示例并在LET变量的作用域中定义了一个函数“see” “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文件中。

然后当我回到REPL,并试图援引看到加载文件的编译版本之后,出现错误:

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

如何调用看正常吗?什么是词汇关闭?我都很困惑。

感谢您的帮助。

回答

4

看起来好像你已经键入prec而不是prev在封闭的let窗体中。

词法关闭是“关闭”词法环境的一部分(因此名称)的功能。在lisp中有很多关于闭包的介绍,我不想在这里重复,但实际上,let是操纵词汇环境的最常用方式;在这种情况下,您想要添加prev的绑定,该绑定随后可用于表单正文中的代码。您的功能see将“关闭”此绑定,因此每个拨打电话see都可以访问它,即使您进行这些呼叫时,您将不再处于由let表单建立的词汇环境中。从某种意义上说,你可以说函数的定义是和它绑定的。

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

+0

对不起,我以前没有答复。现在你已经指出了这个错误,我觉得很难发布这个,甚至没有注意到它!感谢您的耐心,您对词汇封闭的阐释是迄今为止我见过的最好,最简洁的一个! – user1667687