_由 jwr_ 发表评论:
我会尝试一个(最小化)的第一步。由于集合函数的文档字符串以“返回一个集合”开头,人们可以合理地期望它们始终返回一个集合。
我遇到的具体情况是 `(clojure.set/difference nil #{1})` 返回 nil。nil 出现的原因是可选性:执行了一个集合操作,映射中的源数据是可选的。数据通过了规范验证(因为键是可选的),只在后来触发了其他验证,因为 set/difference 返回了 nil。我意识到参数不正确,并不一定期望自动强制转换。
我期望的是一个后置条件错误,它会出现在用断言编译的代码中。
具体来说,我认为对集合函数应用 `{:post [(set? %)]}` 后置条件是我们可以达成共识的一件事。它不解决强制转换的问题,避免了关于有效参数的讨论,它只是在根据文档对返回值施加限制。
根据文档字符串所述,我认为目前没有代码依赖于集合函数返回除了集合以外的其它任何内容。
后置条件的影响只有在用断言编译的情况下才会出现。
我明白这并未解决提到的问题的所有问题,但或许是一个向前推进的方法。
我认为这个问题并不是当前标记的“重大问题”。