有人能用一些例子解释一下LISP中Apply和Eval之间的区别吗?

有人能用一些例子解释一下LISP中Apply和Eval之间的区别吗?,lisp,eval,apply,Lisp,Eval,Apply,有人能用一些例子解释一下LISP中Apply和Eval之间的区别吗? 我不明白。EVAL执行由Lisp数据结构构成的任意源代码。这包括函数调用、宏窗体、特殊窗体、变量和自评估数据 应用将函数应用于参数列表。APPLY将函数应用于某些参数: (apply + 1 2 3) ;=> 6 eval计算表达式: (eval '(+ 1 2 3)) ;=> 6 还有什么更好的方式来理解它,而不是看一看实际的实现!请参阅中的元循环计算器部分,它对eval和apply的内部工作原理有非常清楚的

有人能用一些例子解释一下LISP中Apply和Eval之间的区别吗?
我不明白。

EVAL执行由Lisp数据结构构成的任意源代码。这包括函数调用、宏窗体、特殊窗体、变量和自评估数据


应用将函数应用于参数列表。

APPLY
将函数应用于某些参数:

(apply + 1 2 3)
;=> 6
eval
计算表达式:

(eval '(+ 1 2 3))
;=> 6

还有什么更好的方式来理解它,而不是看一看实际的实现!请参阅中的元循环计算器部分,它对
eval
apply
的内部工作原理有非常清楚的解释。从书中引用:

Eval将表达式和环境作为参数。它对表达式进行分类并指导其评估。Eval的结构是对要评估的表达式的语法类型进行案例分析。为了保持程序的通用性,我们抽象地表示表达式类型的确定,不承诺对各种类型的表达式进行任何特定表示。每种类型的表达式都有一个测试它的谓词和一个选择其部分的抽象方法。这种抽象语法使我们很容易看到如何通过使用相同的计算器,但使用不同的语法过程集合来更改语言的语法

Apply接受两个参数,一个过程和该过程应应用到的参数列表。Apply将过程分为两类:调用Apply primitive过程来应用原语;它通过顺序计算构成过程主体的表达式来应用复合过程。复合过程主体的评估环境是通过扩展过程所承载的基本环境来构建的,以包括一个框架,该框架将过程的参数绑定到要应用该过程的参数


请注意,某些Lisp(如Common Lisp和Emacs Lisp)需要在应用
+
之前加上引号。否则他们会尝试对其求值。Common Lisp
eval
实际上不接受环境参数。它在当前动态环境和空词汇环境中计算其表达式参数。