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

欢迎!请查看 关于 页面,了解这是如何工作的更多信息。

0
data.int-map

这与 https://dev.clojure.org/jira/browse/CLJ-700 相关

contains? 不适用于临时集合

当然,对 data.int-map 应如何工作的期望与一般集合相同,所以我对此没有抱怨。然而,在这个帖子中展示的解决方案 https://groups.google.com/forum/#!topic/clojure/lQVmZ-jcdiU 是将集合直接用作函数

;; 这可行
((transient #{1 2 3}) 2)
;=> 2

;; 这不可行 :(/p)
((transient (int-set #{1 2 3})) 2)
;=> CompilerException java.lang.IllegalArgumentException: contains? 不支持在类型 clojure.data.int_map.TransientIntSet 上运行

我查看了代码,TransientIntSet 支持接口的 contain 方法,可以直接使用并返回正确的值,但这显然不是一种恰当的方法,也不需要在 interoperability 中重新拿出来,并且必须为此特定情况进行查找。

6 答案

0

评论由:ztellman

如果我说错了,那么修复此问题的唯一方法是修改Clojure的实现,对吗?我认为在这个库中无法做任何能改变这种行为的操作。

0

评论由:carocad

当然,“contains?”的行为不能在这个库内部修复。但是,这个工单是关于将临时集合用作函数的。(见描述示例)

Clojure的transient集合允许在将集合用作函数的情况下查找键。然而,data.int-map在内部始终使用"contains?",无论它是作为函数调用的:[查看源代码](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentSet.java#L50)。因此,永远不会调度对"contains?"的调用,这与预期集合的行为不符。

Clojure通过在将集合用作函数时调用"get"函数来处理此用例:[查看源代码](https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/APersistentSet.java#L50)。因此,永远不会调度对"contains?"的调用。

目前int-map集合的行为迫使用户区分正在使用的集合类型,以便正确调用函数。

0

评论由:ztellman

好的,这很有道理。我将相应地更新库。

0

评论由:carocad

Clojure 1.9通过添加新的接口及其必要的方法解决了transient的问题。因此,这里描述的解决方案不再有效,并且我认为int-map实现该接口的普遍预期会得到满足。

0

评论者:[email protected]

看起来这是通过提交36846ff和2d5d0e5解决的。

0
参考:https://clojure.atlassian.net/browse/DIMAP-14 (由alex+import报告)
...