_评论者:jwr_
我将在这里尝试第一步(最小步骤)。由于集合函数的文档字符串以 "返回一个集合" 开头,人们可以合理地期望它们始终返回集合。
我遇到的具体情况是 `(clojure.set/difference nil #{1})` 返回 nil。nil 出现的原因是因为可选项:执行了集合操作,源数据在映射中的可选项。数据通过 spec 验证(因为键是可选的),然后由于 set/difference 返回的 nil 而触发了其他验证。我意识到论点是错误的,并且我不一定期望自动转换。
我期望的是在带有断言编译的代码中出现的后置条件错误。
具体来说,我认为集合函数上的 `{:post [(set? %)]}` 后置条件是可以达成一致的。它不涉及转换,并避免了关于有效参数的讨论,它只是根据文档对返回值施加了限制。
鉴于文档字符串的内容,我并不认为有代码依赖于集合函数返回的不是集合。
只有编译时启用断言,后置条件的性能影响才会存在。
我明白这并没有解决提及的所有问题,但这可能是一个向前迈进的方法。
我认为这并不是像目前标记的那样“重大”的问题。