ClassCastException java.lang.Boolean cannot be cast to clojure.lang.IFn
cond関数を使っていたら表題のエラーがでました。
user=> (defn foo [x] (cond ((= x 2) "two") ((= x 3) "three"))) #'user/foo user=> (foo 3) ClassCastException java.lang.Boolean cannot be cast to clojure.lang.IFn user/foo (form-init2681034788118954262.clj:1) user=>
java.lang.Boolean
をclojure.lang.IFn
にキャストできないとのエラーです。clojure.lang.IFn
は、clojureでの関数に相当します。関数であるべきところにBooleanを使っているのでエラーになるとのことです。
(= x 2)
でBooleanの結果になるので、これを関数として解釈していることになります。ということは、xを2とした時に((= x 2) "two")
が(true "two")
となり、trueが関数として解釈されていることになります。この部分の括弧が余分についているためでした。
下記のようにすると期待通りに動きます。
user=> (defn foo [x] (cond (= x 2) "two" (= x 3) "three" ) ) #'user/foo user=> (foo 3) "three" user=> (foo 2) "two" user=> (foo 1) nil user=>