it-swarm.com.ru

Что такое «thunk», используемый в Схеме или вообще?

Я встречал слово "thunk" во многих местах кода и документации, связанных со Схемой, и на подобных территориях. Я предполагаю, что это общее имя для процедуры, которая имеет единственный формальный аргумент. Это верно? Если да, есть ли что-то еще? Если нет, пожалуйста?

Например, в SRFI 18 , в разделе "Процедуры".

56
user59634

Это действительно просто. Если у вас есть какое-то вычисление, например, добавление 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.

Ленивые языки стирают грань между привязкой переменной к значению и созданием функции, которая возвращает это значение, так что написание чего-то вроде первой формы выше фактически обрабатывается как вторая, скрытая под капотом.

68
Svante

Thunk - это объект процедуры без формальных аргументов, например из вашей ссылки SRFI:

(lambda () (write '(b1)))

Переменная b1 связана во включающем блоке, и это дает нам ключ к этимологии слова "thunk", которое опирается на шутку о плохой грамматике.

Функция с нулевым аргументом не имеет возможности изменить свое поведение в зависимости от параметров, с которыми она вызывается, поскольку у нее нет параметров. Поэтому вся операция функции установлена ​​- она ​​просто ожидает выполнения. Больше не требуется "мысль" со стороны компьютера, все "мышление" выполнено - действие полностью "продуманно".

Вот и все, что "thunk" находится в контексте этого SRFI - процедура без аргументов.

39
Steven Huwig

Википедия имеет следующий ответ:

В функциональном программировании "thunk" - это другое имя для нулевой функции - функции, которая не принимает аргументов. Thunks часто используются на строгих языках как средство симуляции ленивых вычислений; сам thunk задерживает вычисление аргумента функции, и функция заставляет thunk получить фактическое значение. В этом контексте thunk часто называют приостановкой или (в схеме) обещанием.

Добавление пример ленивых вычислений на схеме . Здесь обещание - это еще одно слово для толка.

13
Johan Kotlinski