【问题标题】:What is a 'thunk', as used in Scheme or in general?什么是“thunk”,在 Scheme 或一般情况下使用?
【发布时间】:2010-10-29 20:22:49
【问题描述】:

我在与 Scheme 和类似领域相关的代码和文档的很多地方都遇到了“thunk”这个词。我猜它是一个过程的通用名称,它有一个形式参数。那是对的吗?如果是的话,还有更多吗?如果没有,请问?

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

【问题讨论】:

标签: programming-languages functional-programming scheme


【解决方案1】:

Wikipedia 有以下答案:

在函数式编程中,“thunk”是空函数的另一个名称——一个不带参数的函数。 Thunk 在严格的语言中经常被用作模拟惰性求值的一种手段。 thunk 本身会延迟函数参数的计算,并且函数会强制 thunk 获取实际值。在这种情况下,thunk 通常称为暂停或(在 Scheme 中)承诺。

添加lazy evaluation example in Scheme。在这里,promise 是 thunk 的另一种说法。

【讨论】:

  • 谢谢。我正在寻找更好的东西。维基百科没有解释我真正想知道的事物和概念。
  • @Amit -- 我假设您在使用引用更新问题之前发表了评论。这是您问题的确切答案。
  • @tvanfosson 可能是在原始帖子之后编辑的。 @kotlinski 是否有可能以某种方式展示它?
  • 好的,添加了一个示例...这在 Peter Norvig 的人工智能编程范式中也得到了很好的解释(检查延迟/强制示例)。
  • 'force' 和 'delay' 似乎已从 R6RS 中删除。
【解决方案2】:

其实很简单。当您在程序中进行一些计算时,例如将 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。

惰性语言模糊了将变量绑定到值和创建函数以返回该值之间的界限,因此编写类似于上面第一种形式的内容实际上被视为在幕后处理第二种形式。

【讨论】:

  • Scheme 不是一种懒惰的语言,对吧? (在 r6rs 的“方案概述”中)。那么,如果我像上面一样创建一个想法,它会创建一个惰性评估场景吗?
  • 请查看链接 kotlinski (stackoverflow.com/questions/925365/…),了解 Scheme 如何实现惰性求值方案。
  • 是的。我做到了。但是,我在这里的查询是:像上面那样创建 lambda 会延迟像 Scheme 这样的非惰性语言的评估吗?
  • 是的,当然。为什么不应该呢?懒惰只是意味着你不必像上面那样明确地这样做。
  • 我应该补充一点,一个好的惰性求值方案(如 Scheme 中的那个)也可以记住 thunk 的结果。
【解决方案3】:

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

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

b1 变量绑定在封闭块中,这为我们提供了“thunk”这个词的词源线索,它依赖于一个关于糟糕语法的笑话。

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

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

【讨论】:

  • 感谢您解释为什么它被称为“thunk”
猜你喜欢
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2010-12-04
相关资源
最近更新 更多