एक अंतर यह है कि conj
एक संग्रह में डालने के लिए तर्क के किसी भी संख्या को स्वीकार करता है cons
सिर्फ एक लेता है:
(conj '(1 2 3) 4 5 6)
; => (6 5 4 1 2 3)
(cons 4 5 6 '(1 2 3))
; => IllegalArgumentException due to wrong arity
एक और अंतर यह वापसी मान की कक्षा में है:
(class (conj '(1 2 3) 4))
; => clojure.lang.PersistentList
(class (cons 4 '(1 2 3))
; => clojure.lang.Cons
ध्यान दें कि ये वास्तव में विनिमय नहीं कर सकते हैं; विशेष रूप से, clojure.lang.Cons
clojure.lang.Counted
लागू नहीं करता है, इसलिए count
पर अब एक स्थिर समय ऑपरेशन नहीं है (इस मामले में यह शायद 1 + 3 तक कम हो जाएगा - 1 पहले तत्व पर रैखिक ट्रैवर्सल से आता है, 3 से आता है (next (cons 4 '(1 2 3))
PersistentList
और इस प्रकार Counted
)।
नाम के पीछे इरादा है कि cons
(एक seq truct) विपक्ष का मतलब, conj
(एक आइटम oin एक संग्रह पर) संयोजक का मतलब है, जबकि, है मुझे विश्वास है,। seq
cons
द्वारा निर्मित किया जा रहा है, इसके पहले तर्क के रूप में पारित तत्व के साथ शुरू होता है और इसके next
/rest
के रूप में दूसरी तर्क में seq
के आवेदन से उत्पन्न चीज का हिस्सा होता है; जैसा कि ऊपर प्रदर्शित किया गया है, पूरी बात कक्षा clojure.lang.Cons
है। इसके विपरीत, conj
हमेशा उसी प्रकार के संग्रह को वापस लौटाता है जैसे संग्रह पास हो जाता है। लिस्प दुनिया में,, (मोटे तौर पर, क्योंकि एक PersistentArrayMap
एक PersistentHashMap
में जैसे ही चालू हो जाएगा के रूप में यह 9 प्रविष्टियों से परे होती है।)
परंपरागत रूप से, cons
विपक्ष (एक जोड़ी tructs) तो Clojure रवाना लिस्प परंपरा से cons
फ़ंक्शन में एक सीईसी का निर्माण होता है जिसमें पारंपरिक cdr
नहीं होता है। cons
का सामान्य उपयोग "अर्थात् कई प्रकार के मूल्यों को एक साथ रखने के लिए या कई मूल्यों को एक साथ रखने के लिए" का अर्थ है, वर्तमान में प्रोग्रामिंग भाषाओं और उनके कार्यान्वयन के अध्ययन में सर्वव्यापी है; इसका मतलब यह है कि "विपक्ष से बचने" का उल्लेख किया गया है।
स्रोत
2010-06-09 20:38:30
क्या शानदार लेखन है! मैं अनजान था कि एक विपक्ष प्रकार था। बहुत बढ़िया! –
धन्यवाद। सुन कर खुशी हुई। :-) –
संयोग से, एक विशेष मामले के रूप में, '(cons foo nil)' एक सिंगलटन 'पर्सिस्टेंटलिस्ट' (और इसी तरह 'conj' के लिए) देता है। –