2011-04-12 189 views

回答

7

首先将通过列表(+ 1 2),这类似于你会得到什么,如果你写(cons '+ (cons 1 (cons 2 nil)),到eval功能,然后将评估该表达式,并产生答案,3.表达'(+ 1 2)一种方法引用表达式,以便表达式可以作为数据字面传递,而不是立即进行评估。将它传递给eval函数将对其进行评估。

第二将评估表达式(+ 1 2)得到结果3,然后将其传递给eval功能。一些评估本身,所以它会返回相同的答案,因为第一种情况下,3

3

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

(EVAL“(+ 1 2))将转移表达( + 1 2)来评估,并让eval来解释它。

1

所有功能(除了原语和一些特殊功能)喜欢的eval首先评估自己的所有参数,然后通过他们自己的函数体内。

然而,我们可以引述他们抑制参数评价。在这种情况下,S表达式本身作为参数传递,而不是先评估它。

(EVAL(+ 1 2))=>首先(+ 1 2)获取评估=>(EVAL 3)=>这给出答案3

(EVAL“(+ 1 2))=>报价防止从论点得到评价=>(+ 1 2)作为参数=>然而评估该S-表达导致被传递也是3.

的差别可以理解从下面的示例更好:

(EVAL (利弊(+ 1 2)(+ 3 4)))=>这成为(EVAL(3 7))=>这给出错误 “3不是一个函数” 为S-表达要被评估(3 7 )

(EVAL“(利弊(+ 1 2)(+ 3 4)))=>此变得像输入(利弊(+ 1 2)(+ 3 4))上REPL的这个=>评价为S表达产生结果(3.7)

相关问题