読者です 読者をやめる 読者になる 読者になる

(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

マクロ書いて、これ IFn にキャスト出来ないんだけどってエラーになったとき

Clojure

たまに馬鹿やります。あやぴーです。

(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 で囲みましょう。
というどうでもいい小ネタでした。