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

欢迎!请访问关于页面了解如何使用的更多信息。

+1
Java 互操作

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

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

对于realized? 函数,难道不能做同样的事情?目前,它只支持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

(被视为一个bug -- 已在Clojure 1.11中修复)

我刚刚检查了我们的125k行代码库,只有一个调用realized?,是在一个测试中,专门检查是否传递了promise。

我很想听听Clojure团队对这一点的看法,但我怀疑他们不会鼓励使用它?

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

然而,关于 `delay` 的bug已经修复,对吗?我在Slack上搜索了一下,看到的所有关于 `realized?` 的警告都只适用于seqs:来自像 `range` 这样的变体返回的东西,`realized?` 在部分实现的情况下应该代表什么,等等……但这都不适用于Java Future。

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

这不是什么大问题,我更多地是出于对 `deref` 和 `realized?` 之间缺乏输入匹配的惊讶而提出的问题,而不是强烈的需要。
...