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

<p>я встречал слово "thunk" во многих местах кода и документации, связанных со схемой, и на подобных территориях. я предполагаю, что это общее имя для процедуры, которая имеет единственный формальный аргумент. это верно? если да, есть ли что-то еще? если нет, пожалуйста?</p><p>например, в <a href="http://srfi.schemers.org/srfi-18/srfi-18.html">srfi 18</a> , в разделе "процедуры".</p>

<p>это действительно просто. если у вас есть какое-то вычисление, например, добавление 3 к 5, в вашей программе, то создание его последовательности означает <em>не</em>, чтобы вычислить его напрямую, а вместо этого создать функцию с нулевыми аргументами, которая будет вычислять его, когда фактическое значение необходимо.</p><pre><code>(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 </code></pre><p>во втором случае <code>foo</code> будет называться thunk.</p><p>ленивые языки стирают грань между привязкой переменной к значению и созданием функции, которая возвращает это значение, так что написание чего-то вроде первой формы выше фактически обрабатывается как вторая, скрытая под капотом.</p>

<p>thunk - это объект процедуры без формальных аргументов, например из вашей ссылки srfi:</p><pre><code>(lambda () (write '(b1))) </code></pre><p>переменная b1 связана во включающем блоке, и это дает нам ключ к этимологии слова "thunk", которое опирается на шутку о плохой грамматике.</p><p>функция с нулевым аргументом не имеет возможности изменить свое поведение в зависимости от параметров, с которыми она вызывается, поскольку у нее нет параметров. поэтому вся операция функции установлена - она просто ожидает выполнения. больше не требуется "мысль" со стороны компьютера, все "мышление" выполнено - действие полностью "продуманно".</p><p>вот и все, что "thunk" находится в контексте этого srfi - процедура без аргументов.</p>

<p> <a href="http://en.wikipedia.org/wiki/thunk">википедия</a> имеет следующий ответ:</p><blockquote> <p>в функциональном программировании "thunk" - это другое имя для нулевой функции - функции, которая не принимает аргументов. thunks часто используются на строгих языках как средство симуляции ленивых вычислений; сам thunk задерживает вычисление аргумента функции, и функция заставляет thunk получить фактическое значение. в этом контексте thunk часто называют приостановкой или (в схеме) обещанием.</p> </blockquote><p>добавление <a href="https://web.archive.org/web/20090622072128/http://www.ibm.com/developerworks/linux/library/l-lazyprog.html">пример ленивых вычислений на схеме</a> . здесь обещание - это еще одно слово для толка.</p>