什么是'thunk',在Scheme或一般情况下使用?

56 scheme programming-languages functional-programming

我在与Scheme和类似地区相关的代码和文档中的很多地方都遇到了"thunk"这个词.我猜它是一个过程的通用名称,它有一个正式的参数.那是对的吗?如果是,那还有更多吗?如果没有,拜托?

例如.在SRFI 18中,在"程序"部分.

Sva*_*nte 69

这很简单.如果你有一些计算,比如在你的程序中添加3到5,那么创建它就意味着直接计算它,而是创建一个零参数的函数,它将在需要实际值时计算它.

(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
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,foo将被称为thunk.

惰性语言模糊了将变量绑定到值和创建函数以返回该值之间的界限,因此编写类似于上面第一个表单的内容实际上就像第二个表单一样.


Ste*_*wig 41

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

(lambda () (write '(b1)))
Run Code Online (Sandbox Code Playgroud)

b1变量绑定在封闭块中,这为我们提供了"thunk"这个词的词源的线索,它依赖于一个关于语法不好的笑话.

零参数函数无法根据调用的参数更改其行为,因为它没有参数.因此,设置了函数的整个操作 - 它只是等待执行.计算机不再需要"思考",所有的"思考"都已完成 - 动作完全是"通过".

这就是所有"thunk"都在这个SRFI的上下文中 - 一个没有参数的过程.

  • 谢谢你解释为什么它被称为"thunk" (8认同)

Joh*_*ski 14

维基百科有以下答案:

在函数式编程中,"thunk"是nullary函数的另一个名称 - 一个不带参数的函数.Thunks经常以严格的语言使用,作为模拟惰性评估的手段; thunk本身延迟了函数参数的计算,函数强制thunk获取实际值.在这种情况下,thunk通常被称为暂停或(在Scheme中)承诺.

在Scheme中添加一个惰性评估示例.在这里,诺言是thunk的另一个词.

  • 谢谢.我正在寻找更好的东西.维基百科没有解释我真正想知道的事情和概念. (4认同)