colunさんの作成されたMM Languageを学んでみます。 https://github.com/colun/mmlang https://github.com/colun/mmlang/blob/master/doc/introduction.md
マラソンマッチに勝とう!という目的というよりは、DSLや抽象化を考察することで何かに役立てられないかという視点で学んでいます。 ただ、革新的なアプローチであり、実力以上の上振れが出るかもしれないので、興味のある方はぜひ実戦に使ってみると良いのではないでしょうか。
いわゆる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の文法は、PythonとC++が混じっている感じです。
PythonのLarkというDSLのパーサが使われています。 https://github.com/lark-parser/lark
動かすときの流れは、
(https://github.com/colun/mmlang#readmeを参照)
ここで、変換後のファイルは以下で構成されます。