2012-10-11 12 views
6

सेक्सप्लिब का सिंटैक्स एक्सटेंशन ओकैमल में मनमाने ढंग से उपयोगकर्ता परिभाषित डेटा संरचनाओं के क्रमिकरण और deserialization बनाता है। यह आम तौर पर एक प्रकार परिभाषा के अंत में एक with sexp एनोटेशन जोड़ने द्वारा किया जाता है:मैटल जैसे मज़ेदार प्रकारों के साथ सेक्सप्लिब का उपयोग कैसे किया जा सकता है?

type a = A of int | B of float with sexp 

यह functor आधारित प्रकार के लिए सीधे सामान्यीकरण करने के लिए प्रतीत नहीं होता, न ही यह कैसे Sexplib मानक प्रकार कन्वर्टर्स भी कैप्चर कर सकते हैं स्पष्ट है मानक functors।

अब तक मैंने सीरियलाइजेशन से पहले एक सूची में एक विशिष्ट मानचित्र प्रकार उदाहरण (उदाहरण के लिए int Map.Make(String).t) को फ़्लैट करके इस पर काम किया है, और इसके विपरीत, लेकिन निश्चित रूप से यह सेक्सप्लिब/जेन के आम तौर पर महत्वाकांक्षी लेखकों द्वारा पूरी तरह से अनदेखा नहीं किया गया है स्ट्रीट कोर मैं यह भी ध्यान देता हूं कि पुराने बैटरियों के संस्करण कस्टम सेक्सप सीरियलाइजेशन में अपने मुख्य मॉड्यूल जैसे [बैट] मानचित्र में मिश्रण करते हैं, लेकिन यह कुछ समय के लिए हटा दिया गया है।

मैप्स या अन्य जटिल मज़ेदार प्रकार आमतौर पर Sexplib serialization के साथ कैसे उपयोग किए जाते हैं?

+2

मुझे लगता है कि आप इसके लिए व्यापक सेक्सप्लिब रूपांतरण कार्यों के साथ एक विस्तारित मानक लाइब्रेरी का उपयोग करेंगे। क्या आपने 'कोर' देखा है? मैंने केवल 5 मिनट बिताए लेकिन इन 5 मिनटों में मैंने मज़ेदार 'सेट.मेक' लगाया और उसने मुझे तर्क प्रकार पर सेक्सप्लिब रूपांतरण कार्यों के लिए कहा ताकि यह परिणामी सेट प्रकार के लिए सेक्सप्लिब रूपांतरण कार्यों का निर्माण कर सके। –

उत्तर

1

एक तरीका एक नया मज़ेदार परिभाषित करना है जो डेटा को क्रमबद्ध करने के लिए आवश्यक अतिरिक्त जानकारी लेता है। बैटरियों के साथ अतीत में मैंने एक पूर्ण कार्यान्वयन किया है। नोट मैंने मानचित्र के असाधारण और लेबल किए गए संस्करण को भी प्राथमिकता दी, इसलिए मैंने उनको खोला है, लेकिन आप इसे निश्चित रूप से हटा सकते हैं।

module type SEXPABLE = sig 
    type t 
    val sexp_of_t : t -> Sexplib.Sexp.t 
    val t_of_sexp : Sexplib.Sexp.t -> t 
end 

module Map = struct 

    module type S = sig 
    include BatMap.S 
    include module type of Labels 
    include module type of Exceptionless 
    val sexp_of_t : ('a -> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t 
    val t_of_sexp : (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a t 
    end 

    module Make (Ord : BatInterfaces.OrderedType) 
       (Sexpable : SEXPABLE with type t = Ord.t) 
       : S with type key = Ord.t = struct 
    include BatMap.Make(Ord) 
    include Labels 
    include Exceptionless 

    open Sexplib.Sexp 
    open Sexplib.Conv 

    let sexp_of_t sexp_of_data t = 
     let f ~key ~data ans = List [Sexpable.sexp_of_t key; sexp_of_data data] :: ans in 
     List (fold ~f ~init:[] t) 

    let t_of_sexp data_of_sexp sexp = match sexp with 
     | Atom _ -> of_sexp_error "Map.Make(...).t_of_sexp: list needed" sexp 
     | List l -> 
      let f ans = function 
      | List [key_sexp; data_sexp] -> 
       let key = Sexpable.t_of_sexp key_sexp in 
       let data = data_of_sexp data_sexp in 
       add ~key ~data ans 
      | List _ | Atom _ -> 
       of_sexp_error "Map.Make(...).t_of_sexp: 2-tuple list needed" sexp 
      in 
      List.fold_left ~f ~init:empty l 
    end 
end 

यदि मुझे सही याद है, बैटरी ने अतिरिक्त पुस्तकालयों पर निर्भरताओं को कम करने के लिए ऐसी सुविधाओं को हटा दिया है। आपका दूसरा विकल्प कोर का उपयोग करना है, जिसमें इन कार्यों को आउट-ऑफ-द-बॉक्स है।

संबंधित मुद्दे

 संबंधित मुद्दे