colunさんの作成されたMM Languageを学んでみます。 https://github.com/colun/mmlang https://github.com/colun/mmlang/blob/master/doc/introduction.md

マラソンマッチに勝とう!という目的というよりは、DSLや抽象化を考察することで何かに役立てられないかという視点で学んでいます。 ただ、革新的なアプローチであり、実力以上の上振れが出るかもしれないので、興味のある方はぜひ実戦に使ってみると良いのではないでしょうか。

MM Languageの概要

いわゆるDSLで、独自形式の言語でコードを記述すると、C++コードに変換し実行することができます。 (注:ここではDSLとしていますが、私がそう解釈しただけであり、その呼び方が適切でない可能性はあります)

目玉機能として、ループ演算子とビームサーチがあります。

特にビームサーチについて、通常はロジックの本質でない状態管理のコードを書く必要がありますが、MM Languageのビームサーチでは状態管理を自動的に効率的に行ってくれるため、本質部分に集中できます。 https://github.com/colun/mmlang/blob/master/doc/introduction.md#ビームサーチ

入力例は以下です。 https://github.com/colun/mmlang/blob/master/examples/chokudai005a.m2

出力例は以下です。 https://github.com/colun/mmlang/blob/develop/examples_outputs/chokudai005a.cpp 出力は元の入力コード(これはコンパイルされない)+ライブラリコード+変換後コード で構成されます。

DSL

DSLの文法は、PythonとC++が混じっている感じです。

PythonのLarkというDSLのパーサが使われています。 https://github.com/lark-parser/lark

動かすときの流れは、

  1. MM Languageの文法に沿ったコードを書き、拡張子.m2で保存する
  2. コマンドラインからDSLのパーサを起動し、変換を行うと、C++に変換されたコードが出力される(—runオプションをつけると、自動的にコードが実行される)
  3. コンテストには、変換されたC++コードを提出できる。

https://github.com/colun/mmlang#readmeを参照)

ここで、変換後のファイルは以下で構成されます。