2011-04-20 19 views
43

की पूंछ के लिए एक तत्व रखो मैं अपने आप को बहुत सारा कर पाते हैं।एक संग्रह

क्या क्लोजर में ऐसा करने के लिए कोई कार्य है? मुझे पता है कि कॉंज वैक्टर के लिए सबसे अच्छा काम करता है लेकिन मुझे पता नहीं है कि किस कॉल का इस्तेमाल किया जाएगा। यह उदाहरण के लिए एक वेक्टर, सूची या सॉर्ट-सेट हो सकता है।

+1

"यह एक हो सकता है ... उदाहरण के लिए क्रमबद्ध सेट।" पूंछ की स्थिति में वस्तुओं को रखने और क्रमबद्ध क्रम बनाए रखने के लिए कॉलर्स को अनुमति देना पारस्परिक रूप से अनन्य है। पूंछ की स्थिति के बारे में चिंता का स्तर वेक्टर पर संकेत देता है। कैसे (conj (vec coll) ई) के बारे में? – Mocky

उत्तर

46

कुछ प्रकार के संग्रह सामने (सूचियों, सीईसी) में सस्ते रूप से जोड़ सकते हैं, जबकि अन्य पीछे की ओर सस्ता रूप से जोड़ सकते हैं (वैक्टर, कतार, थोड़े-सॉर्टा आलसी-सेक)। कॉन्सट का उपयोग करने के बजाय, यदि संभव हो तो आपको उन प्रकारों में से एक के साथ काम करने की व्यवस्था करनी चाहिए (वेक्टर सबसे आम है) और केवल इसे conj: (conj [1 2 3] 4)[1 2 3 4] पैदा करता है, जबकि (conj '(1 2 3) 4)(4 1 2 3) उत्पन्न करता है।

+0

आप ऐसा फ़ंक्शन कैसे लिखेंगे जो ऐसा करने के लिए किसी प्रकार का कॉल लेता है? –

+12

'(कॉन्सट कॉल [ई])' पी – amalloy

+12

दो साल बाद संपादित करें: मैं उस समारोह को नहीं लिखूंगा। – amalloy

12

concat संग्रह की पूंछ में कोई तत्व नहीं जोड़ता है, न ही यह दो संग्रहों को जोड़ता है।

कॉन्सैट दो अन्य seqs के concatenation से बना एक सीईसी देता है। उन संग्रहों का मूल प्रकार जिनसे सेक का अनुमान लगाया जा सकता है, वे रिटर्न प्रकार के कॉन्सट के लिए खो जाते हैं।

अब, क्लोजर संग्रह में अलग-अलग गुण होते हैं जिन्हें किसी को कुशल कोड लिखने के लिए पता होना चाहिए, यही कारण है कि किसी भी प्रकार के संग्रह को एकत्रित करने के लिए कोर में सार्वभौमिक कार्य उपलब्ध नहीं है। इसके विपरीत, सूची और वैक्टरों में "प्राकृतिक सम्मिलन पद" होते हैं जो conj जानता है, और संग्रह के प्रकार के लिए सही है।

4

अमेल्लो और लॉरेन पेटिट ने पहले से ही कहा है कि फ़ंक्शन का उपयोग करें।

क्लोजर प्रदान करता है कि महान अवशेषों में से एक अनुक्रम API है, जिसमें conj फ़ंक्शन शामिल है। यदि संभव हो, तो आपका कोड संग्रह-प्रकार अज्ञेयवादी के रूप में होना चाहिए, इसके बजाय संग्रह पर संचालन को संभालने के लिए सीईसी एपीआई का उपयोग करना और केवल विशिष्ट होने की आवश्यकता होने पर एक विशेष संग्रह प्रकार चुनना चाहिए।

यदि वैक्टर अच्छे मैच हैं, तो हाँ, conj अंत में आइटम जोड़ देगा। यदि इसके बजाय सूचियों का उपयोग करें, तो conj आपके संग्रह के सामने चीजें जोड़ देगा। लेकिन यदि आप संग्रह के "शीर्ष" (एक वेक्टर के पीछे, सूची के सामने) से आइटम खींचने के लिए मानक सीक्यू एपीआई फ़ंक्शंस का उपयोग करते हैं, तो इससे कोई फर्क नहीं पड़ता कि आप किस कार्यान्वयन का उपयोग करते हैं, क्योंकि यह हमेशा उपयोग करेगा सर्वोत्तम प्रदर्शन वाला एक और इस प्रकार वस्तुओं को जोड़ना और निकालना लगातार होगा।

+0

मुझे यह सुनिश्चित करने की ज़रूरत है कि तत्व संग्रह की पूंछ में जोड़ा गया हो। –

+2

@ मिचिल बोर्केंट कभी भी ऐसा नहीं करता है "क्या मैं भाषा के लिए सबसे बेवकूफ संरचनाओं का उपयोग कर रहा हूं" चेक। अधिक जानकारी के बिना (उदाहरण के लिए इसे अंत में क्यों होना चाहिए), आगे की मदद करना मुश्किल है। – semperos

+0

मुझे Michiel के बारे में पता नहीं है, लेकिन मैं पैरामीटर predicate करने के लिए एक विस्तार पर काम कर रहा हूँ। तो उदाहरण के लिए (defn x [[ab]]) काम करता है लेकिन (defn x [(ab)] नहीं है। – redfish64

3

यह एक समारोह के लिए ओपी के अनुरोध को संबोधित करने के लिए @ अमालोय के जवाब में एक बहुत ही छोटा अनुपूरक है जो हमेशा किसी भी तरह के संग्रह की पूंछ में जोड़ता है। यह (concat coll [x]) का विकल्प है।

(defn conj* 
    [s x] 
    (conj (vec s) x)) 

चेतावनियां:: - यानी

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

वेक्टर बनाने के लिए कुछ लागत है। यदि आपको इस फ़ंक्शन को बहुत कुछ कॉल करने की आवश्यकता है, और आपको लगता है (उदा। मानदंड के साथ बेंचमार्किंग करके) कि यह लागत आपके उद्देश्यों के लिए महत्वपूर्ण है, तो पहले स्थान पर वैक्टर का उपयोग करने के लिए अन्य उत्तरों की सलाह का पालन करें।

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