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