S.F.@SFPGMR
プリプロセッサについてはここまでで
・ソースインクルード
・条件付きインクルード
・マクロ
・JSによるメタプログラミング
が一応できたことになる。機能的に十分かは別にして。
今回作成したプリプロセッサは以下のように
JSでコードを書いてコンパイル時にデータセクションを生成することができたりする。つまり
JSによってWASMコードを静的に(コンパイル時は動的に)生成することができるのですな。 https://t.co/afhJxXH787
これはデータセクションに限った話ではなくソースコードのどの部分でもブレスで囲む領域に
JSコードを書くことによって、コンパイル時にwasmソースを生成することができる。
ブレスで囲む領域は文字列を返す関数として実行されるのですな。その関数には$という変数に実行コンテキスト(と言っていいのかな?)が格納されて引数として渡され、それを使ってメタ情報にアクセスできるようになっている。
(i32.add
{return '(i32.const 10)';}
(i32.const 20)
)
は
(i32.add
(i32.const 10)'
(i32.const 20)
)
と等価であるということですな。。
こういうことができるとコンパイル時に解決できることが増えるんじゃないかなと思ったけど、今のところデータセクションの生成以外使っていない。。
例えばループアンロール的な処理は
(func $a
{
let out = '';
for(let i = 0;i< 5;++i){
out += `(i32.add (i32.const ${i}) (i32.const 20))`;
}
return out;
}
)
こんな感じに書けるわけですな。