【问题标题】:Unbound variable in Common LispCommon Lisp 中的未绑定变量
【发布时间】:2012-09-13 06:47:35
【问题描述】:

我是 Lisp 新手,我正在阅读 ANSI Common Lisp 第 8 章中的一个文本生成器示例。我按照示例并在 LET 变量“prec”的范围内定义了一个函数“see”,

(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]

如何正确调用 see?什么是词法闭包?我都糊涂了。

感谢您的帮助。

【问题讨论】:

    标签: common-lisp


    【解决方案1】:

    您似乎在封闭的let 表单中输入了prec 而不是prev。

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

    由于您似乎打错了 prev 的名称,您的函数正试图引用在代码中当时尚未建立的绑定。

    【讨论】:

    • 对不起,我没有早点回复。既然你已经指出了错字,我什至没有注意到就发布了这个感觉真的很尴尬!感谢您的耐心等待,您对词汇闭合的阐释是迄今为止我所见过的最好、最简洁的阐释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多