#:g1: cl-marshalの紹介

Posted 2014-07-11 06:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の192日目です。

cl-marshalとはなにか

 cl-marshalは、Michael Wolber氏によるCommon Lispオブジェクトをマーシャル/アンマーシャルするライブラリです。

パッケージ情報

パッケージ名cl-marshal
Quicklisp
CLiKiCLiki: cl-marshal
Quickdocscl-marshal | Quickdocs
CL Test Grid: ビルド状況cl-marshal | CL Test Grid

インストール方法

(ql:quickload ::marshall)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 基本的に使い方はシンプルで、書き出しにms:marshall、読み込みにms:unmarshalを利用します。

(ms:marshal (list 1 2 3 "Foo" "Bar" (make-array '(3) :initial-contents '(a b c))))
;=>  (:PCODE 1 (:LIST 1 1 2 3 (:SIMPLE-STRING 2 "Foo") (:SIMPLE-STRING 3 "Bar") (:ARRAY 4 (3) T (A B C))))

(ms:unmarshal (ms:marshal (list 1 2 3 "Foo" "Bar" (make-array '(3) :initial-contents '(a b c))))) ;=> (1 2 3 "Foo" "Bar" #(A B C))

(defstruct bamatu x y z)

(ms:unmarshal (ms:marshal (make-bamatu :x 1 :y 2 :z 3))) ;=> #S(BAMATU :X 1 :Y 2 :Z 3)

 上記のようにCommon Lispが標準で用意しているデータ型についてはカバーできますが、クラスオブジェクトについてはスロットの定義を指定してやる必要があります。

(defclass ship ()
  ((name :initform "" :initarg :name :accessor name)
   (dimensions :initform '(:width 0 :length 0) :initarg :dimensions :accessor dimensions)
   (course :initform 0 :initarg :course :accessor course)
   (cruise :initform 0 :initarg :cruise :accessor cruise) ; shall be transient
   (dinghy :initform NIL :initarg :dinghy :accessor dinghy :initarg :dinghy)) ; another ship -> ref
  (:documentation "A democlass. Some 'persistant slots', one transient.~@ 
                   Some numbers, string, lists and object references."))

;; スロット定義が分からないので空 (ms:marshal (make-instance 'ship :name "Ark" :course 360 :dimensions '(:width 30 :length 90))) ;=> (:PCODE 1)

;;; スロット定義を指定 (defmethod ms:class-persistant-slots ((self ship)) '(name dimensions course dinghy))

(ms:marshal (make-instance 'ship :name "Ark" :course 360 :dimensions '(:width 30 :length 90))) ;=> (:PCODE 1 (:OBJECT 1 SHIP (:SIMPLE-STRING 2 "Ark") (:LIST 3 :WIDTH 30 :LENGTH 90) 360 (:LIST 4)))

(ms:unmarshal (ms:marshal (make-instance 'ship :name "Ark" :course 360 :dimensions '(:width 30 :length 90)))) ;=> #<SHIP {1021742543}>

 さらにインスタンスの初期化の詳細については、ms:initialize-unmarshalled-instanceで指定可能です。

まとめ

 今回は、cl-marshalを紹介してみました。
cl-marshalはシンプルで使い易そうですね。

comments powered by Disqus