Сравните две версии analyze-sequence
Лиза П. Хакер не понимает, зачем делать
analyze-sequence
такой сложной. Все остальные процедуры анализа — простые трансформации соответствующих вычисляющих процедур (или ветвей
eval
) из раздела 4.1.1. Лиза ожидала, что
analyze-sequence
будет выглядеть так:
(define (analyze-sequence exps)
(define (execute-sequence procs env)
(cond ((null? (cdr procs)) ((car procs) env))
(else ((car procs) env)
(execute-sequence (cdr procs) env))))
(let ((procs (map analyze exps)))
(if (null? procs)
(error "Empty sequence -- ANALYZE"))
(lambda (env) (execute-sequence procs env))))
Ева Лу Атор объясняет Лизе, что версия в тексте проделывает больше работы по вычислению последовательности во время анализа. В Лизиной исполнительной процедуре вызовы частичных исполнительных процедур, вместо того, чтобы быть встроенными, перебираются в цикле. В результате, хотя отдельные выражения в последовательности оказываются проанализированы, сама последовательность анализируется во время выполнения.
Сравните две версии
analyze-sequence
. Рассмотрите, например, обычный случай (типичный для тел процедур), когда в последовательности только одно выражение. Какую работу будет делать исполнительная процедура, предложенная Лизой? А процедура из текста раздела? Как соотносятся эти две процедуры в случае последовательности из двух выражений?
Комментарии отсутствуют.