有人可以解释为什么函数eval的行为如此吗?
(eval (list 'cons t nil)) returns (T)
(eval (list 'cons 'a nil)) causes an error
(eval (list 'cons ''a nil)) returns (A)
非常感谢。
答案 0 :(得分:4)
首先:
(CONS T NIL)
T是常量,在评估时返回T. NIL也是常数,并且评估为NIL。 (CONS T NIL)然后返回(T.NIL),写得更短(T)。
第二
(CONS A NIL)
A是变量。它可能是未定义的。当A未定义时,评估它将导致错误。
第三
现在你应该考虑第三种形式......
答案 1 :(得分:0)
您可能需要注意的另一件事是第三种形式是在列表中嵌入符号A.通常这是一种形式,主要是在Lisp书籍中通过实验REPL来学习。但是在实际的程序/功能中,您最初可能会更多地使用列表中的A表示的值或列表,而不是符号A.
e.g。 (setf a 2)
(eval(list'cons a nil))=> (2)[A在评估列表之前进行评估; (eval'(cons 2 nil))]
(eval(list'cons'a nil))=> (2)当评估(eval'(cons a nil))时评估[A]
(eval(list'cons''a nil))=> (A)[A未被评估为呼叫是(eval'(cons'na nil)); 'a是符号A]
如果你不在开头做(setf a 2),那么第一和第二两种形式都会出错。这是因为当a被评估时,它没有界限(即粗略地,它没有任何与之相关的值)