Arantium Maestum

プログラミング、囲碁、読書の話題

自作言語Xemono

去年の終わり頃からReason MLよろしくOCamlシンタックスをいじった言語の仕様を考えている。

github.com

今のところ新規性はまったくなく、OCamlと100%互換性がある言語仕様を目指している。(ただし今のところオブジェクト関連の機能についてはまったくノータッチ・・・)semantics的にはOCamlは本当に個人的な理想に近いと感じる。

なので変えているのはガワだけ。

外見的な部分はかなりPythonからとっている。(各方面から嫌がられそうだけど・・・)

その最たる部分は定幅インデントによるブロックわけでスコープが決まって、変数束縛には=、関数定義には:を使う(letはなし)

returnなしでスコープの一番下の式の値がスコープ全体の値になるのはどちらかというとLisp(かRuby)に似ている。関数型言語をブロックで表現しようとすると結構自然とこうなる気がする。

行末の:+インデントによるブロック以外では、主にPEP20の思想に強く影響を受けている。

あとHaskellから$whereをもらってきた。

実装

まだない。OCaml + Menhirでやる。

パースに関しては

と指摘をいただいたように、Context Free Grammarではないのでその依存性をどう解決するかが一つのポイント。

lexerとparserの間にインデントルールの解釈をするコードを挟んで、EOL/INDENT/DEDENTトークンとして挿入していくのが良さそうだと現在は考えている。

ASTにしてしまえばそこから対応するOCamlに変換するのは簡単だと思う。とりあえず当面はOCamlコンパイルすることを目指す。(その次はcmmかな)

近いうちに着手したい。

長期的には「modular implicitsをXemono言語側で実装できたら・・・」という思いがある。その場合は型推論OCaml側に頼れないので、その実装からだが・・・

コード例

仕様をある程度試すために、Real World OCamlのサンプルコードをXemonoでちょこちょこ書いてみた:

github.com

細かいところで気になる点があったり、思わないところで大きな仕様漏れがあったり、となかなか役に立った。OCaml自体の仕様についても少し理解が深まっていくので、それもかなりうれしい。これからも継続してサンプルコードを翻訳してはレポジトリにあげていくつもり。

気になっている点

  • 関数定義と分岐条件の見た目が同じでコンテキスト依存
    • 関数定義にdefキーワードを導入するか悩み中
    • 分岐条件やパターンマッチにcaseキーワードを入れるのは文法が重くなる気がする
  • モジュールの最上層でのlet x = y;let x = y in ...の違いがlet/inを使わない分理解しにくくなっている?
    • これはドキュメントで説明するのが大事なだけかも
  • :だと見た目が弱いので、一行でパターンマッチとその結果を記述する時などに条件と結果の境目が一目で判別しにくい
    • 試行錯誤の結果、:の後にスペースを二つ入れると問題がかなり緩和されることがわかった

名前について

便宜上自分の中で言語Xと呼んでいたのだが、Xerxesをクセルクセスと読むことに気づいて、自然と決まった。

今後

とりあえず仕様はある程度固まってきたのでぼちぼち実装をはじめる。近いうちにModern Compiler Implementation in Xemonoみたいな企画ができるといいな。