SMLのMessagePackライブラリを公開しました!
StandardMLでMessagePackを読み書き(?)するライブラリMsgPack-SML*1 を公開しました!
トップ画面から, [Source Code]->[Download] でダウンロードできます.
真面目なテストはしてないですが, MessagePackの一通りのデータ型に対応しています.
インターフェースも迷ってる箇所があるのでフラフラしそうですが, *2
Basisライブラリにインターフェースを部分的に合わせているので, 直感的に使える…ハズ!
作る際の方針(と目標)
- 標準ライブラリと合わせた関数を用意する
- 普段は簡単インターフェースを使う
- 意識すれば速度もある程度が出せる
使い方
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 !