Что такое "удар", как используется в Схеме или вообще?
Я встречаю слово "thunk" во многих местах кода и документации, связанных с Scheme, и схожими территориями. Я предполагаю, что это общее имя для процедуры, которая имеет один формальный аргумент. Это верно? Если да, есть ли еще больше? Если нет, пожалуйста?
Например, в SRFI 18, в разделе "Процедуры".
Ответы
Ответ 1
Это действительно просто. Когда у вас есть какие-то вычисления, например добавление от 3 до 5, в вашей программе, то создание этого метода означает не вычислять его напрямую, а вместо этого создавать функцию с нулевыми аргументами, которая будет вычислять ее, когда требуется фактическое значение.
(let ((foo (+ 3 5))) ; the calculation is performed directly, foo is 8
;; some other things
(display foo)) ; foo is evaluated to 8 and printed
(let ((foo (lambda () (+ 3 5)))) ; the calculation is delayed, foo is a
; function that will perform it when needed
;; some other things
(display (foo))) ; foo is evaluated as a function, returns 8 which is printed
Во втором случае foo
будет называться thunk.
Ленивые языки размывают границу между привязкой переменной к значению и созданием функции для возврата этого значения, так что запись чего-то вроде первой формы выше фактически обрабатывается как вторая, под капотом.
Ответ 2
"thunk" - это объект процедуры без формальных аргументов, например. из ссылки SRFI:
(lambda () (write '(b1)))
Переменная b1 связана в охватывающем блоке, и это дает нам ключ к этимологии слова "thunk", который опирается на шутки о плохой грамматике.
Функция с нулевым аргументом не имеет возможности изменить свое поведение на основе параметров, с которыми он вызван, поскольку он не имеет параметров. Поэтому вся операция функции задана - она просто ждет исполнения. Никакой "мысли" не требуется со стороны компьютера, все "мышление" сделано - действие полностью "thunk" через.
Что все "thunk" находится в этом контексте SRFI - процедура без аргументов.
Ответ 3
Wikipedia имеет следующий ответ:
В функциональном программировании "thunk" - это другое имя для нулевой функции - функция, которая не принимает аргументов. Thunks часто используются в строгих языках как средство моделирования ленивой оценки; сам кусок задерживает вычисление аргумента функции, а функция заставляет thunk получать фактическое значение. В этом контексте ханк часто называют приостановкой или (в Схеме) обещанием.
Добавление ленивого примера оценки на Схеме. Здесь обещание - еще одно слово для thunk.