在计划或一般情况下使用的“thunk”是什么?

我在许多与Scheme有关的代码和文档以及类似领域遇到过“thunk”这个词。 我猜测这是一个程序的通用名称,有一个正式的论点。 那是对的吗? 如果是的话,还有更多吗? 如果不是,请吗?

例如。 在SRFI 18的“程序”部分。

这真的很简单。 当你有一些计算,比如在你的程序中join3到5,那么创build一个thunk就意味着不要直接计算它,而是创build一个带有零参数的函数,当需要实际值时计算它。

(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。

懒惰的语言模糊了将variables绑定到一个值和创build一个返回该值的函数之间的界限,因此,像上面的第一个表单一样,实际上就像第二个表单一样处理。

“thunk”是没有正式参数的过程对象,例如来自您的SRFI链接:

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

b1variables绑定在封闭块中,这给了我们一个“thunk”这个词的词源的线索,这个词依赖于关于语法差的笑话。

由于它没有参数,因此零参数函数无法根据调用的参数来改变其行为。 因此,该函数的整个操作被设置 – 它只是等待被执行。 计算机不再需要“思考”,所有的“思考”都已经完成了 – 这个动作完全是“通过”。

这就是在这个SRFI的背景下 – 一个没有争论的程序。

维基百科有以下答案:

在函数式编程中,“thunk”是nullary函数的另一个名字 – 一个不带任何参数的函数。 Thunk通常用严格的语言作为模拟懒惰评估的手段; thunk本身延迟了函数参数的计算,并且该函数强制thunk获得实际值。 在这种情况下,thunk通常被称为暂停或(在Scheme中)一个承诺。

在Scheme中添加一个懒惰的评估示例 。 在这里,承诺是另一个词的thunk。