What is a 'thunk', as used in Scheme or in general?
Solution 1
It is really simple. When you have some computation, like adding 3 to 5, in your program, then creating a thunk of it means not to calculate it directly, but instead create a function with zero arguments that will calculate it when the actual value is needed.
(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
In the second case, foo
would be called a thunk.
Lazy languages blur the line between binding a variable to a value and creating a function to return that value, so that writing something like the first form above is actually treated like the second, under the hood.
Solution 2
A "thunk" is a procedure object with no formal arguments, e.g. from your SRFI link:
(lambda () (write '(b1)))
The b1 variable is bound in the enclosing block, and this gives us a clue to the etymology of the word "thunk," which relies on a joke about poor grammar.
A zero-argument function has no way to change its behavior based on parameters it is called with, since it has no parameters. Therefore the entire operation of the function is set -- it is just waiting to be executed. No more "thought" is required on the part of the computer, all of the "thinking" has been done -- the action is completely "thunk" through.
That's all a "thunk" is in this SRFI's context -- a procedure with no arguments.
Solution 3
Wikipedia has the following answer:
In functional programming, "thunk" is another name for a nullary function — a function that takes no arguments. Thunks are frequently used in strict languages as a means of simulating lazy evaluation; the thunk itself delays the computation of a function's argument, and the function forces the thunk to obtain the actual value. In this context, a thunk is often called a suspension or (in Scheme) a promise.
Adding a lazy evaluation example in Scheme. Here, promise is another word for thunk.
Admin
Updated on June 03, 2022Comments
-
Admin almost 2 years
I come across the word 'thunk' at a lot of places in code and documentation related to Scheme, and similar territories. I am guessing that it is a generic name for a procedure, which has a single formal argument. Is that correct? If yes, is there more to it? If no, please?
For eg. in SRFI 18, in the 'Procedures' section.
-
Admin almost 15 yearsThank You. I am looking for something better. Wikipedia doesn't explain things and concepts I really want to know.
-
tvanfosson almost 15 years@Amit -- I assume you commented before the question was updated with the quote. This is the exact answer to your question.
-
Admin almost 15 years@tvanfosson probablty it was edited after the original post. @kotlinski will it be possible to demonstrate it somehow?
-
Johan Kotlinski almost 15 yearsOK, added an example... This is also explained well in Paradigms of Artificial Intelligence Programming by Peter Norvig (examine delay/force examples).
-
Admin almost 15 yearsScheme is not a lazy language, right? (in 'Overview of Scheme' in r6rs). So, iff I create a think, like above, it will create a lazy evaluation scenario?
-
Svante almost 15 yearsPlease look at the link kotlinski (stackoverflow.com/questions/925365/…) provided for how Scheme implements a lazy evaluation scheme.
-
Admin almost 15 years'force' and 'delay' seems to have been removed from the R6RS.
-
Admin almost 15 yearsYes. I did. However, my query here was: Will creating a lambda as above delay the evaluation in a non-Lazy language like Scheme?
-
Svante almost 15 yearsYes, of course. Why shouldn't it? Lazy just means that you don't have to do this explicitly, like the above.
-
Svante almost 15 yearsI should add that a good lazy evaluation scheme (like the one in Scheme) also memoizes the result of a thunk.
-
Admin almost 15 yearsYou mean the one using 'delay' or the one using a thunk? And it happens automagically ?
-
Svante almost 15 yearsThe builtin delay/force mechanism automatically memoizes the result. What I showed above does exactly what it shows, nothing more.
-
SasQ about 10 years@Svante what yo described is delayed or "lazy" evaluation, which is usually implemented as a thunk, but it's not a thunk in itself. Thunk is a more general idea which is used to implement more different ideas than just lazy-evaluated expressions.
-
mynameistechno about 9 yearsThanks for explaining why it is called a "thunk"
-
kayleeFrye_onDeck almost 7 yearsJavaScript Promise==thunk, or JavaScript Promise===thunk? :)