マクロ書いて、これ IFn にキャスト出来ないんだけどってエラーになったとき
たまに馬鹿やります。あやぴーです。
(defmacro foo [] (map inc (range 10))) (foo) ;; java.lang.ClassCastException: java.lang.Long cannot be cast to clojure.lang.IFn
こんな感じで上のようなマクロを定義するとエラー吐くけど、よく考えたら当たり前で (foo) は次のように展開されます。
(1 2 3 4 5 6 7 8 9 10)
このとき map で返却されていたのはクォートされいないリストであり、こんなものを関数として実行しようとすればエラーが起きて当然です。なので、この場合は mapv などを使ってベクタを返すと良さそうです。どうしてもリストがいいなら、 quote で囲みましょう。
というどうでもいい小ネタでした。