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

欢迎!请查看关于页面以获得更多关于该工作方式的详细信息。

+1
集合
编辑

一如既往,感谢 Clojure —— 我们爱它,并每天都在用它以令人满意的方式解决给我们程序员带来快乐和用户惊叹有价值的难题。


我天真地取集合差分,希望得到这个结果,很高兴。

> (clojure.set/difference #{:a :b :c} '(:a 1 2))
#{:c :b}

然后我这么做,很惊讶

> (clojure.set/difference #{:a :b :c} '(:a 1 2 3))
Execution error (IllegalArgumentException)
contains? not supported on type: clojure.lang.PersistentList

然后我阅读了 clojure.set/difference 的实现,现在我明白了

https://github.com/clojure/clojure/blob/a29f9b/src/clj/clojure/set.clj#L49-62

但是,我很好奇如果这样就能做到,会更有趣。而且,鉴于这对我来说可能比对你更重要,我很好奇这里的实际权衡是什么。

  • 是性能问题吗?
  • 或者是,在关键时刻隐式转换为实现 contains? 的对象的弊端是什么?

1 个回答

+1

被选中
 
最佳答案

请参阅 https://clojure.atlassian.net/browse/CLJ-2433(以及其中引用的各个问题单)。

这可能是应该在 https://clojure.org/guides/faq 上列出的事情,因为几乎每个新接触 clojure.set 的开发者都会问:clojure.set 函数仅在集合上定义 -- 文档字符串中没有说明如果你传递的不是集合会发生什么。

感谢链接 - 我学到了很多。我肯定会支持实现 `clojure.set/difference`,它接受一个序列作为第二个参数。在我的情况下,我找到了一个很棒的 `apply disj ...` 工作区间的解决方案。继续保持精彩。
...