एक अंतर यह है कि 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 को चखना) 1 है , जबकि conj
इसका मतलब संयोजन (एक संग्रह पर एक आइटम को इंगित करना ) है। seq
द्वारा निर्माण किया जा रहा cons
तत्व अपनी पहली तर्क के रूप में पारित कर दिया साथ शुरू होता है और उसके के रूप में है next
/ rest
भाग बात के आवेदन से उत्पन्न seq
दूसरा तर्क करने के लिए; जैसा कि ऊपर दिखाया गया है, पूरी बात कक्षा की है clojure.lang.Cons
। इसके विपरीत, conj
हमेशा लगभग उसी प्रकार का एक संग्रह लौटाता है, जिस तरह का संग्रह उसके पास जाता है। (मोटे तौर पर, क्योंकि इसे 9 प्रविष्टियों से आगे बढ़ते ही PersistentArrayMap
बदल दिया जाएगा PersistentHashMap
।)
1 परंपरागत रूप से, लिस्प दुनिया में, cons
विपक्ष (एक जोड़ी को चखता है), इसलिए क्लूजुर लिस्प परंपरा से प्रस्थान करता है, जिसके cons
कार्य में एक सीक का निर्माण होता है, जिसमें पारंपरिक नहीं होता है cdr
। cons
माध्य का सामान्यीकृत उपयोग "प्रोग्रामिंग प्रकारों के अध्ययन और उनके कार्यान्वयन में वर्तमान में सर्वव्यापी" कुछ प्रकार या अन्य मूल्यों को एक साथ रखने के लिए एक रिकॉर्ड का निर्माण करता है; इसका मतलब तब होता है जब "सहमति से बचने" का उल्लेख किया जाता है।