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に単純に置き換えているだけなので乱数の性質とか怪しいかも知れません