tiny-cをscalaに移植する。(7)
今回は、lisp級マクロを組み込みました。
作業的には以前作っていたものをコピしただけなので、数十分の作業でした。
(コピペだけなら、数十秒で、動作確認に数十分、ブログ書くのに数十分です。)
mac (add1('a)) ( a + 1 ) def main = fun() { println("s = %d", add1(5)); }
これで、コンパイルタイムにadd1(5)は6に変換されます。
C言語のプリプロセッサと何が違うのかといいますと、マクロに命令がつかえることです。
mac (fib('a)) (f=fun(a){if(a<=1)1 else f(a-1)+f(a-2)}; f(a) ) def main = fun() { println("fib = %d", fib(10)); }
このようにすれば、コンパイルタイムにフィボナッチが計算されます。
Javaにたとえるなら、マクロ用言語はJavaScriptみたいな感じで、JavaScriptでJavaのマクロを書けますよという点が優れている点です。
XMLに例えるなら、XMLのパーサ+XSLTでJavaScriptも使えるという感じです。
実装はまだまだバグだらけですが、C言語にLisp級マクロがほしいという夢がここに実現されたわけです。
ソースはgithubにあります。