有人可以用一些例子解释我在LISP中应用和评估的差异吗?
apply
适用的功能,一些参数:
(apply + 1 2 3)
;=> 6
eval
计算表达式:
(eval '(+ 1 2 3))
;=> 6
EVAL执行由Lisp的数据结构的任意的源代码。这包括函数调用,宏观形式,特殊形式,变量和自我评估数据。
APPLY应用一个函数的参数列表。
什么更好的方式去理解它,而不是看看实际执行!请参阅自循环直译器部分SICP,它有两个eval
和apply
的内部运作一个非常明确的解释。从书中引用:
评估和演示需要作为参数的表达和的环境。它对表达进行分类并指导其评估。 Eval的结构是对待评估表达式的语法类型的案例分析。为了保持程序的一般性,我们抽象地表达了对表达式类型的确定,不承诺对各种类型表达式的任何特定表示。每种类型的表达式都有一个测试它的谓词和一个用于选择其部分的抽象手段。这种抽象语法可以很容易地看到我们如何通过使用相同的评估程序来更改语言的语法,但使用不同的语法过程集合。
应用需要两个参数,一个过程和过程应该应用到的参数列表。将分类过程应用于两种:它调用apply-primitive-procedure来应用基元;它通过顺序评估组成过程主体的表达式来应用复合过程。用于化合物过程体的评价环境通过延伸通过的方法进行的碱环境中包括结合该过程的参数,以向所述程序是要应用的参数的框架构成。
Common Lisp'eval'实际上并不需要环境参数。它在当前动态环境和空词汇环境中评估其表达式参数。 – 2012-01-16 16:21:49
要知道,像Common Lisp的和Emacs-Lisp的一些Lisp的需要'+'被应用之前的报价。否则,他们会尝试评估它。 – Daimrod 2012-01-15 17:17:00