apply将函数应用于某些参数:
(apply + 1 2 3)
;=> 6
Run Code Online (Sandbox Code Playgroud)
eval计算一个表达式:
(eval '(+ 1 2 3))
;=> 6
Run Code Online (Sandbox Code Playgroud)
有什么更好的理解方法,而不是看看实际的实现!看到自循环直译器部分SICP,它有两个内部工作非常明确的解释eval和apply.从书中引用:
Eval将表达式和环境作为参数.它对表达式进行分类并指导其评估.Eval的结构是要评估的表达式的句法类型的案例分析.为了保持程序的一般性,我们抽象地表达表达式的类型的确定,不对任何特定表示形式的各种类型的表达做出承诺.每种类型的表达式都有一个用于测试它的谓词和一个用于选择其部分的抽象方法.这种抽象语法使我们可以很容易地看到我们如何通过使用相同的求值程序来改变语言的语法,但是使用不同的语法过程集合.
Apply需要两个参数,一个过程和一个应该应用过程的参数列表.Apply将过程分为两类:它调用apply-primitive-procedure来应用原语; 它通过顺序评估构成过程主体的表达式来应用复合过程.评估复合过程主体的环境是通过扩展过程携带的基本环境来构造的,以包括一个框架,该框架将过程的参数绑定到要应用过程的参数.