शायद आप रिकॉर्ड की तलाश में हैं?
(require '[clojure.set :as cset])
(defrecord Person [name age address phone email])
;; Make a keyword-based constructor to verify
;; args and decouple ordering.
(let [valid #{:name :age :address :phone :email}]
(defn mk-person[& args]
(let [h (apply hash-map args)
invalid (cset/difference (set (keys h)) valid)]
(when-not (empty? invalid)
(throw (IllegalArgumentException. (pr-str invalid))))
; any other argument validation you want here
(Person.
(:name h) (:age h) (:address h) (:phone h) (:email h)))))
=> (def p (mk-person :name "John" :email "[email protected]"))
#:user.Person{:name "John", :age nil, :address nil, :phone nil,
:email "[email protected]"}
अब आप कार्य (अपवाद) या कीवर्ड (नहीं अपवाद) के साथ डेटा तक पहुँचने से है कि क्या आप गलत लिखे गए नाम के लिए अपवाद चाहते हैं चुन सकते हैं।
=> (.fax p)
java.lang.IllegalArgumentException:
No matching field found: fax for class user.Person
=> (:fax p)
nil
इस दृष्टिकोण के लिए आवश्यक है कि आप फ़ील्ड नामों से बचें जो मौजूदा तरीकों से संघर्ष करेंगे। (@Jouni से टिप्पणी देखें।)
वैकल्पिक रूप से, आप देखने के लिए कीवर्ड और एक्सेसर समारोह है कि अवैध चाबी के लिए जाँच करता है का उपयोग करके क्षेत्र का नाम सीमा बाईपास कर सकते हैं:
(defn get-value [k rec]
(let [v (k rec ::not-found)]
(if (= v ::not-found)
(throw (IllegalArgumentException. (pr-str k)))
v)))
=> (get-value :name p)
"John"
=> (get-value :fax p)
IllegalArgumentException: :fax
"गलत Destructuring सूची का हिस्सा "-प्रकार समस्याएं सूची में" व्यक्ति "जैसी कुछ एन्कोड करने की कोशिश करने से आ सकती हैं; तो आपको 'व्यक्ति' सूची में तीन पदों पर 'पता' सूची में ज़िप कोड चौथा तत्व "जैसे कोड याद रखने की आवश्यकता है।
'क्लासिकल' लिस्प में आप क्लोजर में एक्सेसर फ़ंक्शंस लिखकर हल कर सकते हैं, आप रिकॉर्ड का उपयोग कर सकते हैं।
टाइपो किसी भी प्रोग्रामिंग भाषा में समस्याएं पैदा करेंगे, सबसे अच्छा आप उन्हें पकड़ने की कोशिश कर सकते हैं।
स्वत: पूर्णता वाला एक जावा आईडीई कुछ टाइपो पकड़ सकता है, जबकि आप अभी भी टाइप कर रहे हैं, और एक स्थैतिक टाइप की गई भाषा संकलित समय पर उनमें से कई को पकड़ लेगी, लेकिन एक गतिशील भाषा में आपको रन टाइम तक नहीं मिलेगा। कुछ लोग इसे गतिशील भाषाओं (पायथन, रूबी इत्यादि सहित) की कमी मानते हैं, लेकिन उनकी लोकप्रियता को देखते हुए कुछ प्रोग्रामर सोचते हैं कि लचीलापन प्राप्त हुआ और कोड सहेजा गया आईडीई स्वत: पूर्णता और संकलन समय त्रुटियों के नुकसान से अधिक महत्वपूर्ण है।
सिद्धांत किसी भी मामले में समान है: पहले अपवाद बेहतर हैं, क्योंकि कारण खोजने के लिए कम कोड है। आदर्श रूप से स्टैक ट्रेस आपको सीधे टाइपो तक ले जाएगा। क्लोजर में, रिकॉर्ड और एक्सेसर फ़ंक्शंस आपको वह देते हैं।
चूंकि इसे पोस्ट किया गया था, कोर.टाइप जारी किया गया था और यह भी वही काम कर सकता है http://typedclojure.org/ – Ben