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

(eval '(* a b)) return a final result rather than an intermediate (* 2 3)

4.1.3 Evaluator Data Structures of SICP中指出:

That the user's programs are the evaluator's data need not be a source of confusion. In fact, it is sometimes convenient to ignore this distinction, and to give the user the ability to explicitly evaluate a data object as a Lisp expression, by making eval available for use in programs. Many Lisp dialects provide a primitive eval procedure that takes as arguments an expression and an environment and evaluates the expression relative to the environment.

然后用

进行实验
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的理解有误吗?

基本上,(eval '(* a b)) 的幕后情况正如您所描述的那样。由于 * 不是特殊形式或宏,因此它对过程对象求值,然后求值 ab,然后应用从求值 * 得到的过程与评估参数的列表。它不会中途停止,因此您可以获得完整的评估。

又知道*是一个变量。其背后的过程你可以通过自己评估*看到。它不会显示 *.