问题标签 [thunk]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
494 浏览

exception - 如果 thunk 导致异常,异常是否保留为 thunk 的结果?

我创建了这个小程序,它创建了一个长时间运行的 thunk,最终由于异常而失败。然后,多个线程尝试评估它。

增加线程数显然对计算没有影响,这表明失败的 thunk 会保留异常作为结果。这是真的吗?这种行为是否在某处记录/指定?

更新:forkFinally将行更改为

确认每个线程都因异常而失败。

0 投票
2 回答
1267 浏览

javascript - 比 function(){return x} 更简洁的延迟评估?

我正在移植一些严重依赖延迟评估的 Python 代码。这是通过 via thunks完成的。更具体地说,任何<expr>需要延迟评估的 Python 表达式都包含在 Python“lambda 表达式”中,即lambda:<expr>.

AFAIK,与此最接近的 JavaScript 等价物是function(){return <expr>}.

由于我正在使用的代码绝对充斥着这样的 thunk,如果可能的话,我想让它们的代码更简洁。这样做的原因不仅是为了节省字符(对于 JS 来说这是一个不可忽略的考虑因素),也是为了使代码更具可读性。要明白我的意思,比较这个标准的 JavaScript 表单:

在第一种形式中,实质性信息,即表达式fetchx(),在印刷上被周围的function(){return......掩盖了}。在第二种形式1中,只有一个 ( \) 字符用作“延迟评估标记”。我认为这是最佳方法2

AFAICT,这个问题的解决方案将分为以下几类:

  1. 用于eval模拟延迟评估。
  2. 一些我不知道的特殊 JavaScript 语法,它完成了我想要的。(我对 JavaScript 的极大无知使这种可能性对我来说看起来很真实。)
  3. 用一些非标准的 JavaScript 编写代码,这些代码会以编程方式处理成正确的 JavaScript。(当然,这种方法不会减少最终代码的占用空间,但至少可以保留一些可读性。)
  4. 以上都不是。

我对听到最后三类的反应特别感兴趣。


PS:我知道eval(上面的选项 1)的使用在 JS 世界中被广泛弃用,但是,FWIW,下面我给出了这个选项的玩具说明。

这个想法是定义一个私有包装类,其唯一目的是将纯字符串标记为 JavaScript 代码以进行延迟评估。然后使用具有短名称(例如C,用于“CODE”)的工厂方法来减少,例如,

首先,工厂C和辅助函数的定义maybe_eval

下面的get函数和lazyget函数之间的比较显示了如何使用上述函数。

这两个函数都接受三个参数:一个对象obj、一个键key和一个默认值,obj[key]如果key存在于 中,它们都应该返回obj,否则返回默认值。

这两个函数之间的唯一区别是 for 的默认值lazyget可以是一个 thunk,如果是这样,它只会在keyis not in时被评估obj

看看这两个函数的实际作用,定义:

然后,在评估上述内容后,并使用(例如)Firefox + Firebug,以下

打印出来


1 ...这可能会让 Haskell 程序员感到奇怪的熟悉。:)

2还有另一种方法,例如 Mathematica 使用的方法,它完全避免了对延迟评估标记的需要。在这种方法中,作为函数定义的一部分,可以指定其任何一个形式参数用于非标准评估。排版上,这种方法当然是最大限度地不引人注目,但对我的口味来说有点太多了。此外,恕我直言,它不像使用例如\延迟评估标记那样灵活。

0 投票
4 回答
6009 浏览

promise - thunk、futures 和 promises 有什么区别?

有关于它们的 wiki 文章:(http://en.wikipedia.org/wiki/Futures_and_promiseshttp://en.wikipedia.org/wiki/Thunk_(delayed_computation))。但是我不确定这三者作为编程语言概念之间的确切区别是什么?期货和承诺是否仅适用于并发编程?

0 投票
1 回答
459 浏览

sml - 是否有多种方法可以在 SML 中编写 thunk?

基本菜鸟问题:

我有需要懒惰地评估的数据,最常见的方法是制作一个thunks; 我习惯这样做的方式是这样的:

但是标准 ML 的每个指南都告诉我它是这样完成的:

所以我的问题是:这真的重要吗?输出不一样吗?制作一个函数和将一个 lambda 绑定到一个值之间有什么区别?

0 投票
3 回答
2094 浏览

c++ - x64 的简单 Windows 回调 thunk

你们中的许多人都熟悉 ATL thunk,例如用于创建窗口。使这项工作 CStdCallThunk 的类以WindowProc调用为目标。从本质上讲,它将全局回调转换为 C++ 对象的成员函数。

这种类型的 thunk 不适用于需要完整的第一个参数的SetWindowsHookEx 回调。对于 32 位 Windows,我在ATL/AUX库的一部分 CAuxThunk 中找到了一个整洁的解决方案。不幸的是,这不适用于本机 64 位可执行文件

我想知道是否有任何 x64 汇编大师可以修补此 CauxThunk 以适用于 64 位窗口,或者提出任何等效的 thunk 将 this __stdcall 回调转换为成员函数?

谢谢,
尼科斯

0 投票
1 回答
527 浏览

haskell - :冲刺多态值?

我想知道为什么在这种情况下:sprint报告:xs = _

但在这种情况下不是:

注意:我正在ghci运行-XNoMonomorphismRestriction. 这是否与xs第一种情况下的类型是多态的但在第二种情况下无关的事实有关?我想知道内部发生了什么。

0 投票
4 回答
386 浏览

haskell - 如何将 Thunk 序列化或保存到文件?

在 Haskell 中,您可以拥有无​​限列表,因为它不会完全计算它们,而是使用 thunk。我想知道是否有一种方法可以序列化或以其他方式将一段数据的 thunk 保存到文件中。例如,假设您有一个列表[0..]。然后你对它进行一些处理(我最感兴趣的是tailand (:),但它应该也支持做filteror map。)这是我正在寻找的一个例子。

0 投票
2 回答
1471 浏览

node.js - 将回调转换为 thunk

我将猫鼬与 koa.js 一起使用(可能是一个糟糕的选择,但必须坚持下去)。我最初的回调函数是:

这应该在正常的快递世界中有效,但后来我意识到我需要以 thunk 的形式重写,所以我目前的尝试是

但这会从第一个 mongoose 调用的 User.findone 中返回用户详细信息。其他任何事情似乎都被忽略了。谢谢

0 投票
1 回答
165 浏览

haskell - Haskell 在编译时扩展了某些 thunk 吗?

有没有办法让 Haskell 在运行时扩展某些 thunk。例如,说我有

我怎么能goldRatio在编译时评估它。例如,与

它只需要弱头部形式,因为Control.Deepseq.force可以处理其余的。我听说模板 haskell 可以做到这一点,但我不太了解。

注意:我目前正在使用 GHC。

0 投票
1 回答
1350 浏览

javascript - 为什么 thunkify / yield 总是返回一个数组?

我有一个thunk名为logInline(改编自Co 文档)。

我注意到 thunkifiedget似乎总是yield一个数组。这是设计使然吗?它是这样thunkify做的,还是它的标准部分yield

请注意,这里的变量 'google' 始终是一个数组。为什么?请注意,request.get通常返回err, response(即,没有数组)。

脚本,顺便说一句,返回200或 google.com 返回的任何其他响应代码。

,产量文档是相当稀疏的 ATM。

编辑: Thunks 并不总是返回数组。例如,如果var readFile = thunkify(fs.readFile);

在这种情况下,fileContents 不会在数组中返回。那么为什么谷歌在一个数组中呢? thunkify 中似乎有一些东西可以控制 thunk 返回的内容