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

欢迎!请查看关于页面以获取有关此功能的更多信息。

0
data.int-map

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

contains?不能在临时集合上使用

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

;; 这有效
((transient #{1 2 3}) 2)
;=> 2

;; 这不行 :(
((transient (int-set #{1 2 3})) 2)
;=> CompilerException java.lang.IllegalArgumentException: contains? not supported on type: clojure.data.int_map.TransientIntSet

我检查了代码,TransientIntSet支持TransientIntSet接口的contains方法,可以直接使用并返回正确的值,但显然不是递归互操作的惯用法,也不必为这种特定情况而查找它。

6答案

0

评论者:ztellman

如果我说错了,那解决这个问题唯一的方法就是改变Clojure的实现,对吗?我看不出在这个库中可以进行任何操作来改变这种行为。

0

评论者:carocad

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

Clojure的临时集允许当设置用作函数时查找键。然而,data.int-map在内部使用"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通过添加一个新的接口及其所需的方法解决了转换的问题。因此,此处描述的解决方案不再有效,我认为普遍的期望是int-map也应实现该接口。

0

评论者:[email protected]

看起来这是通过commit 36846ff和commit 2d5d0e5修复的。

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