我在与Scheme和类似领域相关的代码和文档中经常遇到“thunk”一词。我猜它是一个泛称,用于表示只有一个形参的过程。这个猜想正确吗?如果是,还有其他方面需要注意吗?如果不是,请说明原因。
例如,在SRFI 18的“Procedures”部分。
我在与Scheme和类似领域相关的代码和文档中经常遇到“thunk”一词。我猜它是一个泛称,用于表示只有一个形参的过程。这个猜想正确吗?如果是,还有其他方面需要注意吗?如果不是,请说明原因。
例如,在SRFI 18的“Procedures”部分。
这非常简单。当您在程序中进行某些计算(例如将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。"thunk"是一个没有形式参数的过程对象,例如在您提供的SRFI链接中:
(lambda () (write '(b1)))
b1变量被绑定在封闭块中,这让我们想到了“thunk”这个词的词源,它基于一个关于语法错误的笑话。
零参函数没有办法根据其被调用时的参数改变其行为,因为它没有参数。因此,整个函数的操作都已经设定好了——它只是在等待执行。计算机不需要再做更多的“思考”,所有的“思考”都已经完成——动作完全已经确定("thunked" through)。
在这个 SRFI 的上下文中,“thunk”只是一个没有参数的过程。
维基百科 给出了以下解释:
在函数式编程中,“thunk”是一个无参数函数的另一种称呼。在严格语言中,Thunk经常被用作模拟惰性求值的手段;Thunk本身会延迟计算函数的参数,并且函数会强制Thunk获取实际值。在这个背景下,Thunk通常被称为“悬挂”或(在Scheme中)“Promise”。
在这里,我们添加了Scheme中的惰性求值示例。在这里,“promise”是thunk的另一个词。