jwr_ 发布评论
我将尝试第一步。由于集函数的doc字符串以 "返回一个集合" 开始,我们可以合理地期望它们始终返回一个集合。
我遇到的特定情况是 `(clojure.set/difference nil #{1})` 返回 nil。nil 出现的原因是由于可选项:执行了集合操作,源数据在映射中是可选的。数据通过了规范验证(因为键是可选的),后来又因为由 set/difference 返回的 nil 而触发了其他验证。我意识到参数不正确,并且我并不一定期望自动强制类型转换。
我所期望的是,在经过断言编译的代码中会出现后条件错误。
具体来说,我认为在集合函数上添加 `{:post [(set? %)]}` 后条件是可以商定的。这并没有解决强制类型转换的问题,也不涉及有效参数的讨论,它只是根据文档对返回值设置了一个限制。
根据 docstrings 的说明,我认为没有代码依赖于集函数返回除了集合以外的东西。
只有在编译时开启断言的情况下,后条件的影响才会出现。
我明白这并没有解决所有提到的问题,但这可能是向前推进的一种方式。
我认为这并不是目前标记的“重大”问题。