什么是“thunk”,在Scheme或一般情况下使用时是指什么?

73

我在与Scheme和类似领域相关的代码和文档中经常遇到“thunk”一词。我猜它是一个泛称,用于表示只有一个形参的过程。这个猜想正确吗?如果是,还有其他方面需要注意吗?如果不是,请说明原因。

例如,在SRFI 18的“Procedures”部分。


2
可能是什么是'thunk'?的重复问题。 - Stephan
3个回答

90

这非常简单。当您在程序中进行某些计算(例如将3和5相加)时,创建一个thunk意味着不要直接计算它,而是创建一个零参数函数,在需要实际值时才进行计算。

(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。
惰性语言模糊了将变量绑定到值和创建函数以返回该值之间的界限,因此编写类似上面第一种形式的代码实际上在底层被视为第二种形式。

1
Scheme 不是一种惰性语言,对吧?(在 r6rs 的“Scheme 概述”中)。因此,如果我像上面那样创建一个东西,它会创建一个惰性求值的情况吗? - user59634
1
请查看链接kotlinski(https://dev59.com/E3NA5IYBdhLWcg3whuZ_#925373),了解Scheme如何实现惰性求值方案。 - Svante
1
是的,我做到了。然而,我的问题是:在像Scheme这样的非惰性语言中创建一个类似上面的lambda会延迟评估吗? - user59634
1
当然可以。为什么不行呢?“懒惰”只是意味着你不必像上面那样显式地做这件事。 - Svante
@Svante所描述的是延迟或“惰性”评估,通常实现为thunk,但它本身不是thunk。Thunk是一个更一般的概念,用于实现比仅延迟评估表达式更多的想法。 - SasQ
显示剩余3条评论

46

"thunk"是一个没有形式参数的过程对象,例如在您提供的SRFI链接中:

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

b1变量被绑定在封闭块中,这让我们想到了“thunk”这个词的词源,它基于一个关于语法错误的笑话。

零参函数没有办法根据其被调用时的参数改变其行为,因为它没有参数。因此,整个函数的操作都已经设定好了——它只是在等待执行。计算机不需要再做更多的“思考”,所有的“思考”都已经完成——动作完全已经确定("thunked" through)。

在这个 SRFI 的上下文中,“thunk”只是一个没有参数的过程。


11
感谢您解释"thunk"的含义。 - mynameistechno

20

维基百科 给出了以下解释:

在函数式编程中,“thunk”是一个无参数函数的另一种称呼。在严格语言中,Thunk经常被用作模拟惰性求值的手段;Thunk本身会延迟计算函数的参数,并且函数会强制Thunk获取实际值。在这个背景下,Thunk通常被称为“悬挂”或(在Scheme中)“Promise”。

在这里,我们添加了Scheme中的惰性求值示例。在这里,“promise”是thunk的另一个词。


4
谢谢。我正在寻找更好的东西。维基百科没有解释我真正想了解的事物和概念。 - user59634
1
@Amit -- 我假设在问题更新引用之前你曾经进行过评论。这是你问题的确切答案。 - tvanfosson
1
@tvanfosson 可能是在原帖发布后进行了编辑。 @kotlinski 是否有可能以某种方式演示它? - user59634
1
好的,添加一个例子...这在Peter Norvig的《人工智能编程范式》中也有很好的解释(请查看delay/force示例)。 - Johan Kotlinski
1
“force”和“delay”似乎已被从R6RS中移除。 - user59634
JavaScript Promise==thunk,还是JavaScript Promise===thunk? :) - kayleeFrye_onDeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接