2011-10-20 37 views
8
कोष्ठकों यहाँ

हम जरूरत सूत्रण गुमनाम समारोहसमारोह कॉल -> मैक्रो

user=> (-> [1 2 3 4] (conj 5) (#(map inc %))) 
(2 3 4 5 6) 

क्यों map+ और इन उदाहरणों में fmap+ आसपास कोष्ठकों के लिए कोई जरूरत नहीं है की एक कॉल करने के लिए?

user=> (def map+ #(map inc %)) 
#'user/map+ 
user=> (-> [1 2 3 4] (conj 5) map+) 
(2 3 4 5 6) 

user=> (defn fmap+ [xs] (map inc xs)) 
#'user/fmap+ 
(-> [1 2 3 4] (conj 5) fmap+) 
(2 3 4 5 6) 

उत्तर

16

documentation-> और ->> मैक्रो राज्य के लिए अगर वे सूचियों को पहले से ही नहीं कर रहे हैं कि पहले पैरामीटर के बाद रूपों सूचियों में लपेटा जाता है। तो सवाल यह है कि यह #() और (fn ..) रूपों के लिए क्यों काम नहीं करता है? इसका कारण यह है कि मैक्रो विस्तार के समय दोनों रूप सूची सूची में हैं।

उदाहरण

(-> 3 (fn [x] (println x))) 

के लिए विस्तार समय में (fn [x] ...) रूप हो जाता है, तो मैक्रो सोचता है कि "महान है, यह एक सूची है, मैं सिर्फ 3 (fn ..) सूची के दूसरे स्थान पर प्रविष्ट कर देंगे।" मैक्रोएक्सप्शन का आह्वान करते हुए, यह हमें मिलता है:

(fn 3 [x] (println x)) 

जो निश्चित रूप से काम नहीं करता है। #() के लिए इसी तरह:

(-> 3 #(println %)) 

(fn* 3 [p1__6274#] (println p1__6274#)) 

के लिए विस्तार किया है यही कारण है कि हम अतिरिक्त कोष्ठक की जरूरत है।

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