评论由:jwr_
我将在这里尝试第一步(最小步骤)。由于集合函数的文档字符串以“返回一个集合”开始,因此可以合理地期望它们始终返回一个集合并不需要自动转换。
我遇到的特定情况是`(clojure.set/difference nil #{1})`返回nil。nil出现的原因是可选性:在一个集合操作中,源数据是可选的(在map中)。数据通过了规范验证(因为键是可选的),然后是因为由set/difference返回的nil违反了其他验证。
我所期望的是在包含断言编译的代码中出现的后置条件错误。
具体来说,我认为集合函数上的`{:post [(set? %)]}`后置条件是可以讨论的内容。它不涉及强制转换,它避免了讨论有效参数,只是根据文档对返回值施加了限制。
鉴于这些文档字符串所说,我不认为现有的代码依赖于设置函数返回任何其他类型的数据。
后置条件的性能影响只有在包含断言编译时才会出现。
我意识到这没有解决所有提到的问题,但这可能是一个前进的方法。
我认为这不是目前标记的“重大”问题。