たとえば, ある数に2を足した値を返す式をマクロとして実現するには, 以下 のように書く.
(def-fpp-macro 2+ args `(+ 2 ,@args))これで, ABCL/fコンパイラがマクロの定義以降
(2 x)+という式に
出会うと, それが, ( 2 x)+という形に展開されるようになる.
つまりマクロの実行メカニズムは,
(def-fpp-macro m args e) という定義を登録する
と, ABCL/fコンパイラがmをマクロとして登録する.(m
)という式に出会うと, コンパイラは,
( )を
bindした上でeを評価し,
複雑な変換をする場合は, 展開された結果を書くために補助関数が必要になる
場合がある. そのために, def-fpp-expandを使う. これは
Lispdefunと同じ働きをする. 例えば上の2+をあえて次のように
二つに分けて書いても良い.
(def-fpp-expand expand-2+ (args) `(+ 2 ,@args)) (def-fpp-macro 2+ args (expand-2+ args))大きなマクロはこのように必要な変換関数を前持って書いて, マクロ本体を小 さくしておくのが良い.