谁能解释一下eval函数为什么会这样?
(eval (list 'cons t nil)) returns (T)
(eval (list 'cons 'a nil)) causes an error
(eval (list 'cons ''a nil)) returns (A)
First:
(CONS T NIL)
T是一个常量,计算后返回T。NIL也是一个常量,计算结果为NIL。(CONS T NIL)则返回(T)。NIL),更短地写成(T)。
第二:(CONS A NIL)
A是变量。它可能没有定义。当A未定义时,计算它将导致错误。
第三:现在你应该考虑第三种形式…
您可能想要注意的另一件事是,第三种形式是在列表中嵌入符号A。通常这是Lisp书籍中教授的通过在REPL上进行实验来学习的形式。然而,在实际的程序/函数中,您最初可能更多地将A表示的值或列表放在列表中,而不是符号A。
。(setf a 2)
(eval (list 'cons a nil)) => (2) [a在list被求值之前被求值;(eval '(cons 2 nil))]
(eval (list 'cons 'a nil)) =>(2)[当(eval '(cons 'a nil))求值时,a被求值]
(eval (list 'cons 'a nil)) => (a)[调用is (eval '(cons 'a nil))时a不被求值];[a为符号a]
如果一开始没有设置(setf a 2),那么第1和第2种形式都会报错。这是因为当a被求值时,它是无界的(即,粗略地说,它没有任何与之相关的值)