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

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

+1
Collections

例如,如果一个nil传递到clojure.set/unionclojure.set/intersection,输出将取决于位置。我认为这些函数应该始终返回一个哈希集,不管有nil或者nil的位置。

$ clj
Clojure 1.10.3
user=> (require '[clojure.set :refer [intersection union]])
nil
user=> (union #{} nil)
#{}
user=> (union nil #{})
nil
user=> (intersection #{} nil)
#{}
user=> (intersection nil #{})
nil
user=> (union #{} nil nil)
nil
user=> (union nil #{} nil)
nil
user=> (union nil nil #{})
#{}
user=> (intersection #{} nil nil)
nil
user=> (intersection nil #{} nil)
nil
user=> (intersection nil nil #{})
#{}

在我看来,参数的顺序不应该有关系,并且始终应该是一个集合,仅假设nil为空集。另外,如果打算稍后调用诸如(set-of-things thing)之类的函数,可能会引发异常(这正是困扰我的问题)。

也许这不仅仅局限于并集和交集,还有更多的函数存在这种“问题”

2 答案

0

关于unionintersection函数的文档说明了它们如何处理集合输入。在以前,当询问Clojure核心开发者一些开发者认为给非集合作为输入时,某些行为是不期望或不希望的情况时,他们表示您以某种方式使用这些函数,这保证没有特定的返回值。

当然,您可以定义自己的类似于unionintersection的函数,提供额外的输入错误检查,并定义当提供其他非集合输入值时的行为,就像在本示例库中做的那样(我相信没有人使用):https://github.com/jafingerhut/funjible

0

我怀疑,如果有人依赖于当前(未定义的)行为,则修改任何这些行为都可能产生破坏性变更。需要更多调查以了解潜在影响。

...