在clisp中,有什么不同?
(eval '(+ 1 2))
(eval (+ 1 2))
发布于 2011-04-12 15:53:04
第一种方法将列表(+ 1 2)
传递给eval
函数,该函数将计算该表达式,并生成答案,3.表达式'(+ 1 2)
是引用表达式的一种方式,因此表达式可以按字面顺序作为数据传递,而不是立即计算。然后将其传递给eval
函数,然后对其进行计算。
第二个将计算表达式(+ 1 2)
,以获得结果3
,然后将其传递给eval
函数。数字计算为自身,因此它将返回与第一种情况相同的答案,即3。
发布于 2011-04-12 15:52:40
似乎(eval (+ 12))首先计算(+ 12),然后使用(eval 3)。
(eval '(+ 1 2))将表达式(+ 12)转换为eval,让eval来解释它。
发布于 2011-09-17 08:18:30
所有函数(除了原语和一些特殊的函数),比如eval,首先计算它们的所有参数,然后将它们传递到它们的函数体中。
然而,人们可以通过引用论点来抑制对论点的评估。在这种情况下,S表达式本身作为参数传递,而不是首先计算它。
(eval (+ 12)) =>第一(+ 12)被求值=> (eval 3) =>给出答案3
(eval '(+ 12)) =>引号阻止参数得到求值,=> (+ 12)作为参数=>传递,但是S-表达式的计算结果也是3。
下面的例子可以更好地理解两者之间的区别:
(eval (+ 1 2) (+ 3 4)) =>这变成了(eval (3 )) => --这会产生"3不是函数“的错误,因为要计算的S表达式是(3 )
(eval '(cons (+ 1 2) (+ 3 4)) =>这就像在这个S-表达式的REPL =>计算中键入(+ 12) (+ 34),给出结果(3.7)
https://stackoverflow.com/questions/5638018
复制相似问题