2017-07-29 11 views

उत्तर

3
docstring से

:

ReTag मिलान टैग के साथ उत्पन्न मूल्यों फिर से टैग करने पीढ़ी के दौरान प्रयोग किया जाता है। रीटैग या तो एक कीवर्ड हो सकता है, जिस पर प्रेषण-टैग का आकलन किया जाएगा, या जेनरेटेड मान का एक एफएन और प्रेषण-टैग जो उचित रूप से रीटैग किए गए मान को वापस कर देना चाहिए।

तो retag (spec guide example के रूप में) एक कीवर्ड है, multi-spec आंतरिक रूप से एक समारोह here जो जनरेटर कार्यान्वयन समारोह में प्रयोग किया जाता है पैदा करता है। उदाहरण के लिए, इन दो बहु कल्पना घोषणाओं कार्यात्मक रूप से बराबर कर रहे हैं: जब गैर के लिए multi-spec का उपयोग कर

(s/def :event/event (s/multi-spec event-type :event/type)) 
(s/def :event/event (s/multi-spec event-type 
            (fn [genv tag] 
            (assoc genv :event/type tag)))) 

एक retagसमारोह गाइड के उदाहरण दिए गए एक बहुत ही उपयोगी विकल्प की तरह प्रतीत नहीं होता पासिंग, लेकिन अधिक उपयोगी है नक्शे। उदाहरण के लिए, यदि आप multi-specs/cat के साथ उपयोग करना चाहते हैं उदा। समारोह आर्ग विशिष्ट जानकारी के अनुसार:

(defmulti foo first) 
(defmethod foo :so/one [_] 
    (s/cat :typ #{:so/one} :num number?)) 
(defmethod foo :so/range [_] 
    (s/cat :typ #{:so/range} :lo number? :hi number?)) 

foo पहले आर्ग के आधार पर या तो दो या तीन आर्ग लेता है,। अगर हम multi-spec करने की कोशिश इस भोलेपन से s/cat कीवर्ड/टैग का उपयोग कर, यह काम नहीं करेगा:

(s/def :so/foo (s/multi-spec foo :typ)) 
(sgen/sample (s/gen :so/foo)) 
;; ClassCastException clojure.lang.LazySeq cannot be cast to clojure.lang.Associative 

यह वह जगह है, जहां एक retag समारोह पारित करने में सक्षम किया जा रहा है उपयोगी है:

(s/def :so/foo (s/multi-spec foo (fn [genv _tag] genv))) 
(sgen/sample (s/gen :so/foo)) 
;=> 
;((:so/one -0.5) 
; (:so/one -0.5) 
; (:so/range -1 -2.0) 
; (:so/one -1) 
; (:so/one 2.0) 
; (:so/range 1.875 -4) 
; (:so/one -1) 
; (:so/one 2.0) 
; (:so/range 0 3) 
; (:so/one 0.8125)) 
+0

महान के लिए धन्यवाद स्पष्टीकरण और उदाहरण! – OlegTheCat

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