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

问题描述 投票:0回答:1

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产生要应用的参数和过程的值,而不是最终结果。

我对评估的理解错了吗?

scheme sicp
1个回答
0
投票
基本上,(eval '(* a b))在引擎盖下发生的情况就是您所描述的。由于*不是特殊形式或宏,因此将其评估为过程对象,然后评估ab,然后将通过评估*获得的过程与评估参数列表一起应用。它不会中途停止,因此您可以获得完整的评估。

也知道*是变量。您可以通过自己评估*来查看其背后的过程。它不会显示*

© www.soinside.com 2019 - 2024. All rights reserved.