没有值或未绑定 (No Value/Unbound)
一个你最常听到 Lisp 的抱怨是一个符号没有值或未绑定。数种不同的问题都用这种方式呈现。
局部变量,如 let
与 defun
设置的那些,只在创建它们的表达式主体里合法。所以要是我们试着在 创建变量的 let
外部引用它,
> (progn
(let ((x 10))
(format t "Here x = ~A. ~%" x))
(format t "But now it's gone...~%")
x)
Here x = 10.
But now it's gone...
Error: X has no value.
我们获得一个错误。当 Lisp 抱怨某些东西没有值或未绑定时,它的意思通常是你无意间引用了一个不存在的变量。因为没有叫做 x
的局部变量,Lisp 假定我们要引用一个有着这个名字的全局变量或常量。错误会发生是因为当 Lisp 试着要查找它的值的时候,却发现根本没有给值。打错变量的名字通常会给出同样的结果。
一个类似的问题发生在我们无意间将函数引用成变量。举例来说:
> defun foo (x) (+ x 1))
Error: DEFUN has no value
这在第一次发生时可能会感到疑惑: defun
怎么可能会没有值?问题的症结点在于我们忽略了最初的左括号,导致 Lisp 把符号 defun
解读错误,将它视为一个全局变量的引用。
有可能你真的忘记初始化某个全局变量。如果你没有给 defvar
第二个参数,你的全局变量会被宣告出来,但没有初始化;这可能是问题的根源。
当前内容版权归 readthedocs 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 readthedocs .