C++ template で簡易言語を作ってみた
VS2013から可変長テンプレートに対応した*1ようなので、少し遊んでました。
少し遊んでると「templateだけでsortできないかなー」とか考えだし、「それなら、Cライクな簡易言語を作ってしまえばいいんじゃね?」まで考えました。
そして、こちらが完成品になります。
tlang | c like language made from c++ template language
実行箇所だけ抜き出すと
main_< var_< a, int_a<4, 1, 6, 3, 5, 2> >, var_< t >, var_< i >, var_< j >, for_< set_< i, int_<0> >, neq_< get_<i>, int_<6> >, set_< i, plus_<get_<i>, int_<1>> >, do_< for_< set_< j, plus_<get_<i>, int_<1>> >, neq_< get_<j>, int_<6>>, set_< j, plus_<get_<j>, int_<1>> >, do_< if_< less_< get_i<a, get_<j>>, get_i<a, get_<i>> >, do_< set_< t, get_i<a, get_<j>> >, set_i< a, get_<j>, get_i<a, get_<i>> >, set_i< a, get_<i>, get_<t> > > > > > > >, return_<get_<a>> >::type
見やすく、C言語で書き直すと
main() { int a[] = { 4, 1, 6, 3, 5, 2 }; int t; int i; int j; for( i = 0 ; i != 6 ; i = i + 1 ) { for( j = i + 1 ; j != 6 ; j = j + 1 ) { if( a[j] < a[i] ) { t = a[j]; a[j] = a[i]; a[i] = a[j]; } } } return a; //C言語は駄目だよ! }
という、簡単なバブルソートになります。
C++ templateはチューリング完全であると知られていますが*2、頑張れば本当に手続き型言語っぽい物が作れると分かりました。
C++14/17で少しtemplateも拡張されますし、これからより便利になりそうです。
※ meta-template programming は、あなたの寿命を縮めます。気をつけましょう。