当在 CLJS 中构建自定义比较函数时,我遇到了一些我认为很奇怪的行为
当在 REPL 中直接使用 >(或类似)函数比较两个字符串时,我会收到一个 :invalid-arithmetic 警告,并且返回 nil(类似于 CLJ 会抛出异常)。当我在函数内部执行同样的操作时,它将返回一个布尔值,没有任何警告(CLJ 会抛出异常)
CLJS
clj꞉user꞉> (> "A" "Z")
nil
; ------ WARNING - :invalid-arithmetic -------------------------------------------
; Resource: <eval>:1:1
cljs.core/>, all arguments must be numbers, got [string string] instead
--------------------------------------------------------------------------------
clj꞉user꞉> ((fn [x y] (> x y)) "A" "Z")
false
CLJ
user=> (> "A" "Z")
Execution error (ClassCastException) at user/eval3 (REPL:1).
class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')
user=> ((fn [x y] (> x y)) "A" "Z")
Execution error (ClassCastException) at user/eval5$fn (REPL:1).
class java.lang.String cannot be cast to class java.lang.Number (java.lang.String and java.lang.Number are in module java.base of loader 'bootstrap')
有人能解释一下发生什么事吗?
谢谢,
Julian