
Cpu time: 16 real time: 16 gc time: 0
#t
>(time (prime? 127691))
Cpu time: 0 real time: 0 gc time: 0
#t
8.7 Ленивые вычисления
Все, что мы рассмотрели в этом разделе относится к методологии программирования, называемой ленивые вычисления (англ. lazy)
Для сравнения посмотрим таблицу
-
Энергичные вычисления
Ленивые вычисления
Вызов по значению
Вызов по необходимости
Делай всё, что можешь
Не делай ничего, пока этого не потребуется
Вычислить аргумент, затем вызвать функцию
Аргументы передаются в не вычисленном виде
Использование задержек открывает нам новые возможности, но в то же время создаёт дополнительные сложности.
Нам приходится иметь дело с двумя структурами данных и двумя разновидностями процедур: процедурами для списков и процедурами для потоков параметры которых - отложенные выражения.
Разнообразия можно бы избежать, если бы все процедуры смогли принимать отложенные аргументы. Тем самым, полностью изменить стратегию вычислений и преобразовать наш язык программирования, в "ленивый" язык с нормальным порядком редукции.
Это обеспечило бы однородный и изящный способ упростить использование отложенных вычислений.
Почему же это не сделать с самого начала?
Кроме упоминавшихся уже соображений эффективности, есть ещё одна важная проблема.
Ленивые вычисления вступают в конфликт с императивным стилем программирования.
Поэтому, возможность использования отложенных вычислений отдана на откуп программисту, в надежде, что тот сумеет правильно ею распорядиться.
На этом мы заканчиваем знакомство с функциональным программированием.