2011-03-20 18 views
10

clojure में नक्शे के बारे में पहली अजीब बात निम्नलिखित स्निपेट में है:clojure नक्शा समारोह में weirdness

(apply map list '((1 a) (2 b) (3 c))) 

परिणाम मेरे लिए आश्चर्य की बात है:

((1 2 3) (a b c)) 

किसी को भी यह कैसे काम करता समझा सकता है?

+1

यह एक अच्छा सवाल है और एक बहुत उपयोगी उत्तर उत्पन्न हुआ (क्लोजर सीईसी कैसे स्थानांतरित करें), लेकिन यह शीर्षक लोगों को यह प्रश्न ढूंढने में मदद करने में विशेष रूप से स्पष्ट नहीं है। मुझे यह सुधारने में दिलचस्पी होगी, अगर यह @ डीआरएफ या अन्य के साथ ठीक है। –

उत्तर

23

(apply f x '(y z))(f x y z) के बराबर है, इसलिए आपका कोड (map list '(1 a) '(2 b) '(3 c)) के बराबर है।

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

तो (map list '(1 a) '(2 b) '(3 c)) पहले सूचियों (यानी संख्याओं) के पहले तत्वों के साथ list पर तर्क के रूप में और फिर दूसरे तत्वों (अक्षरों) के साथ कॉल करता है। तो आपको ((list 1 2 3) (list 'a 'b 'c)) मिलते हैं।

+0

हां, मुझे कई संग्रहों को ज़िपित करने के लिए मानचित्र की क्षमता बेहद उपयोगी है। ध्यान दें कि यदि आप जानते हैं कि आप कितने संग्रह ज़िप कर रहे हैं, तो आप nth संग्रह से तत्व को संदर्भित करने के लिए% n का उपयोग कर सकते हैं, उदा। (मानचित्र # (myfun% 1 (-% 2% 3)) '(1 2)' (2 3) '(3 4)) –

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