What is a 'thunk', as used in Scheme or in general?

17,034

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.

Share:
17,034
Admin
Author by

Admin

Updated on June 03, 2022

Comments

  • Admin
    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
    Admin almost 15 years
    Thank You. I am looking for something better. Wikipedia doesn't explain things and concepts I really want to know.
  • tvanfosson
    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
    Admin almost 15 years
    @tvanfosson probablty it was edited after the original post. @kotlinski will it be possible to demonstrate it somehow?
  • Johan Kotlinski
    Johan Kotlinski almost 15 years
    OK, added an example... This is also explained well in Paradigms of Artificial Intelligence Programming by Peter Norvig (examine delay/force examples).
  • Admin
    Admin almost 15 years
    Scheme 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
    Svante almost 15 years
    Please look at the link kotlinski (stackoverflow.com/questions/925365/…) provided for how Scheme implements a lazy evaluation scheme.
  • Admin
    Admin almost 15 years
    'force' and 'delay' seems to have been removed from the R6RS.
  • Admin
    Admin almost 15 years
    Yes. I did. However, my query here was: Will creating a lambda as above delay the evaluation in a non-Lazy language like Scheme?
  • Svante
    Svante almost 15 years
    Yes, of course. Why shouldn't it? Lazy just means that you don't have to do this explicitly, like the above.
  • Svante
    Svante almost 15 years
    I should add that a good lazy evaluation scheme (like the one in Scheme) also memoizes the result of a thunk.
  • Admin
    Admin almost 15 years
    You mean the one using 'delay' or the one using a thunk? And it happens automagically ?
  • Svante
    Svante almost 15 years
    The builtin delay/force mechanism automatically memoizes the result. What I showed above does exactly what it shows, nothing more.
  • SasQ
    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
    mynameistechno about 9 years
    Thanks for explaining why it is called a "thunk"
  • kayleeFrye_onDeck
    kayleeFrye_onDeck almost 7 years
    JavaScript Promise==thunk, or JavaScript Promise===thunk? :)