评论人:jwr_
我将尝试在这里迈出第一步。由于集合函数的文档字符串以 "返回一个集合" 开头,我们合理地预期它们将始终返回一个集合。
我遇到的具体情况是 `(clojure.set/difference nil #{1})` 返回 nil。nil 出现的原因是可选性:执行了集合操作,源数据在映射中是可选的。数据通过了规范验证(因为键是可选的),后来由于 set/difference 返回的 nil 而引发了其他验证。我意识到参数不正确,并且我并不期望自动强制类型转换。
我所期望的是在带有断言编译的代码中显示的后置条件错误。
具体来说,我认为在集合函数上有一个 `{:后 [(set? %)]}` 后置条件是大家可以达成共识的。这不会解决强制类型转换的问题,也不会讨论有效参数是什么,它只是根据文档限制了返回值。
根据文档字符串的内容,我认为没有代码依赖于集合函数返回任何除集合之外的内容。
后置条件的性能影响仅在编译时带有断言的情况下才会出现。
我意识到这并没有解决所有提到的问题,但也许这是一个开始向前推进的方法。
我认为这并不意味着这是一个“重大”问题,正如目前标记的那样。