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