Factorのマクロ
Factorはマクロも使えるよ!って話。
とりあえずシンプルな例で。
マクロはMACRO: word定義できる。
例:指定回数、指定wordを実行する
USING: kernel sequences quotations macros namespaces ;
MACRO: ntime ( n word -- )>quotation ;
>quotationは配列をquote(無名関数)に変換するword.
word自身をスタックに積むのでwrapperを使ってるけど邪魔臭いかな。
macroの展開系を確認するにはmacro-expandを使う
macro-expandはmacroを引数にとる
USE: macros
1 2 3 4 .s
1
2
3
4
! ntimes自身もwrap
2 \ drop \ ntimes macro-expand .
[ drop drop ]
dropを2回呼ぶquotに変換されているのがわかる。
まあLispと同じでマクロで書かないといけない処理はあんましないと思うんだけどね。
quotを操作するのも別にwordでできるし。
利点はコンパイル時に展開してやっちゃうぐらいかなあ。
まだ深く追いかけてないけどcore辺りでマクロ使ってるっぽいので今後調べる。