2011-10-04 7 views
8

विपक्ष वर्तमान में तो तरह बर्ताव करता है:क्लोजर में, संग्रह के तत्वों को कैसे संसाधित या conj करने के लिए, लेकिन संग्रह स्वयं नहीं?

(cons '(1 2) '(3)) 
;=> ((1 2) 3) 

मैं प्राप्त करने के लिए करना चाहते हैं:

(magic-cons '(1 2) '(3)) 
;=> (1 2 3) 

मैं अभी तक इस के लिए एक संसाधन नहीं मिल सका इस में एक निर्मित होना चाहिए इतना आसान मुझे लगता है लगता है समारोह।

या मुझे इस स्थिति का वर्णन करने के लिए केवल शब्दों को नहीं पता है। किसी भी तरह से, कृपया मुझे बताएं। धन्यवाद!

संपादित करें: कृपया "समतल" के साथ जवाब नहीं: पी यानी

(flatten (cons '(1 2) '(3))) 
+3

बस आपके लिए 'विपक्ष' को बेहतर ढंग से समझने के लिए। 'विपक्ष" का निर्माण "निर्माण" है। यह सूची की शुरुआत में नए तत्वों को जोड़कर सूची बना देता है, एक-एक करके। जिस प्रकार की फ़ंक्शन आप खोज रहे हैं उसे एक सूची के सभी तत्वों को दूसरे में जोड़ना चाहिए या बस 2 सूचियों को जोड़ना चाहिए। इस प्रकार, आम लिस्प में इसे 'एपेंड' कहा जाता है और क्लोजर में, जैसा कि अन्य ने पहले ही उल्लेख किया है, - 'concat'। – ffriend

उत्तर

10

आप concat उपयोग करने के लिए:

clojure.core/concat 
([] [x] [x y] [x y & zs]) 
    Returns a lazy seq representing the concatenation of the elements in the supplied colls. 

नमूना उपयोग:

user> (concat '(1 2) '(3)) 
(1 2 3) 
5

मेरा मानना ​​है कि आप concat लिए देख रहे हैं (लगता है कि "श्रेणीबद्ध सूची"):

[Concat ] एक आलसी सीक लौटाता है जो आपूर्ति किए गए कोलों में तत्वों के संयोजन का प्रतिनिधित्व करता है।

इस मामले में उपयोग होगा:

(concat '(1 2) '(3))  

ध्यान दें कि विपरीत (कई) अन्य लिस्प-बोलियों, Clojure के concat पैदावार एक आलसी अनुक्रम। अनुक्रम को "बल" कैसे करें (यह बड़े संदर्भ के आधार पर उपयोगी या आवश्यक नहीं हो सकता है, लेकिन ध्यान में रखना महत्वपूर्ण है) के लिए How to covert a lazy sequence to a non-lazy in Clojure? देखें।

हैप्पी कोडिंग।

4

एक वैकल्पिक "में" है।

हमेशा पहले तर्क के प्रकार को लौटाता है, जो कॉन्सट के विपरीत हमेशा एक सूची देता है।

=> (into [2 4] '(1 2 3)) 
[2 4 1 2 3] 

(into '(2 4) '(1 2 3)) 
(3 2 1 2 4) 
संबंधित मुद्दे