2009-02-24

salのマクロ

一応実装した。

<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のオブジェクトみたいな感じ。