smlnjlibをSML#に移植した

あけましておめでとうございます。2015年最初の記事です。今年もよろしくお願いします。


smlnjlibというライブラリ集の一部をSML#(2.0.0)用に移植しました。> smlnjlib#
例によって移植と言ってもsmiファイルをひたすら書いただけなので実装を詳細に把握しているわけではありません。


smlnjlibは SML/NJ の配布物に含まれるライブラリ集で、mltonが一部(ほとんど?)を移植、sml#が一部を取り込んで使用するなどSML界では広く知られています。
このライブラリは以下のライブラリ群から成ります。'X' の付いたライブラリを移植済みです。

ライブラリ 移植 適当な説明
Controls X グローバル設定
Doc なんだかよく分からない。テンプレートエンジン??
HashCons X コンストラクタを圧縮表現するテクニックを実装(多分)
HTML HTML3.2(!!)のパーサとプリンタ。要らんでしょ…。
HTML4 HTML4.01のパーサとプリンタ。
INet socketのてきとーなラッパー。
JSON JSONパーサ。ストリームパーサとイベントパーサ(?)が使える。
PP X 典型的な実装のpretty printer。
Reactive よく分からない。
RegExp X 正規表現。文法とバックエンドをfunctorパラメータとして選択出来る。
SExp 最近入ったナゾのS式パーサ。なぜ入れた。
Unix unixパスのユーティリティ。
Util X この中で一番便利な小物集。特にmap/setが他のライブラリからよく参照される。
XML 最新版(110.77)で入ったXMLパーサ。なぜ入れた。

移植したライブラリが参照していたため、SML#の提供していないbasisの一部と、njが提供しているunsafeモジュール(の一部)も実装してあります。
これも頭に入れておくと無駄な再実装を避けられる場合があるかも知れません。

ライブラリ 実装 適当な説明
basis X Array2とpackword
unsafe X njに合わせたunsafe array/vector

使い方

ビルドするのに必要なことはトップレベルで make するだけです。

make -f Makefile.smlsharp


使うためには、使いたいライブラリのトップレベルのsmiファイルを_requireして下さい。
個別に指定してもいいですが、トップレベルのファイルを参照しておくと.cmの参照と対応が取りやすいです。
例えば Util の機能を使いたい場合は以下のようになります。

(* hoge.smi *)
_require "Util/smlnj-lib.smi"

(* hoge.sml *)
... IntRedBlackMap.find ...
$ smlsharp -I/path/to/smlnjlib-sharp hoge.sml

Note

  • オリジナルのコードでは where K = K などとしているものはsmlnjによる拡張機能ですので where type K.ord_key =... 等のように書き換えてあります。
  • Util/rand.sml はWord31をWord32に単純に置き換えているだけなので乱数の性質とか怪しいかも知れません