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

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

我检查了代码,TransientIntSet 支持TransientIntSet接口的contain方法,可以直接使用并返回正确的值,但这肯定不是符合语言风格的,要么求助交互式操作,要么在特定情况下查找这一点。

6 答案

0

评论者:ztellman

如果我说错了,那么这个问题的唯一解决方案是改变 Clojure 的实现,对吗?我认为在这个库中无法改变这种行为。

0

评论者:carocad

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

Clojure的transient集合允许在将其用作函数时查找关键字。然而,data.int-map的transient集合在作为函数调用时内部使用"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通过添加一个新的接口及其必要的方法来解决transients的问题。因此,这里描述的解决方案不再有效,我认为int-map也应实现该接口

0

评论者:[email protected]

看起来这个通过提交36846ff和2d5d0e5已经被修复。

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