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))
;; 5

macroexpand 関数を使うと、マクロを展開できる。

(println
 (macroexpand '(calculate (2 + 3))))
;; (+ 2 3)

この出力されたコードがマクロによって生成されたコードで、実際に評価されたコードである。

キーワード