マクロの多用

マクロの多用といってもSchemeのマクロではない。
C言語のマクロである。


手続きを簡単に効率良く書けるようにという意図。
例えば char=? であれば

PROCEDURE(CharcterEqualP, "char=?")
{
    ARGC_SHOULD_BE(2);
    CAST(ARGV(0), Charcter, c);
    RETURN_BOOLEAN(c->eqv(ARGV(1)));
}

の様に書ける。
これが展開されると恐らく100行くらいになる。


このマクロは出来る限り楽をするためのマクロなので

  • クラス定義
  • 必須関数の実装
  • エラー時の大域脱出処理
  • 処理系への手続きの登録

などの面倒処理を全てやってくれる。


一番悩んだのが処理系への登録手続きの自動化だが、以前 Tino さんが教えてくれた方法を採用した。
static な構造体のコンストラクタを利用する方法である。
マクロの該当部分は以下の通り。

void initialize##ClassName()                                                     \
{                                                                                \
    procedures.push_back(                                                        \
        pair<Variable*, Object*>(new Variable(name), new ClassName()));          \
}                                                                                \
static struct Wrapper##ClassName                                                 \
{                                                                                \
    Wrapper##ClassName(){initialize##ClassName();}                               \
} initializer_##ClassName;                                                       \


楽をするために時間をかけてマクロを整備したけどこれは後々十分取り戻せると思う。