2017-06-29 20 views
5

मैं Clojure सीख रहा हूँ Clojure समझे और doseq के बारे में पढ़ रहा था जब मैं doseqबाध्यकारी वाक्य रचना

(doseq [x [-1 0 1] 
     y [1 2 3]] 
    (prn (* x y))) 

मेरे भ्रम के लिए official Clojure doc पर नीचे की तरह एक उदाहरण देखा अभिव्यक्ति [x [-1 0 1] y [1 2 3]] के साथ है।

यह एक बाध्यकारी अभिव्यक्ति दर्शाता है? मैंने कुछ Google खोज की कोशिश की लेकिन ऐसे किसी भी दस्तावेज में नहीं आया जो इस तरह के एक फॉर्म का वर्णन करता है।

कोई मुझे Clojure में रूपों बंधन के लिए विभिन्न वाक्य रचना अभ्यावेदन को समझने के साथ मदद कर सकते हैं?

+2

clojuredocs। संगठन किसी भी तरह से क्लोजर दस्तावेज का आधिकारिक स्रोत नहीं है। यह विभिन्न गुणवत्ता के उपयोगकर्ता द्वारा योगदान उदाहरण हैं। उस पृष्ठ पर एकमात्र आधिकारिक चीज 'डॉसेक' की डॉकस्ट्रिंग है, जो आपको यह जानने के लिए 'के लिए' के ​​डॉकस्ट्रिंग को पढ़ने के लिए कहती है कि यह कैसे काम करता है। मैं मानता हूं कि बेहतर होगा अगर 'डॉसेक' का अपना पूरा दस्तावेज था, लेकिन कम से कम यह आपको पढ़ने के लिए सही चीज़ पर इंगित करता है। – amalloy

उत्तर

8

यह एक "binding form" है जिसमें यह अभिव्यक्ति से मूल्यों को x नाम से" बाध्य "करता है। इसलिए यह बोलने वाला अर्थ है जो नामों को नामों से जोड़ता है। यह" बाध्यकारी रूपों को नष्ट करने "का हिस्सा है जो बांधता है एक सूची या मानचित्र जैसे यौगिक मूल्य के कुछ हिस्सों के नाम।

"सेटिंग" के बजाय "बाध्यकारी" शब्द यह क्या कर रहा है और कुछ अन्य प्रोग्रामिंग भाषाओं में चर सेट करने में अंतर बताता है। नाम संलग्न है समय यह doseq अंदर प्रपत्र को चलाने के लिए ले जाता है के लिए मूल्य है, तो नाम एक और मूल्य के साथ संलग्न किया करने के लिए जारी किया गया है।

Clojure प्रदान करता है मनमाने ढंग से संरचनात्मक बाध्यकारी है कि नाम (बाँध प्रतीकों)

(doseq [[x1 x2] [[-1 -1] [0 0] [1 1]] 
     y [1 2 3]] 
    (prn (* x1 x2 y))) 

भी एक बाध्यकारी अभिव्यक्ति है आवंटित हालांकि यह डेटा और प्रदान में थोड़ा गहरा लग रहा है भाषा में सबसे अधिक स्थानों में एक मूल्य के किसी भी हिस्से को नाम देने के लिए पहले वेक्टर में प्रति आइटम दो मानों के नाम (और मानते हैं कि उनमें से प्रत्येक में दो संख्याएं हैं) मैं this tutorial on destructuring/binding

+0

सच है, मैं इसे कम से कम दो नंबर " –

+0

इस विस्तृत विवरण के लिए धन्यवाद के साथ दृश्यों के अनुक्रम में बदल जाएगा। यह मदद करता है! –

2

का बहुत शौकिया हूं, यह जावा में लूप के लिए घोंसला जैसा है।

(dotest 
    (newline) 
    (println "version 1") 
    (doseq [x [1 2] 
      y [:a :b :c]] 
    (println x y)) 

    (newline) 
    (println "version 2") 
    (doseq [x [1 2]] 
    (doseq [y [:a :b :c]] 
     (println x y)))) 

with results: 
version 1 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

version 2 
1 :a 
1 :b 
1 :c 
2 :a 
2 :b 
2 :c 

ध्यान दें कि doseq हमेशा nil देता है, और दुष्प्रभाव (स्क्रीन पर प्रिंट की तरह) पैदा करने के लिए ही अच्छा है: आप भी घोंसले "मैन्युअल" कर सकते हैं।

एक for अभिव्यक्ति इसी तरह बर्ताव करता है, लेकिन मूल्यों की एक (आलसी) अनुक्रम (ध्यान दें कि हम प्रत्येक पाश पर एक सदिश [x y] पैदा कर रहे हैं) देता है:

(newline) 
(println "For generates a (lazy) sequence:" 
    (for [x [1 2] 
     y [:a :b :c]] 
    [x y])) 
परिणाम के साथ

:

For generates a (lazy) sequence: ([1 :a] [1 :b] [1 :c] [2 :a] [2 :b] [2 :c]) 
+0

+1 वैकल्पिक रूपों का चित्रण के लिए। हालांकि, पोस्ट वास्तव में मेरे सवाल का जवाब नहीं है। मैं वर्तमान में हूँ वैकल्पिक रूप से क्लोजर बाध्यकारी वाक्यविन्यास से अधिक चिंतित है क्योंकि मैं भाषा सीख रहा हूं और इस चरण में वाक्यविन्यास को समझना मेरी प्राथमिकता है। –

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