【发布时间】:2012-01-15 11:56:37
【问题描述】:
有人可以用一些例子来解释一下 LISP 中 Apply 和 Eval 之间的区别吗? 看不懂。
【问题讨论】:
有人可以用一些例子来解释一下 LISP 中 Apply 和 Eval 之间的区别吗? 看不懂。
【问题讨论】:
EVAL 执行由 Lisp 数据结构构成的任意源代码。这包括函数调用、宏形式、特殊形式、变量和自评估数据。
APPLY 将函数应用于参数列表。
【讨论】:
有什么更好的方式来理解它,而不是看看实际的实现!请参阅SICP 中的 Metacircular Evaluator 部分,它对eval 和apply 的内部工作原理进行了非常清晰的解释。引用书中的内容:
Eval 将表达式和环境作为参数。它对表达式进行分类并指导其评估。 Eval 的结构是对要评估的表达式的句法类型的案例分析。为了保持过程的一般性,我们抽象地表达了表达式类型的确定,不承诺对各种类型的表达式进行任何特定的表示。每种类型的表达式都有一个对其进行测试的谓词和一个用于选择其部分的抽象方法。这种抽象语法让我们很容易看到我们如何通过使用相同的求值器,但使用不同的语法过程集合来改变语言的语法。
Apply 有两个参数,一个过程和应该应用该过程的参数列表。 Apply将过程分为两类:调用apply-primitive-procedure应用原语;它通过顺序评估构成过程主体的表达式来应用复合过程。评估复合过程主体的环境是通过扩展过程承载的基本环境来构建的,以包含一个框架,该框架将过程的参数绑定到要应用该过程的参数。
【讨论】:
eval 实际上并不接受环境参数。它在当前动态环境和空词法环境中评估其表达式参数。
apply 将函数应用于某些参数:
(apply + 1 2 3)
;=> 6
eval 计算一个表达式:
(eval '(+ 1 2 3))
;=> 6
【讨论】:
+ 之前加上引号。否则他们会尝试评估它。