在 SICP 的 4.1.3 评估器数据结构中,它指出:
用户的程序是评估者的数据不一定是来源 的混乱。事实上,有时忽略这一点很方便 区别,并赋予用户显式评估 数据对象作为 Lisp 表达式,通过使eval可供使用 在程序中。许多 Lisp 方言提供了一个原始的评估过程 将表达式和环境作为参数并计算 相对于环境的表达式。
然后尝试
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
,然后应用从计算*
中获得的过程与计算参数列表。它不会中途停止,因此您可以获得完整的评估。
还要知道*
是一个变量。您可以通过评估*
本身来查看其背后的过程。它不会显示*
.