2010-04-23 8 views
6

में वेक्टर दोहराएं मैं क्लोजर नौसिखिया हूं। मैं कार्ड सूट के वेक्टर की दो प्रतियां प्राप्त करने की कोशिश कर रहा हूं। गैर DRY तरह से है कि मैं के साथ आ सकते हैंक्लोजर

(def suits [:clubs :diamonds :hearts :spades]) 
(def two-times (concat suits suits)) 

वहाँ एक अधिक कार्यात्मक तरीका होना चाहिए (भले ही अधिक वर्ण लेता है :-)) है। अगर मैं एन बार चाहता हूं तो क्या होगा? कोई सुझाव?

बातें मैं कोशिश के सभी तरह दो अलग-अलग वैक्टर में

(replicate 2 suits) 

परिणाम:

([:clubs :diamonds :hearts :spades] [:clubs :diamonds :hearts :spades]) 

मैं कैसे "समतल" है संरचना?

+1

कुछ भी 'def' प्रपत्र बनाने के अंदर एक वार के मान के उपयोग गैर कार्यात्मक है एक और वर वास्तव में, यह दूसरी चीज है जब दूसरा वर पहले पर निर्भर करता है। बेशक यदि आप एक सीक की एन प्रतियों को संयोजित करने की एक सामान्य विधि चाहते हैं, जहां एन पहले से ज्ञात हो सकता है या नहीं, तो आपको बेहतर समाधान की आवश्यकता है (जैसा कि यहां दिए गए उत्तरों में पाया गया है)। –

+1

असल में, मेरा मतलब यही था (एन प्रतियां)। मैं मानता हूं कि मेरा दो बार का कार्य "कार्यात्मक" है - अगर मैं 100 प्रतियां चाहता हूं तो यह व्यावहारिक नहीं है :-)। – Ralph

उत्तर

7

concat आप एक आलसी seq देता है। यदि आप एक (गैर आलसी) के बजाय वेक्टर के साथ खत्म करना चाहते हैं:

user> (into suits suits) 
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades] 
user> (reduce into (replicate 2 suits)) 
[:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades] 

आधार पर आप सूचकांक द्वारा एक बहुत यह तक पहुँच रहे हैं कि क्या है या इस पर पुनरावृत्ति, या तो एक वेक्टर या एक seq अधिक उपयुक्त हो सकता है।

वहाँ हमेशा cycle भी है कि अगर आप बार-बार तत्वों की एक अंतहीन (आलसी) धारा हैं:

user> (take 9 (cycle suits)) 
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades :clubs) 
+0

मैं भी आया (8 ले लो (चक्र सूट))। काम करने लगता है, लेकिन मुझे कंप्यूटर की मदद के बिना "8" भाग खुद को समझना पड़ा :-)। – Ralph

2

(अपरीक्षित!)

(apply concat (repeat 2 suits)) 

चाल करना उम्मीद है कि होगा।

concat निश्चित रूप से 2 सूचियों को जोड़ देगा; apply का मूल्यांकन किसी दिए गए फ़ंक्शन को मूल्यांकन के लिए मौजूदा सूची की मुख्य स्थिति में धुंधला करने के लिए किया जा सकता है।

+2

फ़ंक्शन नाम ('assoc' ->' लागू') फिक्स्ड। –

+0

ओह, मेरे बारे में कितना बेवकूफ है। मैं हर समय 'आवेदन' का उपयोग करता हूं, आपको लगता है कि अब तक मैं इसका नाम जानूंगा ... ठीक करने के लिए धन्यवाद! –

+0

'(डॉक्टर प्रतिकृति)' क्लोजर 1.7 के अनुसार 'अस्वीकृत: इसके बजाय 'दोहराना' का उपयोग करें। –

2

आरईपीएल साथ एक छोटी सी प्रयोग मुझे इस समाधान के लिए नेतृत्व:

user=> (def suits [:clubs :diamonds :hearts :spades]) 
#'user/suits 
user=> suits 
[:clubs :diamonds :hearts :spades]  
user=> (reduce concat (replicate 2 suits)) 
(:clubs :diamonds :hearts :spades :clubs :diamonds :hearts :spades) 
1
(take (* 2 (count suits)) (cycle suits))