(eval '(* a b)) 返回最终结果而不是中间结果 (* 2 3)

  • 本文关键字:结果 中间 eval 返回 scheme sicp
  • 更新时间 :
  • 英文 :


在 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))发生的事情就像你描述的那样。由于*不是特殊形式或宏,因此它会将其评估为过程对象,然后计算ab,然后应用从计算*中获得的过程与计算参数列表。它不会中途停止,因此您可以获得完整的评估。

还要知道*是一个变量。您可以通过评估*本身来查看其背后的过程。它不会显示*.

最新更新