I'm reading the following section of SICP
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-26.html#%_sec_4.1.7
According to the text, the following transformation of eval
will improve offers a performance improvement, since an expression that gets evaluated many times will only be analyzed once?
(define (eval exp env)
((analyze exp) env))
Here is an analyze
function given in the book:
(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)))))
I don't understand why the book says that analyze
will only run once. Doesn't the the body of eval
, which is ((analyze exp) env))
basically say that each time eval
is called, analyze
will be called with exp
as its parameter? This would mean that analyze
would be called every time eval
is called.
What's wrong with my understanding? I would appreciate any feedback, thanks!