So-net無料ブログ作成

SMLのためのMessagePack実装 - ML-MessagePack [SML]

SML用のMessagePack実装を作りました。

https://github.com/tkob/mlmsgpack

対応するSML処理系としてはMLton, MLKit, Poly/ML, SML/NJ, Moscow ML, HaMLet, Alice ML, SML#です。これらすべてでコンパイルが通るようにしてありますが、テストケースが無傷で通るのは最初の3つだけで、他は処理系側で機能に制限があったりバグがあったりします。特にSML#は大半のテストが通りません。

[2014/4/5追記] SML#1.2.0ではテストが通りませんでしたがSML#2.0.0では通るようになりましたので、SML#を使う場合は2.0.0以上をお使いください。

* 使い方

扱いたいデータ型に対するpacker/unpackerを基本的なコンビネーターを組み合わせて作ります。こんな感じです。

> val outs = BytesIO.mkOutstream ();
val outs = ref Nil : BytesIO.bytes_list ref
> doPack (packList (packPair (packInt, packBool))) [(1, true),  (2, false)] outs;
val it = () : unit
> BytesIO.toBytes outs;
val it = fromList[0wx92, 0wx92, 0wx1, 0wxC3, 0wx92, 0wx2, 0wxC2]
: Word8Vector.vector
> doUnpack (unpackList (unpackPair (unpackInt, unpackBool))) (BytesIO.fromBytes it);
val it = ([(1, true), (2, false)], fromList[])
: (int * bool) list * BytesIO.instream


詳しくは同梱のTUTORIAL.mdを参照してください。

* 開発の経緯

別のSMLプロジェクトで、データをマーシャルして流すようにしたいとおもい、フォーマットとしてはMessagePackに目を付けました。

SML向けのMessagePack実装としてはMsgPack-SML https://msgpacksml.codeplex.com/ というものがすでに存在することが分かったのですが、少し使ってみたところこれは事実上MLton専用で、移植も簡単にはいかないということがわかったので、結局自分で作ることにしました。

移植性というのをコンセプトの1つにしたので各種処理系でテストしながら作っていたのですが途中からSML処理系自体に対するテストみたいになってしまった。

あといざ実装してみるとMessagePackの仕様自体にも多少不満があって、もうちょっと明示的に書いてほしいところが足りてなくて迷うときがあった。これについては時間があれば別の機会に書きたい。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0