评论者: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,具有针对关键字、符号和字符串的case。没有:else,所以所有其他情况都返回nil。find-keyword也是一样,应该以相同的方式执行。
提议:我为cond添加了一个:else分支,抛出一个带有指示可接受类型并打印实际参数的消息的IllegalArgumentException。我也对find-keyword做了同样的更改。还有一些简单的测试。
替代方案:已经考虑了在两个参数的情况下添加检查,但担心由于它已抛出异常,添加额外的开销不值得。在单参数的情况下没有增加显著的开销,因为它只会影响错误输入。
补丁:keyword-1341-2014-02-12.2.patch
注意:此更改不会检查所有不良输入,只检查类型。例如,仍然可以传入具有“非法”关键字字符的字符串。