没有值或未绑定 (No Value/Unbound)

一个你最常听到 Lisp 的抱怨是一个符号没有值或未绑定。数种不同的问题都用这种方式呈现。

局部变量,如 letdefun 设置的那些,只在创建它们的表达式主体里合法。所以要是我们试着在 创建变量的 let 外部引用它,

  1. > (progn
  2. (let ((x 10))
  3. (format t "Here x = ~A. ~%" x))
  4. (format t "But now it's gone...~%")
  5. x)
  6. Here x = 10.
  7. But now it's gone...
  8. Error: X has no value.

我们获得一个错误。当 Lisp 抱怨某些东西没有值或未绑定时,它的意思通常是你无意间引用了一个不存在的变量。因为没有叫做 x 的局部变量,Lisp 假定我们要引用一个有着这个名字的全局变量或常量。错误会发生是因为当 Lisp 试着要查找它的值的时候,却发现根本没有给值。打错变量的名字通常会给出同样的结果。

一个类似的问题发生在我们无意间将函数引用成变量。举例来说:

  1. > defun foo (x) (+ x 1))
  2. Error: DEFUN has no value

这在第一次发生时可能会感到疑惑: defun 怎么可能会没有值?问题的症结点在于我们忽略了最初的左括号,导致 Lisp 把符号 defun 解读错误,将它视为一个全局变量的引用。

有可能你真的忘记初始化某个全局变量。如果你没有给 defvar 第二个参数,你的全局变量会被宣告出来,但没有初始化;这可能是问题的根源。