Scheme 中
delay
返回的对象是“一个 Promise”,但 Promise 不被视为类型(因此没有 promise?
过程,并且在 R5RS 或 R6RS 中没有将其列为类型)。
为什么会这样?有强烈的共鸣吗?例如,对我来说,做类似
(if (promise? x) (force x) x)
的事情似乎很自然。 (我发现有些实现会让我强制执行非承诺,而其他实现则不会)。另外,如果我可以将某些东西存储在变量中并将其传递,我觉得它应该有一个类型。
不可能有那么有力的理由,因为 MIT/GNU 方案定义了一个
promise?
函数。
我认为它可以更优化地实现
delay/force
。事实上,强制值可以被记忆(这样一个 Promise 只被强制执行一次,结果值会在后续的 force
调用中返回)模糊了 Promise 和它的结果值之间的区别。如果你有promise?
,你就无法在任何需要的地方用它的价值来替代强制承诺。因此,根据实现的不同,promise 可能与任何其他 Scheme 值无法区分。
如上所述,
promise?
不在 R5RS 或 R6RS 中(这将 delay
和 force
降级到 R5RS 兼容性库)...但 R7RS 将它们带回到 (scheme lazy)
库中,并添加,以及其他一些例程,promise?
,并提供以下建议:
请注意,promise 不一定与其他方案类型(例如过程)脱节。
这为不同的实现策略留下了很大的空间,包括经典的let-over-lambda风格,其中承诺是一个函数。