tiny-cをscalaに移植する。(7)

[Scala]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みたいな感じで、JavaScriptJavaのマクロを書けますよという点が優れている点です。

XMLに例えるなら、XMLのパーサ+XSLTJavaScriptも使えるという感じです。
実装はまだまだバグだらけですが、C言語にLisp級マクロがほしいという夢がここに実現されたわけです。

ソースはgithubにあります。

https://github.com/hsk/ctinyc