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をいじろうと思ってたような気が・・・。
まぁいいか。もう遅いからねよっと。