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

欢迎!请参阅关于页面以了解更多关于其工作方式的信息。

+1
集合

如果一个nil到达,例如clojure.set/unionclojure.set/intersection,则输出取决于位置。我认为这些函数应该始终返回一个散列集合,不论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
by

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

...