📝Clojure Macros

📝Clojure Macros

Clojureマクロ.

up: 📂Clojure Core Languages refs: 🏷Lisp 🏷LISP Macro 📝Clojure Abstruction

predefinedなmacroはこっち => Reader Macros

Clojure マクロの仕組み #

2stepにわけられる.

  1. マクロ展開
  2. コンパイル

Clojureはマクロに出会うと, マクロがまず展開され, その結果がプログラム中のマクロのあった位置に置き換えられる(マクロ展開時処理). その次に通常のコンパイルが動く(コンパイル時処理).

Clojure Macro Syntax #

  • defmacro で宣言する.
  • symbolの前にquote(')をつけるとdefmacro内で評価されない.
  • nilは何度評価してもnilなのでなにもつけない.
  • macroexpand-1 をREPLで叩くとマクロ展開をテストできる.

マクロ利用の指針 #

マクロ利用の指針 from Programming Clojure #

  1. マクロを書くな.
  2. それがパターンをカプセル化する唯一の方法ならば, マクロを書け.
  3. 同等の関数に比べて, 呼び出し側が楽になるならばマクロを書いても構わない.

繰り返し現れる 特殊形式 (ex. if) を マクロで共通化する.

デザインパターンとは, 多態的なインスタンス化のパターンに過ぎない. 同様にして, マクロとは共通部分を括りだす層であり, プログラミング言語そのものの記法などの, 既存の文法では括りだすことが難しいところを共通部分として切り出す.

たとえば, unless記法がない言語では if !hogeのように!を多用する. しかし何度も何度も!が使われるならば, もはやその記法には独自の定義を与えたほうが読みやすいだろう, そういうことだ.

ref: 📚Programming Clojure

マクロの利用シーンの分類 by Programming Clojure #

だいたい6つのパターンに分類することができる.

ref: 📚Programming Clojure

ちょくちょく実例へのリンクを書き足していきたい(urlつきで).

条件的な評価 #

varの定義 #

Javaの呼び出し #

評価の遅延 #

評価を包む #

lambdaの省略 #