タイトル無し

お題「海派? 山派?」

家派。いつも行くところやいつものルートからあまり逸脱したくない。広い意味での引きこもり。

強いていえば海派か。

お題スロットを試す

お題「初めて買ったCD」

TWO-MIX の 8cm シングル CD。タイトルは『TIME DISTORTION』 (いま調べた)。

地元のデパートの CD 売り場で購入。とにかく TWO-MIX が聴きたくて、 どれが何の曲なのかも知らずに選んだ記憶がある。

どうして TWO-MIX だったのかは、よくわからない。なんでだろ。

いまその CD 売り場はなくなって、美容室になっている。

Standard ML で簡易タイマを書いてみた

概要

time(1) コマンドや、Common Lisp の time 関数 のような、 処理全体にどのくらい時間がかかっているのか教えてくれる関数が Standard ML の標準ライブラリになさそうだった。なので自分でいい加減なものを書いてみた。

幸い、実行時間を測るタイマ自体は標準ライブラリが提供してくれていた。 なので「書いてみた」といっても、標準ライブラリの呼び出しているだけ。

コード

fun time f = let
    val realt = Timer.startRealTimer()
    val rv = f ()
    val elapsed = Timer.checkRealTimer realt
in
    (Time.toMilliseconds elapsed, Time.toMicroseconds elapsed, rv)
end;

使い方

これは、こんな感じで使う。

fun hoge arg1 arg2 = ...;

val (milli, micro, rv) = time (fn () => hoge n m);

このように、測りたい関数を呼び出す、引数のない関数を time に渡すだけである。 time 関数は

  • 関数を処理するのにかかった時間 (単位: ミリ秒)
  • 同上 (単位: マイクロ秒)
  • 関数の戻り値

の三つ組を返す。

ここまで

使い方の具体例とか必要?

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

テスト

はてなブログ始めました

Markdown で書きたかったのでダイアリーからブログに移ってみました。

ゲームのこととか、プログラミングのこととか、なにか適当なこと、役には立たないこと、Twitter には収まらない長い独りごと、などを書いていくつもりです。