我正在阅读 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/