关于常用lisp中eval函数的介绍



谁能解释一下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被求值时,它是无界的(即,粗略地说,它没有任何与之相关的值)

最新更新