2016-08-29 6 views
5
(require '[clojure.spec :as s]) 

निम्न डेटा पार्स:साथ clojure.spec

(def data {:names [["Anna"  :lucky] 
        ["Peter"] 
        ["Jon"  :lucky] 
        ["Andre"  :lucky]]}) 

यह एक कुंजी के साथ की एक हैश नक्शा है: नाम वैक्टर का एक वेक्टर के एक मूल्य है। आंतरिक वैक्टर में पहले तत्व के रूप में एक स्ट्रिंग होनी चाहिए और वैकल्पिक रूप से एक कीवर्ड हो सकता है: दूसरे तत्व के रूप में भाग्यशाली।

पिछले दो वाक्यों clojure.spec साथ वर्णित किया जाना चाहिए - के सदिश में आइटम के साथ शुरू करते हैं:

(s/def ::item (s/cat :name string? :lucky (s/? #(= :lucky %)))) 

(s/conform ::item ["Tom"]) 
;; {:name "Tom"} 
(s/conform ::item ["Tom" :lucky]) 
;; {:name "Tom", :lucky :lucky} 
(s/conform ::item ["Tom" :sad]) 
;; :clojure.spec/invalid 

यह काम करता है। हालांकि, अगर केवल एक विकल्प है। एक पार्सड परिणाम इस तरह बेहतर नहीं होगा:

`{:name "Tom", :lucky true}` or `{:name "Tom", :lucky false}` 

क्या यह clojure.spec में किया जा सकता है?

इस के साथ

, एक पर ले जा सकता है:

(s/def ::items (s/coll-of ::item '())) 

(s/conform ::items [["Tom" :lucky] ["Tim"]]) 
[["Tom" :lucky] ["Tim"]] 

हालांकि, यह लग रहा है यह परीक्षण में सफ़ल लेकिन क्यों आइटम अब पार्स नहीं कर रहे हैं की तरह?

संपादित करें:यह alpha7 से alpha10 रिहाई, जहां coll-का केवल एक ही तर्क

अंत में मेरी कल्पना की तरह लग रहा लेता है, होने पर स्विच करके हल किया जा सकता पहले बताए चेतावनियां:

(s/def ::my-spec (s/keys req-un [::items])) 
+0

बस एक साइड नोट - '# (=: भाग्यशाली%)' '# {: भाग्यशाली}' के रूप में बेहतर है। –

उत्तर

2

spec मनमाने ढंग से डेटा परिवर्तन प्रदान करने के लिए डिज़ाइन नहीं किया गया है (क्लोजर की कोर लाइब्रेरी का उपयोग इसके लिए किया जा सकता है)।

s/conformer का उपयोग करके इसे हासिल करना संभव है, लेकिन इस तरह के मनमाने ढंग से परिवर्तन के लिए उस सुविधा का उपयोग करने की अनुशंसा नहीं की जाती है (यह कस्टम चश्मा बनाने जैसी चीजों के लिए बेहतर है)।

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