Standard ML のコードをリアルタイムにチェックする (Emacs + Flycheck + MLton)

必要なもの

  1. Emacs
  2. Flycheck
  3. 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 のような挙動をしてくれないようだった。