SML# + annot: 式の型を表示するコンパイラ拡張をリリースしました
SML#は東北大学の大堀研が開発を進めている関数型プログラミング言語です。SMLとの互換性を保ながら、C言語ライブラリとの直接連携や多相レコードなどの仕組みが取り入れられています。
そして、他のML系言語と同様に非常に強力な型推論を持っています。 おかげで安全性を失わずにコードをさくさく書くことができます。
しかし、型がコード上に登場しないので必ずしも読みやすいとは言えません。あるいは、コンパイラが完全な型推論をできるのに、人間が(間違っているかもしれない)型推論するのは無駄な作業であるとも言えます。
そこで、この拡張はコンパイル中の型情報をダンプできるようにし、任意の式の型をEmacs上で表示できるようにします。
ちなみに元ネタはOCamlの-annotオプションですが、ファイルフォーマット等に互換性はありません。
ダウンロード・インストール・使い方
mzp/smlsharp-annot · GitHubを参照してください。 基本的にSML# コンパイラの取得→パッチの適用→ビルド、という流れになります。
*.annotファイルの形式
型推論が終わったtpexpをS式として*.annotファイルに吐き出しています。
*.annotの形式は次のようになっています。
;; (<ファイル名> (<開始行> <開始列>) (<終了行> <終了列>) <型名>) ("fact.ml" (1 5) (5 26) "int -> int")
わりと汎用的になっているので、vim版とかを作るのもそれほど難しくないと思います。
謝辞
SML#コンパイラの構造は、@keita44_f4(a.k.a. よんた)さんに教えてもらいました。
またEmacs Lispは@dico_lequeさんが作ってくれました。
ありがとうございます!!
バグ報告
バグ報告はpull requestで(ry