有几个工单涉及的问题是,当{{clojure.set}}中的set函数接收到非集合参数时表现不佳。
这些问题包括CLJ-810,CLJ-1087,CLJ-1682,和CLJ-1954
受到影响的功能有:
- difference
- intersection
- union
- subset?
- superset?
因为这些函数在接收到非集合参数时会产生意外的结果。
问题
正如上述问题所暗示的,这些函数今天的实现方法在调用时使用非集合输入会导致混淆和错误的结果。用户没有得到任何警告或错误提示。
可能的解决方案
1. 在这些函数的参数上添加到{{set}}的强制转换
1. 当参数不是集合时抛出异常
1. 使用clojure.spec处理这个问题
1. 保持当前状态
权衡利弊
1. 由于CLJ-2362使得调用{{set}}接近于无操作,强制转换不应造成太大的性能损失。有人认为代码甚至可能会更快,因为可以提供类型提示,编译器/jit可能会做出更好的选择。对于常见的错误(传递向量/列表而不是集合),应该保持向后兼容性
1. 在非集合参数上抛出异常会破坏今天仍在正确工作(虽然可能只是偶然)的程序,如data.diff。
1. 使用clojure.spec处理可能是一个可行的方案,但同样,如果函数同时接收和返回集合,则可能会破坏data.diff。
1. 保持当前状态,我们将继续让新旧Clojure程序员感到惊讶。
这个问题是问题的证据
1. 提到的工单似乎表明人们常常会遇到这个问题并提交问题
1. https://docs.clojure.org/clojure.set/superset_q#example-5b5acd38e4b00ac801ed9e39