2024年Clojure状态调查!中分享您的想法。

欢迎!请查看关于页面以了解此工作的更多信息。

0
错误

关键字函数应该在输入有误时抛出异常而不是返回nil。

user=> (keyword 5) nil user=> (keyword []) nil

原因:关键字函数被定义为具有关键字、符号和字符串用例的cond。没有:else,因此所有其他用例都返回nil。

提议:向关键字中添加:else分支并抛出异常。

补丁

5 个答案

0

评论由:ericnormand发表

关键字函数应该在错误参数类型上抛出IllegalArgumentException而不是返回nil。为了保持一致性,在两个参数的情况下,如果两个参数都不是字符串,则应该抛出IllegalArgumentException。

find-keyword函数应该以类似的方式工作以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为具有关键字、符号和字符串用例的cond。没有:else,因此所有其他用例都返回nil。同样,find-keyword应该以相同的方式工作。两个参数的情况确实抛出了异常,但消息并不太有帮助。

提议:我在cond中添加了:else分支,并抛出IllegalArgumentException,带有表明可接受类型并打印实际参数的消息。我还对find-keyword做了同样的改动。还有一些简单的测试。

补丁:keyword-1341-2014-02-12.patch

注意:此更改不检查所有有误的输入,只是类型。例如,仍然可以传递包含“非法”关键字字符的字符串。

0

评论由:alexmiller发布

嗨,Eric,感谢你的补丁!对于参数从1个变更为的情况,看起来很不错。

关于参数变为2的情况,我有一些担忧——我担心我们将新的检查添加到了一个相当热的应用程序路径(关键字创建)。当参数变为2的情况下不会是沉默的失败,你将得到一个ClassCastException,因此我认为在这里添加这些检查不值得。在只有一个参数的情况下,你已经掉了else,因此没有额外的开销。

0

评论由:ericnormand发表

明白了。我会去掉双参数的情况。

0

评论由:ericnormand发表

关键字函数应该在接收到错误的参数类型时抛出IllegalArgumentException而不是返回nil。在双参数情况下,已经抛出了异常。

find-keyword函数应该以类似的方式工作以保持相同的签名。

当前行为

user=> (keyword 5)
nil
user=> (keyword (link: ))
nil
user=> (keyword 1 1)
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String

原因:关键字函数被定义为cond,其中包含针对关键字、符号和字符串的情况。没有:else,因此所有其他情况都返回nil。同样,find-keyword也应该以相同的方式运行。

提议:我在cond中添加了:else分支,并抛出IllegalArgumentException,带有表明可接受类型并打印实际参数的消息。我还对find-keyword做了同样的改动。还有一些简单的测试。

替代方案:考虑添加对双参数情况的检查,但担心添加额外的开销不值得,因为它已经抛出了异常。在单参数情况下没有增加显著的开销,因为它只会影响错误的输入。

补丁:keyword-1341-2014-02-12.2.patch

注意:此更改不检查所有有误的输入,只是类型。例如,仍然可以传递包含“非法”关键字字符的字符串。

0
参考:https://clojure.atlassian.net/browse/CLJ-1341(由alexmiller提出)
...