通过计算机程序的结构和解释中的练习,我一直在慢慢地工作。第1.1.5节讨论了 applicative 与 normal-order 评估,该主题随后在正文中出现了好几次。由于解释器使用应用顺序评估,因此只需在代码中插入调试语句即可轻松display
查看其工作原理。能够为正常顺序评估做同样的事情将有助于我的理解。
有谁知道使用正常顺序评估而不是应用顺序实现的 Scheme(或 Lisp)解释器?
更新:
这是一个从 SICP 中给出的示例修改的简短示例。我将定义自己的add
过程来打印参数,并使用square
书中的过程。
(define (add x y)
(display x)
(display y)
(newline)
(+ x y))
(define (square x) (* x x))
(square (add 1 2))
现在,如果我使用应用顺序评估运行短程序,则结果(add 1 2)
将只计算一次,然后传递给square
过程。操作数12
应在最终结果之前打印一次。我们可以在解释器中运行它来验证这就是发生的事情。
> (square (add 1 2))
12
9
但是,使用正常顺序求值时,(add 1 2)
应将单个操作数复制到square
过程中,该过程将求值为(* (add 1 2) (add 1 2))
. 操作数12
应在最终结果之前打印两次。
我希望能够在执行正常顺序评估的解释器中运行它,以验证它确实是如何工作的。