2012-03-18 20 views
20

क्लोजर में अंतर, मैं जानना चाहता हूं कि नीचे दिए गए तीनों के बीच अंतर क्या हैं।क्लोजर में, फ़ंक्शन, उद्धृत फ़ंक्शन और तेज-कोट फ़ंक्शन

(println (map + '(1 2 3) '(4 5 6))) 

(println (map '+ '(1 2 3) '(4 5 6))) 

(println (map #'+ '(1 2 3) '(4 5 6))) 

परिणाम हैं

(5 7 9) 

(4 5 6) 

(5 7 9) 

मैं एक दूसरे के व्यवहार नहीं समझ सकता।

मुझे लगता है कि पहला और तीसरा क्लोजर में समान है जो लिस्प -1 है और एक चर और समान नामित फ़ंक्शन का मूल्यांकन करने के बीच अंतर नहीं करता है।

यह एक मूल प्रश्न हो सकता है, लेकिन ऐसा लगता है कि पर्याप्त जानकारी नहीं है। कृपया मुझे सिखाओ।

धन्यवाद।

+2

एक तरफ, क्लोजर में उद्धृत सूचियों के बजाय वैक्टरों के साथ शाब्दिक अनुक्रमों का वर्णन करने के लिए मूर्खतापूर्ण है। –

+0

ओह, मैं देखता हूं। धन्यवाद, एलेक्स। –

उत्तर

32

तीसरे मामले के बारे में, कॉमन लिस्प के विपरीत, #'+(function +) के रूप में पढ़ा नहीं है और समारोह नाम स्थान में प्रतीक + का मूल्य का उल्लेख है, क्योंकि Clojure एक समारोह नाम स्थान नहीं है। इसके बजाय, यह (var +) के रूप में पढ़ता है और var को + कहा जाता है। var लागू करना var में संग्रहीत मान को लागू करने जैसा ही है।

दूसरे मामले में, आप बार-बार संख्याओं की एक जोड़ी के लिए प्रतीक लागू कर रहे हैं। यह दुर्घटना से मान्य है।

user> ('a {'a 1, 'b 2, 'c 3, '+ 4}) 
1 
user> ('+ {'a 1, 'b 2, 'c 3, '+ 4}) 
4 

आप एक दूसरा तर्क की आपूर्ति है, यह मामले में डिफ़ॉल्ट मान के रूप में किया जाता है कोई मिलता-जुलता कुंजी नक्शा में पाया जाता है:

एक नक्शा करने के लिए एक प्रतीक को लागू करने कि नक्शे में अनुक्रमण रूप में ही है
user> ('+ {'a 1, 'b 2, 'c 3} 4) 
4 

प्रत्येक पुनरावृत्ति में, आप संख्याओं की एक जोड़ी के लिए + प्रतीक लागू करते हैं, और चूंकि कोई संख्या मानचित्र नहीं है और इसलिए + एक कुंजी के रूप में नहीं है, दूसरा तर्क डिफ़ॉल्ट मान के रूप में वापस किया जाता है एक असफल मैच

user> ('+ 'foo 4) 
4 
user> ('+ {} 4) 
4 
user> ('+ 1 4) 
4 
+0

ग्रेट उत्तर। तुरंत स्पष्ट व्यवहार की स्पष्ट व्याख्या। धन्यवाद। – sw1nn

+0

बहुत धन्यवाद, मैथियस। मैं समझ सकता हूं कि # 'मतलब क्या है। मुझे वार का एहसास नहीं हुआ, और मैंने इसे नजरअंदाज कर दिया, लेकिन इस बार मैं इसे और अधिक गहराई से समझ सकता था। मैं दूसरे कोड व्यवहार को भी समझ सकता हूं। धन्यवाद। –

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