IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

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.Booleanclojure.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=>