Common lisp (eval&x27;(&x2B;12))和(eval(&x2B;12))之间的差异?

Common lisp (eval&x27;(&x2B;12))和(eval(&x2B;12))之间的差异?,common-lisp,Common Lisp,在clisp中,有什么区别 (eval '(+ 1 2)) (eval (+ 1 2)) 看来 (eval(+12))将首先计算(+12),然后使用(eval 3) (eval'(+12))将表达式(+12)转移到eval,并让eval对其进行解释。第一个将通过列表(+12),这与编写(cons'+(cons 1(cons 2 nil))时得到的结果类似,调用eval函数,然后该函数将计算该表达式并生成答案,3.表达式'(+1 2)是引用表达式的一种方式,因此表达式可以作为数据直接传递,而不

clisp中,有什么区别

(eval '(+ 1 2))

(eval (+ 1 2))
看来 (eval(+12))将首先计算(+12),然后使用(eval 3)


(eval'(+12))将表达式(+12)转移到eval,并让eval对其进行解释。

第一个将通过列表
(+12)
,这与编写
(cons'+(cons 1(cons 2 nil))时得到的结果类似
,调用
eval
函数,然后该函数将计算该表达式并生成答案,3.表达式
'(+1 2)
是引用表达式的一种方式,因此表达式可以作为数据直接传递,而不是立即求值。将其传递给
eval
函数将对其求值

第二个将计算表达式
(+1 2)
,得到结果
3
,然后将结果传递给
eval
函数。一个数字自身计算,因此它将返回与第一个情况相同的答案,3。

所有函数(除了原语和一些特殊函数)像eval一样,首先计算它们的所有参数,然后将它们传递到函数体中

但是,可以通过引用参数来抑制对参数的求值。在这种情况下,S表达式本身作为参数传递,而不是首先求值

(eval(+12))=>首先对(+12)进行评估=>(eval 3)=>这给出了答案3

(eval'(+1 2))=>引号阻止对参数求值=>(+1 2)作为参数=>传递,但对该S表达式求值的结果也是3

通过以下示例可以更好地理解差异:

(eval(cons(+1 2)(+3 4))=>这将变成(eval(3 7))=>由于要计算的S表达式是(3 7),这将给出“3不是函数”的错误

(eval’(cons(+12)(+34))=>这就像在REPL上键入(cons(+12)(+34))=>对该S表达式的求值给出结果(3.7)