2012-04-05 14 views
11

पर अनुक्रम से दो तत्व प्राप्त करें क्या क्लोजर में सामान्य लिस्प की तरह एक शक्तिशाली 'लूप' है।प्रत्येक बार

उदाहरण के लिए

:

(loop for (a b) on '(1 2 3 4) by #'cddr collect (cons a b)) 

कैसे Clojure में यह करने के लिए:

एक दृश्य से दो तत्व हर बार

कॉमन लिस्प मिल सकता है?

+1

आप क्लोजर में सीएल लागू कर सकते हैं ... –

+0

कृपया "शक्तिशाली" को परिभाषित करें। –

उत्तर

13

for लाभ और कुछ destructuring आप अपने विशिष्ट उदाहरण प्राप्त कर सकते हैं द्वारा:

(for [[a b] (partition 2 [1 2 3 4])](use-a-and-b a b)) 
+0

ध्यान दें कि 'फॉर' लूप निर्माण नहीं है, लेकिन परिणाम की आलसी सीक का उत्पादन करते हुए समझ की सूची है। इसके अलावा, सामान्य एलआईएसपी के विपरीत, इसे बहुत अच्छा प्रदर्शन करना मुश्किल है। –

+0

@ मार्को - क्या आपके पास विशिष्ट उदाहरण हैं? – sw1nn

+0

समझ में नहीं आता - वास्तव में क्या उदाहरण हैं? –

3

जो एक लूप workalike है cl-loop नहीं है, और वहाँ भी और clj-iterate, जो दोनों के लिए कॉमन लिस्प iterate looping construct के आधार पर कर रहे हैं।

2

Clojure के बहुउद्देश्यीय पाशन निर्माण for है। इसमें सीएल के loop के रूप में कई विशेषताएं नहीं हैं (विशेष रूप से साइड-इफेक्टिंग नहीं, क्योंकि क्लोजर कार्यात्मक शुद्धता को प्रोत्साहित करती है), इसलिए loop के साथ आप अन्यथा आसानी से ऐसा कर सकते हैं जो for "के आसपास हैं। उदाहरण के लिए, for द्वारा उत्पन्न तत्वों को योग करने के लिए, आप इसके सामने apply + डाल देंगे; युग्मित तत्वों को चलने के लिए, आप for में इनपुट इनपुट अनुक्रम पर partition 2 का उपयोग करेंगे (sw1nn शो के रूप में)।

1

मैं loop, recur और विनाशकारी के साथ ऐसा करूंगा।

उदाहरण के लिए

, अगर मैं एक साथ हर दो मानों समूह चाहता था:

=> [[1 2] [3 4] [5 6]]

a और b के पहले और दूसरे तत्व हैं:

(loop [[a b & rest] [1 2 3 4 5 6] 
     result []] 
    (if (empty? rest) 
    (conj result [a b]) 
    (recur rest (conj result [a b])))) 

का एक परिणाम के साथ समाप्त होता है अनुक्रम क्रमशः, और फिर rest क्या बचा है। हम तब तक फिर से जा सकते हैं जब तक कि rest में कुछ भी नहीं बचा है और हम कर चुके हैं।

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