Я читаю следующий раздел 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
в качестве его параметра? Это будет означать, что analyze
будет вызываться каждый раз, когда вызывается eval
.
Что не так с моим пониманием? Буду признателен за любые отзывы, спасибо!