SMLのMessagePackライブラリを公開しました!

StandardMLでMessagePackを読み書き(?)するライブラリMsgPack-SML*1 を公開しました!


トップ画面から, [Source Code]->[Download] でダウンロードできます.

真面目なテストはしてないですが, MessagePackの一通りのデータ型に対応しています.
インターフェースも迷ってる箇所があるのでフラフラしそうですが, *2
Basisライブラリにインターフェースを部分的に合わせているので, 直感的に使える…ハズ!

作る際の方針(と目標)

  • 標準ライブラリと合わせた関数を用意する
  • 普段は簡単インターフェースを使う
  • 意識すれば速度もある程度が出せる

サンプルのビルド

ダウンロードしてきたディレクトリ内で mlton msgpack.mlb

使い方

codeplexの[Documentation]にも書いてありますがここでも紹介. (^^;;

let val xs = MP.pack $ MP.fromInt 12345
in
    print $ MP.fmt StringCvt.HEX xs
end
- CD3039
let val xs = Vector.fromList [ Word8.fromInt 0xFE ]
in
    MP.unpack xs
end
- NFNum ~2

非常に大きい配列などを断続的に読み出すことが出来るインターフェースです.

type ('a, 'b) reader = 'b -> ('a, 'b) option
scan : (W8.word, 'a) reader -> (msgtype, 'a) reader

このscan関数に, 1-word(8bit) を読み出すreaderを渡してやると,
msgpackのデータ型を読み出すストリーム型が出来上がります. 素晴らしいですね!


使ってみる

(* 文字列からhexを読む込むreader *)
val scanWord = Word8.scan StringCvt.HEX Substring.getc
(* 文字列からデシリアライズするreader *)
val scanMsgPack = (MP.scan scanWord) o Substring.full
(* 使ってみる *)
scanMsgPack "CD FF FF" == SOME (Uint16 65535, strm)

この例では単なる文字列のreaderを渡していますが,
ファイルのreaderやソケットのreaderを渡せば, それらから読み出すストリームとして使えるようになります.


enjoy packing&unpacking !

*1:そのまんま(^^;;

*2:あ. まだシグネチャも書いてない….