Thunk и запоминание отложенного значения
Помеченный изменяемый объект может хранить отложенное вычисление, а затем заменять это представление значением, полученным при первом вызове force.
Какие изменения представления делают call-by-need видимым внутри вычислителя?
- Представление отложенной работы в виде помеченного изменяемого вектора
- Различение невычисленного thunk и вычисленного thunk
- Принудительное выполнение отложенного вычисления только при запросе его значения
- Мемоизация первого значения для последующих запросов
make-thunk сохраняет тег thunk, вычисление с нулевым количеством аргументов и пустой слот для результата. Создание этого вектора не вызывает вычисление, поэтому даже тело с ошибкой остается безвредным, если его никто не запрашивает.
force-it проверяет тег. При первом запросе процедура вызывает сохраненное вычисление, меняет тег на evaluated-thunk, удаляет вычисление и сохраняет значение. Последующие запросы выбирают кэшированный слот и не выполняют вычисление повторно. Это раскрывает изменение представления, которое ленивый вычислитель обычно скрывает за обработкой аргументов.
- Вывод
- —
- Значение
- —
- Диагностика
- —
Первая программа возвращает (10 10 1 evaluated-thunk). Вторая возвращает (thunk 0) без вычисления деления на ноль.
В первом запуске найдите одно применение сохраненного вычисления и изменения вектора, которые заменяют представление thunk. Второй force считывает кэшированное значение. Во втором запуске убедитесь, что не происходит ни применения деления, ни присваивания calls.
Измените программу и сравните результат.
Выполните force для delayed в третий раз в первой программе. Предскажите три значения, количество calls и итоговый тег перед запуском.
Показать подсказку
Когда тег равен evaluated-thunk, force-it считывает слот 2 без вызова слота 1.