2024 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以了解有关此工作方式的更多信息。

+1

我遇到的情况需要将 Clojure 的 CompletableFutures 与 futures/delays 等混合使用。遗憾的是,IPending 是一个接口,无法扩展到 Java 核心类。

IDeref 和 IBlockingDeref 与 Java Future 一起使用时没有问题,因为 deref 函数支持它们。

“realized?” 函数是否也可以这样做?目前,它只适用于 IPending。如果它能匹配 deref 的行为,在给定 java.util.concurrent.Future 时调用 .isDone(),那就太理想了。

1 个答案

0
by

当有人在 Slack 的讨论中提起“realized?”时,通常的建议是不要使用它,并且在很多情况下它本身就不具有直观的用法。

然后问题通常转变为“你为什么一开始要使用“realized?”?”。

非直观行为的一个例子

https://ask.clojure.org/index.php/10004/calling-realized-delay-currently-executing-blocks-caller

(被认为是一个错误 - 在 Clojure 1.11 中已修复)

我刚刚检查了我们的 12.5k 行代码库,只有一个测试调用了“realized?”,具体是检查一个“promise”是否被“deliver”。

我想听听 Clojure 团队成员对此的看法,但我怀疑他们不会鼓励使用它?

感谢你的回复,Sean。我很感激。

不过,“延迟”这个bug已经修复了,对吗?我在Slack上搜索了一下,所有关于“realized?”的警告似乎仅适用于seqs:variant返回类型,如`range`,在部分实现的情况下`realized?`应该意味着什么等,但这都不适用于Java Future。

处理j.u.c.Futures不会使`realized?`变得更复杂,除非鼓励其使用。

这不是什么大问题,我之所以询问,更多的是出于对`deref`和`realized?`之间缺乏输入兼容性的惊讶,而不是任何迫切的需要。
...