Standard ML のコードをリアルタイムにチェックする (Emacs + Flycheck + MLton)
必要なもの
- Emacs
- Flycheck
- MLton
手順
init.el に以下のように書いておく。
(require 'flycheck) (flycheck-define-checker mlton "Standard ML type and syntax checking with mlton compiler. See URL 'http://mlton.org" :command ("mlton" "-stop" "tc" source) :error-patterns ((error line-start "Error: " (file-name) blank line ?\. column ?\. "\n" (message (1+ line-start (1+ blank) (+ nonl) "\n")))) :mode (sml-mode)) (add-to-list 'flycheck-checkers 'mlton)
経緯
κeen 氏によるこちらの記事
SMLSharpを使ってSMLのon-the-flyエラーチェック
を読んでいて、MLton にも型チェックだけするオプションがなかったっけ、と思ったので MLton を使った文法チェッカを Flycheck に登録するコードを書いてみた。
氏は Emacs に標準でついている Flymake を用いてチェッカを書かれているのに対して、 私がインストールの必要な Flycheck を用いているのは、単にこちらの方が登録コードを書くのが簡単そうだったからである。
ハマったとこ
だが、実際はかなり試行錯誤した。
特に複数行にわたるエラーメッセージを取得するやりかたはなかなかわからなかった。
行の開始 line-start と対になり、行の終わりを意味すると思われる line-end が、 行末だけではなく、どうもパースの終わりをも意味しているようで、 line-end とマッチするとそれ以降のエラーメッセージの解析を行わない。
なので、行末とマッチさせるために代わりに "\n" を用いた。 これが正解なのかはわからない。
パターンを直しては M-x flycheck-compile (C-c ! C-c) をして確認、また直しては確認、 という手順を繰り返した。
課題
処理系依存。MLton をインストールしなければならない。
Poly/ML と SML/NJ についてもざっと調べたけれど、これらの処理系は最初のエラーを見つけるとそこでチェックをやめてしまい、「コード全体をみて複数のエラーを列挙する」という MLton のような挙動をしてくれないようだった。