关于普通lisp中的函数eval

时间:2011-09-10 01:16:40

标签: common-lisp

有人可以解释为什么函数eval的行为如此吗?

(eval (list 'cons t nil)) returns (T)

(eval (list 'cons 'a nil)) causes an error

(eval (list 'cons ''a nil)) returns (A)

非常感谢。

2 个答案:

答案 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被评估时,它没有界限(即粗略地,它没有任何与之相关的值)