2009-05-29 5 views
46

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

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

+1

Возможный дубликат [Что такое 'thunk'?] (Http://stackoverflow.com/questions/2641489/what-is-a-thunk) – Stephan

ответ

56

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

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

+1

Схема не ленивый, не так ли? (в «Обзор схемы» в r6rs). Итак, если я создаю мысли, как и выше, это создаст ленивый оценочный сценарий? – 2009-05-29 15:09:14

+1

^s/think/thunk/(мой плохой) – 2009-05-29 15:09:55

+1

Пожалуйста, посмотрите на ссылку kotlinski (http://stackoverflow.com/questions/925365/what-is-a-thunk-as-used-in-scheme-or- в целом/925373 № 925373), предусматривается, как схема реализует ленивую схему оценки. – Svante

12

Wikipedia имеет следующий ответ:

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

Добавление lazy evaluation example in Scheme. Здесь обещание - еще одно слово для ума.

+2

Спасибо. Я ищу что-то лучшее. Википедия не объясняет вещи и понятия, которые я действительно хочу знать. – 2009-05-29 10:37:55

+1

@Amit - Я предполагаю, что вы прокомментировали, прежде чем вопрос был обновлен цитатой. Это точный ответ на ваш вопрос. – tvanfosson

+1

@tvanfosson probablty был отредактирован после оригинального сообщения. @kotlinski можно будет каким-то образом это продемонстрировать? – 2009-05-29 10:47:15

33

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

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

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

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

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

+5

Спасибо, что объяснил, почему это называется «удар», – mynameistechno