2011-01-02 13 views
19

मैंने क्लोजर प्रतीक देखा है -> कई स्थानों पर उपयोग किया जाता है, लेकिन मुझे इस बात के बारे में अनिश्चितता है कि यह प्रतीक कहलाता है और करता है, या यहां तक ​​कि यह मानक क्लोजर का हिस्सा है या नहीं। क्या कोई मुझे यह समझा सकता है?क्या करता है -> क्लोजर में करें?

उत्तर

22

स्वीकृत उत्तर भ्रामक है।

-> फ़ंक्शन कॉल के परिणाम का उपयोग करता है और अनुक्रम में, अगले फ़ंक्शन कॉल पर भेजता है।

तो, आसान उदाहरण होगा:

(-> 2 (+ 3)) 

रिटर्न 5, क्योंकि यह 2 भेजता है, अगले समारोह कॉल (+ 3)

इस पर निर्माण करने के लिए,

(-> 2 
    (+ 3) 
    (- 7)) 

रिटर्न -2। हम पहली कॉल का परिणाम रखते हैं, (+ 3) और इसे दूसरी कॉल (- 7) पर भेजें।

जैसा कि @bending द्वारा नोट किया गया है, स्वीकृत उत्तर डोटो मैक्रो को बेहतर दिखा रहा होगा।

(doto person 
    (.setFName "Joe") 
    (.setLName "Bob") 
    (.setHeight [6 2])) 
+5

यह गलत है। 2 '(+ 3)' के फ़ंक्शन कॉल पर नहीं भेजा जाता है ... इसके बजाय एक मैक्रो कोड (-> एबीसी) 'से' (सी (बीए)) ' –

+0

कहने से कोड को पुन: व्यवस्थित करता है, लेकिन ज्यादातर शब्दों के साथ खेलता है, लेकिन मैं आलोचना स्वीकार करता हूं। स्पष्टीकरण देने के लिए धन्यवाद। –

+1

@nicolas मैं अपना जवाब अपडेट करने का अर्थ रहा हूं क्योंकि जिस दिन मैंने इसे सबमिट किया था क्योंकि यह भ्रमित था, लेकिन वेबसाइट मुझे नहीं जाने देगी। मैंने जवाब के लिए एक लंबे समय से अतिदेय अद्यतन किया। अगर यह अभी भी भ्रामक है तो मुझे बताएं। – Psyllo

0

इसे थ्रेश ऑपरेटर कहा जाता है। यह सबसे अच्छा समझाया गया है here

+4

यह सच नहीं है। थ्रश एक * फ़ंक्शन * है जो समान रूप से '-> 'से व्यवहार करता है। '->' और '- >> 'मैक्रोज़ हैं, और मैं आमतौर पर उन्हें" थ्रेडिंग "मैक्रोज़ के रूप में संदर्भित करता हूं, क्योंकि वे शेष के माध्यम से पहला रूप" थ्रेड "होते हैं जिसके परिणामस्वरूप एक सिलाई-एक साथ फॉर्म होता है। – amalloy

10

यह कोड के अंदर बाएं को सही लिखने का एक तरीका है, उदाहरण के अंदर, उदा।

(reduce (map (map xs bar) foo) baz) 

हो जाता है

(-> xs (map bar) (map foo) (reduce baz)) 

आप स्रोत को पढ़ने के लिए चाहते हो सकता है, यह here है।

संपादित करें: ->> साथ -> की मेरी भ्रम फिक्स्ड, धन्यवाद amalloy करने के लिए। अफसोस की बात है कि मेरा उदाहरण अब अभ्यास में प्रकट होने की संभावना नहीं है।

+0

मुझे क्लोजर में थ्रश ऑपरेटर की यह स्पष्टीकरण पसंद है: http://debasishg.blogspot.com/2010/04/thrush-in-clojure.html –

+2

यह सामान्यताओं में सही है, लेकिन विशिष्टताओं पर गलत है। आपने '- >>' के व्यवहार का वर्णन किया है, न कि '->'। आपका मुहैया कराया गया नमूना '(कम (नक्शा (नक्शा एक्सएस बार) foo) baz)', क्योंकि '->' * * * * थ्रेड के माध्यम से * पिछला * नहीं है (जो कि '- >>' है)। – amalloy

+0

मुझे खेद है, मैं अपना जवाब ठीक कर दूंगा। –

7

'->' एक मैक्रो है। सबसे अच्छा तरीका यह वर्णन करने के लिए, मुझे लगता है कि, "डॉट विशेष रूप" है जिसके लिए यह कोड अधिक संक्षिप्त और सुपाठ्य बनाने का उद्देश्य में कार्य करता के रूप में The Dot special form

की clojure.org वेबसाइट के विवरण से दिखाया जाता है के उदाहरण में है
(.. System (getProperties) (get "os.name")) 

के लिए विस्तारित:

(. (. System (getProperties)) (get "os.name")) 

लेकिन, लिखने, पढ़ने और समझने के लिए आसान है। यह भी देखें -> मैक्रो जिसे समान रूप से उपयोग किया जा सकता है:

(-> (System/getProperties) (.get "os.name")) 

'डोटो' भी है। मान लीजिए कि आपके पास एक ही ऑब्जेक्ट है जिस पर आप लगातार कई सेटर्स को कॉल करना चाहते हैं। आप 'डोटो' का उपयोग कर सकते हैं।

(doto person 
    (.setFName "Joe") 
    (.setLName "Bob") 
    (.setHeight [6 2])) 

उपर्युक्त उदाहरण में सेटर्स कुछ विकल्प नहीं लौटाते हैं, जिससे उपयुक्त विकल्प 'डोटो' बन जाता है। -> 'डोटो' के स्थान पर काम नहीं करेगा जब तक कि सेटर्स 'यह' वापस नहीं लौटे।

तो, ये कुछ तकनीक -> मैक्रो से संबंधित हैं। मुझे उम्मीद है कि न केवल वे क्या करते हैं, बल्कि वे क्यों मौजूद हैं, इसकी व्याख्या करने में मदद करते हैं।

+6

आपके सेटर्स सभी इसे वापस कर देते हैं? यदि नहीं, तो आप (doto ...) – bendin

+0

हाँ का उपयोग करना चाहेंगे, प्रत्येक सेटटर को 'यह' वापस करना होगा। अच्छी बात। – Psyllo

+0

मैंने जवाब को फिर से भ्रामक नहीं होने का जवाब दिया। – Psyllo

6

रहा पूरी तरह से नहीं मिला क्या -> (छाले या धागा), जब तक मैं इसे इस तरह से कल्पना किया:

(-> expr f1 f2 f3) ;same as (f3 (f2 (f1 expr))) 

(-> expr   ;same as form above 
    f1    ;just a different visual layout 
    f2 
    f3) 

;this form is equivalant and shows the lists for f1, f2, f3. 
(->   expr  ; expr treaded into first form 
     (f1 ) ; | result threaded into next form 
    (f2   ) ; | and so on... 
(f3    )) ; V the lists (f1 

(f3 (f2 (f1 expr))) ;the result is the same as this 

यहाँ कुछ उदाहरण हैं:

(-> 41 inc dec inc) ;same as (inc (dec (inc 41))) 
42 

(->   41  ;same as above but more readable 
      (inc ) 
    (dec  ) 
(inc    )) 
42 

(inc (dec (inc 41))) ;easier to see equivalence with above form. 
42 

(-> 4 (* 4 3) (- 6)) ;same as (- (* 4 3 4) 6) 
42 

(-> 4    ;  4 
    (* 3 4)   ; (* 4 3 4) 
(-   6))  ;(- (* 4 3 4) 6) 
42 

(- (* 4 3 4) 6)  ;easier to see equivalence with above form. 
42 
1

आप देख सकते हैं अपने लिए:

(macroexpand `(-> 42 inc dec)) 
संबंधित मुद्दे