2012-12-11 22 views
16

मुझे इस कोड को clojure 1.5 release notes से समझ में नहीं आता है। यह cond-> मैक्रो का उपयोग करता है। उदाहरण के लिए, यह प्री-1.5 कोड में कैसे अनुवाद करेगा?क्लोजर-न्यू कंड मैक्रो?

user=> (cond-> 1 
       true inc 
       false (* 42) 
       (= 2 2) (* 3)) 
6 
+0

आपको यह कहां मिला? – mishadoff

+0

अनुमान में मुझे लगता है कि यह 6 = '(* 3 (inc 1))' देता है, जहां यह किसी भी फ़ंक्शन के माध्यम से पहला तर्क थ्रेड करता है जिसका अनुमान वास्तविक सत्य है। – cobbal

+1

https://github.com/clojure/clojure/blob/master/changes.md#24-new-threading-macros –

उत्तर

27

परीक्षण सही होने पर प्रत्येक चरण परिणाम बदलता है, या परीक्षण गलत होने पर इसे अकेला छोड़ देता है।

आप सूत्रण अनाम प्रक्रियाएं द्वारा 1.4 में यह लिख सकते हैं:

user> (-> 1 (#(if true (inc %) %)) 
      (#(if false (* % 42) %)) 
      (#(if (= 2 2) (* % 3) %))) 
6 

हालांकि cond-> नए कार्यों को शुरू नहीं करता है, बजाय इसे उत्पन्न करता है एक बाध्यकारी रूप अधिक कुशल होने का:

user> (let [g 1 
      g (if true (inc g) g) 
      g (if false (* g 42) g) 
      g (if (= 2 2) (* g 3) g)] 
     g) 
6 

और g के लिए gensym का उपयोग करता है, कुछ रूपों में प्रतीक g

का उपयोग करते हैं cond->> बहुत समान है, यह सिर्फ एक अलग जगह में धागे वाले प्रतीक रखता है।

user> (let [g 1 
      g (if true (inc g) g) 
      g (if false (* 42 g) g) 
      g (if (= 2 2) (* 3 g) g)] 
     g) 
6 

जो इस उदाहरण में एक ही परिणाम देता है क्योंकि * और + विनिमेय हैं।

+0

मुझे मध्य उदाहरण बहुत पसंद है ... बहुत अधिक। इससे यह बहुत अधिक स्पष्ट हो गया। – Zchpyvr

+0

इसके अलावा, मुझे लगता है कि 'cond - >>' मैक्रो एक समान दिनचर्या करता है? – Zchpyvr

+0

क्षमा करें, जब आप टिप्पणी करते थे, तो मैं इसे संपादित कर रहा था, जो बीच था? –