Что такое «thunk», используемый в схеме или вообще? - PullRequest
56 голосов
/ 29 мая 2009

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

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

Ответы [ 3 ]

68 голосов
/ 29 мая 2009

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

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

39 голосов
/ 29 мая 2009

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

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

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

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

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

13 голосов
/ 29 мая 2009

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

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

Добавление ленивого примера оценки в схему . Здесь обещание - это еще одно слово от thunk.

...