2010-06-21 124 views
11

क्लोजर में (अशुद्ध) कार्यों की सूची का मूल्यांकन कैसे कर सकता हूं? उदाहरण के लिए:क्लोजर में अशुद्ध कार्यों के अनुक्रम का मूल्यांकन कैसे करें?

[#(println "1") #(println "2") #(println "3")] 

उम्मीद उत्पादन होता है:

1 
2 
3 

वहाँ मैक्रो का उपयोग कर के बिना इस लक्ष्य को हासिल करने के लिए एक तरीका है? (map evaluate fns-seq) की तरह कुछ, हो सकता है?

(मैं Clojure.processing एपीआई का उपयोग कर कुछ ग्राफ़िक्स बनाने के लिए इस की जरूरत है।)

उत्तर

17
user> (let [fs [#(println "1") #(println "2") #(println "3")]] 
     (doseq [f fs] (f))) 
1 
2 
3 
nil 
+0

महान है कि काम की अनुमति देता है । आपका बहुत बहुत धन्यवाद! –

5

इस पूरे seq उपभोग बेसब्री से होगा, दुष्प्रभाव के लिए सभी कार्यों बुला और लौटने जो कुछ भी पिछले एक रिटर्न:

(reduce #(%2) nil [#(println :foo) #(println :bar)]) 
; => prints :foo, then :bar, then returns nil 

आप बदले मूल्यों पर धारण करने के लिए चाहते हैं, आप के बजाय reductions उपयोग कर सकते हैं:

(reductions #(%2) nil [#(println :foo) #(println :bar)]) 
; => prints :foo, then :bar, then returns (nil nil) 

reductions क्लोजर 1.1 में clojure.contrib.seq-utils में और 1.212 के वर्तमान स्नैपशॉट में clojure.core में पाया गया है।

अद्यतन: ध्यान दें कि reductions एक आलसी seq देता है, तो यह map पर कोई सुधार (। एनबी map में आप #(%2) बजाय #(%) का उपयोग करना चाहते हैं)। मैंने यहां अधिकतर पूर्णता के लिए इसका उल्लेख किया है। असल में, मैंने पूर्णता के लिए पूरा उत्तर पोस्ट किया, क्योंकि आम तौर पर मैं doseq दृष्टिकोण के साथ जाऊंगा (ब्रायन का जवाब देखें)।

+0

आपकी अतिरिक्त टिप्पणियों के लिए धन्यवाद। मैं छवि कर सकता हूं, कि अनिवार्य जावा दुनिया से पुस्तकालयों से निपटने पर मेरी "समस्या" अधिक बार रेंग जाएगी। हो सकता है कि एक मैक्रो (डूफन्स एफएनएस) एक अच्छा अमूर्त होगा, जो वर्तमान में क्लोजर में गायब है। –

1

(apply pcalls [#(println "1") #(println "2") #(println "3")]) बस यही करता है। बस pcalls 'समांतरता (इसलिए अनुक्रमिकता की कमी) और आलस्य से सावधान रहें।

+0

पीसी को जानना अच्छा है :) – nXqd

0

एक पुराना सवाल, मुझे पता है, लेकिन एक और विकल्प है। बस invoke आप कर सकते थे कार्य:

(defn generate-fns [] 
    [#(println "1") #(println "2") #(println "3")]) 

(dorun (pmap (memfn invoke) (generate-fns))) 

यह आपको एक अलग संदर्भ में तय करने के लिए कि कैसे आप, कार्य निष्पादित करने के लिए चाहते हैं (जैसे कि, pmap, या claypoole's उदाहरण के लिए upmap)

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