2012-04-30 3 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은 문자열의 첫 번째 항목 만 deserialize합니까? 그것들은 완벽하게 "매치"하지 않는 것이 조금 이상해 보입니다. –

+0

예, 이상합니다. 'load-file'은 파일의 마지막 형식만을 반환합니다 ... –

3

그것의 지퍼는 그 이후로 그것이 branch?/children/make-node 기능을 추적하는 것으로 보인다. 그래서 뭔가 같음

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

(def deserialize read-string) 
+0

이것은 모든 메타 데이터 값이 일반적으로 읽을 수없는 함수이기 때문에 특히 유용하지 않습니다. –

관련 문제