Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

Factorのマクロ

Factorはマクロも使えるよ!って話。
とりあえずシンプルな例で。
マクロはMACRO: word定義できる。
例:指定回数、指定wordを実行する

USING: kernel sequences quotations macros namespaces ;
MACRO: ntime ( n word -- ) >quotation ;

は指定した数、指定したobjectをコピーして配列にする.
>quotationは配列をquote(無名関数)に変換するword.

1 2 3 4 .s
1
2
3
4
! 2回dropを実行する
2 \ drop ntimes .s
1
2

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辺りでマクロ使ってるっぽいので今後調べる。