评论由: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
注意:此更改不检查所有有误的输入,只是类型。例如,仍然可以传递包含“非法”关键字字符的字符串。