在4.1.3 Evaluator Data Structures of SICP中指出:
然后尝试使用用户程序是评估者的数据,不必是源混乱。实际上,有时忽略这一点很方便区别,并使用户能够明确评估通过使eval可用,将数据对象作为Lisp表达式在程序中。许多Lisp方言提供了原始的[[eval过程以一个表达式和一个环境作为参数并求值相对于环境的表达式。
Chez Scheme Version 9.5
Copyright 1984-2017 Cisco Systems, Inc.
> (define a 5)
> (define b 6)
> (eval '(* a b))
30
我认为结果没有意义,因为它既有效又适用。[根据我从后续内容中学到的,我预测结果应该是
> (eval '(* a b)) '(* (5 6))
然后将*应用于值列表(5 6)。Eval产生要应用的参数和过程的值,而不是最终结果。
我对评估的理解错了吗?
(eval '(* a b))
在引擎盖下发生的情况就是您所描述的。由于*
不是特殊形式或宏,因此将其评估为过程对象,然后评估a
和b
,然后将通过评估*
获得的过程与评估参数列表一起应用。它不会中途停止,因此您可以获得完整的评估。 也知道*
是变量。您可以通过自己评估*
来查看其背后的过程。它不会显示*
。