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

欢迎!有关Clojure的工作原理,请参阅关于页面获取更多信息。

+1
Java互操作

我在一个需要将CompletableFutures与Clojure futures/delays等混合的情况中遇到了困难。不幸的是,IPending是一个接口,不能扩展到Java核心类。

对于IDeref和IBlockingDeref,与Java Futures一起工作没有问题,因为deref fn支持它们。

能否用相同的realized? fn来实现呢?目前,它只适用于IPending。如果它遵循deref的行为并在给定java.util.concurrent.Future时调用.isDone(),那就很理想了。

1 个答案

0

每当有人在Slack上的讨论中提到realized?时,一般的建议是不要使用它,而且它在很多情况下本身就没有直观的方式来实现。

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

非直观行为的示例

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

(被视为错误 - 在Clojure 1.11中已修复)

我刚刚检查了我们的12.5万行代码库,只有一个地方调用了realized?,特别是一个测试调用来检查promise是否已delivered。

我想了解Clojure团队对此有何看法,但我怀疑他们不希望鼓励使用它?

感谢您的回复,Sean。非常感谢。

但是,关于`delay`的bug已经被修复了吗?我在Slack上搜索了一下,关于`realized?`的所有警告都只适用于:从`range`等返回变体的seqs,`realized?`在部分实现存在的情况下应该意味着什么等,但这都不适用于Java Future。

处理j.u.c.Futures不会使`realized?`更成问题,除非鼓励使用它。

这没什么大不了的,我之所以询问,更多的是出于对`deref`和`realized?`之间缺乏输入匹配的惊讶,而不是任何迫切的需求。
...