Отсроченная оценка - это когда выражение не оценивается, пока оно не понадобится. В большинстве языков вы используете что-то вроде lambda
, чтобы сделать эту работу. Вот надуманный пример, который показывает часть концепции:
def list_files():
for fn in os.listdir('.'):
yield fn, lambda: open(fn, 'r').read()
for fn, body in list_files():
if fn.endswith('.txt'):
print body()
Здесь list_files
возвращает набор имен файлов и "thunk" (лямбда без аргументов), которая возвращает содержимое файла. «Thunk» - это отложенная оценка. Использование thunks позволяет разделить ваши проблемы:
- Цикл for не должен знать, как читать файлы, поэтому
list_files
можно заменить на list_ftp_files
или list_zip_archive
.
- Функция
list_files
не должна знать, какие файлы будут прочитаны. С thunks, он не должен читать каждый файл.
При правильной отложенной оценке, после того, как вы оцените «thunk», он заменит себя оцененной копией, поэтому оценка его дважды будет не более трудоемкой, чем оценка один раз. Есть и другие способы сделать то же самое, например, с помощью классов и объектов, которые кэшируют значения.
Отложенная оценка - это (относительно) распространенная идиома в Схеме. В Haskell оценки по умолчанию откладываются, и вам не нужен какой-либо синтаксис для этого (есть специальный синтаксис для его отключения).