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 は、あなたの寿命を縮めます。気をつけましょう。