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,感谢您的补丁!一个参数更改看起来不错。

关于第二个参数的改变,我有一些担忧 —— 我担心我们正在将新的检查添加到一个非常热点代码路径(关键字创建)中。两个参数的路径不会是无声失败,因为你会得到一个 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 报告)
...