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