TL;DR
defmacroで、(2 + 3)というリストを(+ 2 3)に変換して評価するマクロを書く。macroexpandを使うと、マクロが生成し、実際に評価されたコードを確かめられる。
内容
Clojure で 2 と 3 を足すときは、以下のように書ける。
(+ 2 3)これを (2 + 3) のように書きたい場合、マクロを使える。具体的には、(2 + 3) というリストを (+ 2 3) に変換し、評価すればよい。
'(2 + 3) を変数 a-list に束縛すると、最初の要素と 2 番目の要素を入れ替える必要があるので、以下のようになる。
(list
(second a-list)
(first a-list)
(last a-list))これをマクロにするには、defmacro を使って以下のように書く。
(defmacro calculate [a-list]
(list
(second a-list)
(first a-list)
(last a-list)))これを使うと、(2 + 3) を評価できる。
(println
(calculate (2 + 3))
;; 5macroexpand 関数を使うと、マクロを展開できる。
(println
(macroexpand '(calculate (2 + 3))))
;; (+ 2 3)この出力されたコードがマクロによって生成されたコードで、実際に評価されたコードである。