自作言語Xemono
去年の終わり頃からReason MLよろしくOCamlのシンタックスをいじった言語の仕様を考えている。
今のところ新規性はまったくなく、OCamlと100%互換性がある言語仕様を目指している。(ただし今のところオブジェクト関連の機能についてはまったくノータッチ・・・)semantics的にはOCamlは本当に個人的な理想に近いと感じる。
なので変えているのはガワだけ。
外見的な部分はかなりPythonからとっている。(各方面から嫌がられそうだけど・・・)
その最たる部分は定幅インデントによるブロックわけでスコープが決まって、変数束縛には=
、関数定義には:
を使う(letはなし)
returnなしでスコープの一番下の式の値がスコープ全体の値になるのはどちらかというとLisp(かRuby)に似ている。関数型言語をブロックで表現しようとすると結構自然とこうなる気がする。
行末の:
+インデントによるブロック以外では、主にPEP20の思想に強く影響を受けている。
あとHaskellから$
とwhere
をもらってきた。
実装
まだない。OCaml + Menhirでやる。
パースに関しては
そもそも文脈自由言語じゃないから書けなくないですか
— research-by-need (@fetburner) 2018年12月18日
と指摘をいただいたように、Context Free Grammarではないのでその依存性をどう解決するかが一つのポイント。
lexerとparserの間にインデントルールの解釈をするコードを挟んで、EOL
/INDENT
/DEDENT
をトークンとして挿入していくのが良さそうだと現在は考えている。
ASTにしてしまえばそこから対応するOCamlに変換するのは簡単だと思う。とりあえず当面はOCamlにコンパイルすることを目指す。(その次はcmmかな)
近いうちに着手したい。
長期的には「modular implicitsをXemono言語側で実装できたら・・・」という思いがある。その場合は型推論もOCaml側に頼れないので、その実装からだが・・・
コード例
仕様をある程度試すために、Real World OCamlのサンプルコードをXemonoでちょこちょこ書いてみた:
細かいところで気になる点があったり、思わないところで大きな仕様漏れがあったり、となかなか役に立った。OCaml自体の仕様についても少し理解が深まっていくので、それもかなりうれしい。これからも継続してサンプルコードを翻訳してはレポジトリにあげていくつもり。
気になっている点
- 関数定義と分岐条件の見た目が同じでコンテキスト依存
- 関数定義に
def
キーワードを導入するか悩み中 - 分岐条件やパターンマッチに
case
キーワードを入れるのは文法が重くなる気がする
- 関数定義に
- モジュールの最上層での
let x = y;
とlet x = y in ...
の違いがlet
/in
を使わない分理解しにくくなっている?- これはドキュメントで説明するのが大事なだけかも
:
だと見た目が弱いので、一行でパターンマッチとその結果を記述する時などに条件と結果の境目が一目で判別しにくい- 試行錯誤の結果、
:
の後にスペースを二つ入れると問題がかなり緩和されることがわかった
- 試行錯誤の結果、
名前について
便宜上自分の中で言語Xと呼んでいたのだが、Xerxesをクセルクセスと読むことに気づいて、自然と決まった。
今後
とりあえず仕様はある程度固まってきたのでぼちぼち実装をはじめる。近いうちにModern Compiler Implementation in Xemonoみたいな企画ができるといいな。