lisp - 关于SICP chpt 4.1 : How does (analyze expr) help speed up eval?的问题

标签 lisp scheme sicp

我正在阅读 SICP 的以下部分

http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-26.html#%_sec_4.1.7

根据文本,eval 的以下转换将提高性能,因为多次计算的表达式只会被分析一次?

(define (eval exp env)
    ((analyze exp) env))

这是书中给出的一个analyze函数:

(define (analyze-if exp)
(let ((pproc (analyze (if-predicate exp)))
    (cproc (analyze (if-consequent exp)))
        (aproc (analyze (if-alternative exp))))
    (lambda (env)
        (if (true? (pproc env))
            (cproc env)
                (aproc env)))))

我不明白为什么书上说analyze只会运行一次。 eval 的主体不是 ((analyze exp) env)) 基本上说每次调用 eval 时,analyze 将以 exp 作为参数调用?这意味着每次调用 eval 时都会调用 analyze

我的理解有什么问题吗?我将不胜感激任何反馈,谢谢!

最佳答案

的确,每次以程序代码作为参数调用eval时,都会调用句法求值器。然而,当该代码中的一个函数调用该代码中的另一个函数时(或者,在最简单的情况下,它通过递归调用自身),内部 apply 将获得分析的表达式(最后lambda 函数)作为参数,而不是需要再次进行语法分析才能执行的代码块。

关于lisp - 关于SICP chpt 4.1 : How does (analyze expr) help speed up eval?的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927917/

相关文章:

recursion - 有人可以解释递归在这些过程中是如何工作的吗

sicp - 计算过程和程序之间的区别?

lisp - 在 autocad 的连接点上打破多段线 - 任何 lisp 函数?

lisp - Lisp 中的序列

oop - Clojure 的 CLOS?

functional-programming - 查找输入中某个标记值(例如 -999)之前出现的非负数的平均值

scheme - 在 Scheme 中检查对象是否为 "listdiff"

common-lisp - 使用change-class从数字创建多项式对象

scheme - 打印列表的相邻副本(方案)

scheme - 在 Racket 中的宏扩展期间评估表单