2012-04-30 14 views
3
repl> (-> root zip/down zip/right) 
[{:answer-keys [5 6], :id 3} {:l [{:id 2, :answer-keys []}], :pnodes [{:answer-keys [2 3 4], :id 1}], :ppath nil, :r ({:answer-keys [7], :id 4})}] 

replにジッパーをプリントアウトするとこのデータが表示されます。私はこれがジッパーをシリアル化するために必要なすべてのデータかもしれないと思っていますか?提供されたデータからジッパーを直列化解除することは可能ですか?ジッパーをシリアル化しますか?

私はzip/serializeとzip/deserialize関数のようなものを探しています。

(def s (zip/serialize (-> root zip/down zip/right))) ;; s is a string 
(def d (zip/deserialize s)) ;; d is a zipper location 
;;And I can go on using the deserialized zipper d without any difficulty. 

誰でもこの方法を知っていますか?

答えて

4

ジッパーの魔法は、木構造の任意に変更されたバージョンを作るために必要なすべてのものを表すデータ構造です。 ジッパー印刷し、それらが適切な値であり、あなたはpr-strとそれを「シリアライズ」とジッパーを作るread

でそれを「デシリアライズ」することができますどのような状態

を必要としないので、だけで罰金をお読みください。

user> (zip/vector-zip [[1 [2]][3][4]]) 
[[[1 [2]] [3] [4]] nil] 
user> (def s (zip/vector-zip [[1 [2]][3][4]])) 
#'user/s 
user> s 
[[[1 [2]] [3] [4]] nil] 

は、文字列にシリアライズ:

user> (def serialized-s (pr-str (zip/next s))) 
#'user/serialized-s 
user> serialized-s 
"[[1 [2]] {:l [], :pnodes [[[1 [2]] [3] [4]]], :ppath nil, :r ([3] [4])}]" 

はそれをリードバック:

user> (def deserialized-s (read-string "[[1 [2]] {:l [], :pnodes [[[1 [2]] [3] [4]]], :ppath nil, :r ([3] [4])}]")) 
#'user/deserialized-s 

は結果で何かをする:あなたはおそらくも着るclojure.zipメタデータをシリアル化する必要が

:アーサーの答えに拡大すること

user> (zip/root deserialized-s) 
[[1 [2]] [3] [4]] 
+0

ここでは永続的なデータ構造の賞賛を歌うことが非常に魅力的だった... –

+0

おお、それはとてもクールです。そして、私はそれがパスをバックアップする閉鎖を作成していたと思っていた。ハハ。私の唯一の残りの質問は、print-strが式をシリアル化するのに対し、read-stringは文字列の最初の項目を逆シリアル化するのはなぜですか?彼らは完璧に "マッチ"していないというのはちょっと奇妙なようです。 –

+0

うん、それは奇妙だ。 'load-file'はファイル内の最後の形式だけを返します。 –

3

そのジッパーは、branch?/children/make-nodeの機能を追跡している場所のようです。だから何かのように

(defn serialize [zipper] 
    (binding [*print-meta* true] 
    (pr-str zipper))) 

(def deserialize read-string) 
+0

これは、すべてのメタデータ値が一般に読めない関数であるため、特に有用ではありません。 –

関連する問題