2009-03-26 9 views
15

मैं उत्कृष्ट क्लोजर ट्यूटोरियल here पर एक नज़र डाल रहा हूं। उदाहरण यह निम्नलिखित लाइनों के साथ Clojure कोड है में से एक में:क्यों "(def vowel? (Set" aeiou "))" काम?

(def vowel? (set "aeiou")) 

यह स्वर व्यंजन के लिए स्वरों के लिए सच और झूठी वापसी बनाता है:

(vowel? (first "abc")) ; => true 
(vowel? (first "cba")) ; => false 

ऐसा क्यों है? मुझे लगता है कि परिवर्तनीय नाम के पीछे प्रश्न चिह्न के साथ इसका कुछ संबंध है। कुछ भी नहीं मिला सही ट्यूटोरियल में दूर ...


संपादित मैं सिर्फ महसूस किया vowel? लौट सही या गलत नहीं है, बल्कि तत्व में ही या नहीं के बराबर। मेरा अपना जवाब देखें।

उत्तर

16

यह बिल्कुल समान है कि मानचित्र (क्लोजर में सबसे प्राकृतिक वस्तुएं) कैसे काम करती हैं। नक्शा एक समारोह के रूप में कहा जाता है, यह एक मानचित्रण के रूप में काम करता है:

user=> (def ob {:foo "bar", :bar :baz, :qwerty 42}) 
#'user/ob 
user=> (ob :foo) 
"bar" 

तो यह है कि एक Clojure सेट एक समारोह के रूप कहा जा सकता है, और एक सदस्यता परीक्षण के रूप में काम करेंगे समझ में आता है। वैसे, अगर आप एक मानचित्रण की कुंजी के रूप में कीवर्ड (उन चीजों है कि एक पेट के साथ शुरू करते हैं) का उपयोग, वे भी रूप में समान कार्य काम करते हैं, तो आप

user=> (:bar ob) 
:baz 

और यहां तक ​​कि के सेट के साथ एक ही बात कर सकते हैं कीवर्ड:

user=> (def vowel-keywords (set [:a :e :i :o :u])) 
#'user/vowel-keywords 
user=> (:a vowel-keywords) 
:a 
user=> (:b vowel-keywords) 
nil 

लेकिन, फिर से, यह बाद चाल केवल कीवर्ड, नहीं कुछ और आप एक सेट में एक मानचित्रण में चाबी या सदस्यों के रूप में उपयोग कर सकते हैं कि साथ काम करता है।

7

आह! मैं इसे अपने आप को खोजने के लिए समाप्त हो गया। यह वास्तव में true या false वापस नहीं करता है, बल्कि यह सेट में पहली घटना देता है, या शून्य अगर ऐसा नहीं होता है।

और क्योंकि आप इसे एक शर्त के रूप में उपयोग कर सकते हैं (शून्य को गलत के रूप में संभाला जा रहा है, और गैर-शून्य सत्य के रूप में), यह जांचने के लिए एक अच्छा छोटा हैक के रूप में काम करता है कि स्ट्रिंग में कोई अक्षर है या नहीं।

(vowel? (first "abc")) ; => "a" 
(vowel? (first "cba")) ; => nil 

(if (vowel? (first "abc")) 
     (println "yay") 
     (println "oops")) ; => "yay" 
+0

मुझे सही लगता है। प्रश्न चिह्न इंगित करता है कि इसे एक परीक्षण के रूप में इस्तेमाल किया जा सकता है। आप अक्सर उन कार्यों पर विस्मयादिबोधक बिंदु देखेंगे जिनके दुष्प्रभाव होते हैं। वे भाषा का हिस्सा नहीं हैं, वे लुभावनी परंपराएं हैं (इसलिए आप "खतरनाक" लोगों से सुरक्षित कार्यों को जानते हैं)। – MBCook

+2

इसे स्पष्ट करने के लिए,? तथा ! केवल ए और बी जैसे वर्ण हैं, और आप उन्हें नामकरण के लिए उपयोग कर सकते हैं (जैसे \, /, *, -, + ...)। लिस्प में कुछ प्रतीकों का नामकरण करने के लिए परंपराएं हैं, लेकिन बोलियों के बीच छोटे अंतर हैं। – Svante

+0

आह, धन्यवाद @ एसवेन्टे! मैंने सोचा था कि "?" के बारे में कुछ जादुई था :) – Epaga

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