(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))
的幕后情况正如您所描述的那样。由于 *
不是特殊形式或宏,因此它对过程对象求值,然后求值 a
和 b
,然后应用从求值 *
得到的过程与评估参数的列表。它不会中途停止,因此您可以获得完整的评估。
又知道*
是一个变量。其背后的过程你可以通过自己评估*
看到。它不会显示 *
.
在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))
的幕后情况正如您所描述的那样。由于 *
不是特殊形式或宏,因此它对过程对象求值,然后求值 a
和 b
,然后应用从求值 *
得到的过程与评估参数的列表。它不会中途停止,因此您可以获得完整的评估。
又知道*
是一个变量。其背后的过程你可以通过自己评估*
看到。它不会显示 *
.