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