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

欢迎!请访问关于页面获取更多关于此如何工作的信息。

+1投票
Collections

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

我认为改变这些行为中的任何一个都可能导致破坏性变化,如果有人依赖于当前(未定义)的行为。需要更多研究来了解潜在的影响。

...