一応実装した。
<defmacro pattern="(xxx|yyy)_(a[0-9]|)(b[0-9]|)(c[0-9]|)" result=( (_2 ? (foos[_1].a = _2) : 0), (_3 ? (foos[_1].b = _3) : 0), (_4 ? (foos[_1].c = _4) : 0), STNIdent("foo_" + _1 + "_" + foos[_1].a + foos[_1].b + foos[_1].c))>
と、書くと、
:xxx_a1b3c4 は識別子 foo_xxx_a1b3c4 へ置換され、マクロ変数に必要な情報が記録される。以降順番に、
:xxx_ => foo_xxx_a1b3c4
:xxx_b9 => foo_xxx_a1b9c4
:xxx_a2 => foo_xxx_a2b9c4
:yyy_a2b5c8 => foo_yyy_a2b5c8
:yyy_a3c7 => foo_yyy_a3b5c7
:xxx_ => foo_xxx_a2b9c4
=>の左側のマクロ展開指定が右側の識別子へ置換される。
識別子以外にも、いろいろな構文要素へ置換することも可能。
マクロ変数はJavaScriptのオブジェクトみたいな感じ。