common lisp でシリアライズ

もともと何をしようとしてたんだっけ?
そうそう、pythonでもいじってみようかと思ったんだった。
で、comon lispの練習用に書いたプログラムをpythonで書こうかなぁと考えたんだ。
で、これは必要だけどcommon lispでまだやってないってことってあったっけ??とか考えて、そういえばcommon lispシリアライズってしたことないなぁ、と思ったんだった。

ざっとググるとcl-storeってやつを使う見たい。
CL-Prevalenceっていうのもあるみたいだけど、こっちは仕組みが大きそうなので今回はパス。

cl-storeも日本語の情報はそんなになさそう。
インストール自体はasdfであっさり入る。

CL-USER> (require 'asdf)
NIL
CL-USER> (require 'asdf-install)
("ASDF-INSTALL")
CL-USER> (asdf-install:install 'cl-store)

こんだけ。
で、使ってみる。

CL-USER> (asdf:oos 'asdf:load-op 'cl-store)
CL-USER> (cl-store:store '(a b c (d e) f) "test.dat")
(A B C (D E) F)
CL-USER> (setf ds (cl-store:restore "test.dat"))
CL-USER> ds
(A B C (D E) F)

結構簡単だ。

でもこれってファイルにダンプしている。
んーー。メモリにダンプして復元したいな。(理由はとくにないんだけど)

で、C#でいうところのMemoryStreamってあるんだっけ??
・・・標準ではないのか?なさそう。

またググってみる。
flexi-streamsっていうのがある見たい。
http://weitz.de/flexi-streams

これにmemory-input(output)-streamがある。
これもインストールはasdfで。

CL-USER> (require 'asdf)
NIL
CL-USER> (require 'asdf-install)
("ASDF-INSTALL")
CL-USER> (asdf-install:install 'flexi-streams)

でメモリストリームにシリアライズを試みてみる。

CL-USER> (require 'asdf)
NIL
CL-USER> (asdf:oos 'asdf:load-op 'cl-store)
CL-USER> (asdf:oos 'asdf:load-op 'flexi-streams)
NIL
CL-USER> (setf os (flexi-streams:make-in-memory-output-stream))
#<flexi-streams::vector-output-stream>
CL-USER> (cl-store:store '(a b c (d e) f) os)
(A B C (D E) F)
CL-USER> (setf is (flexi-streams:make-in-memory-input-stream
           (flexi-streams:GET-OUTPUT-STREAM-SEQUENCE os)))
#<flexi-streams::vector-input-stream>
CL-USER> (setf rtn (cl-store:restore is))
(A B C (D E) F)
CL-USER> rtn
(A B C (D E) F)
CL-USER>

こんな感じで成功。
ふーできた!
でも最初pythonをいじろうと思ってたような気が・・・。
まぁいいか。もう遅いからねよっと。