由: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 做了同样的修改。还有简单的测试。
替代方案:已经考虑了在两个参数的情况下添加检查,但担心添加额外的开销不值得,因为它已经抛出了异常。在单个参数的情况下没有添加显著的额外开销,因为它只会影响错误输入。
Patch: keyword-1341-2014-02-12.2.patch
注意:此更改不考虑所有错误输入,只检查类型。例如,仍然可以传递包含“非法”关键字字符的字符串。