मैं let
बाइंडिंग को लागू करने के 2 तरीके देख सकता हूं। सबसे पहले, SICP से ज्ञात, let
को लैम्ब्डा फ़ंक्शन के रूप में कार्यान्वित किया जा सकता है। यह सुविधाजनक और सरल है, लेकिन इस तथ्य को ध्यान में रखते हुए कि प्रत्येक लैम्ब्डा (fn
) का अनुवाद जेवीएम में अलग वर्ग में किया जाता है और let
की संख्या औसत प्रोग्राम में उपयोग की जाती है, यह बहुत महंगा लगता है।क्लोजर में 'चलो' कैसे लागू किया गया है और इसका ओवरहेड क्या है?
दूसरा, let
बाइंडिंग सीधे स्थानीय जावा चर में अनुवाद किया जा सकता है। यह बहुत कम ओवरहेड देता है, लेकिन एक स्टैक ब्रेक भाषा अर्थशास्त्र पर बाइंडिंग संग्रहित करता है: इस मामले में बंद होने का निर्माण असंभव है - बचाए गए मूल्यों को केवल अनचाहे ढेर के बाद ही नष्ट कर दिया जाएगा।
तो क्लोजर में वास्तविक कार्यान्वयन क्या है? क्लोजर स्रोत में संबंधित लाइनों की ओर इशारा करते हुए सराहना की जाती है।
तो मुझे लगता है कि क्लोजर ऑब्जेक्ट बनाया गया है (और अंतिम चर की प्रतिलिपि बनाई जाती है) केवल तभी जब आवश्यक हो और सरल मामलों के लिए केवल स्टैक पर रहें? – ffriend
हां, यह काफी काम करता है कि यह कैसे काम करता है। यदि आप रुचि रखते हैं तो आप इसमें चारों ओर खुदाई कर सकते हैं: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/Compiler.java (हालांकि क्लोजर के बारे में पता लगाना विशेष रूप से आसान नहीं है कंपाइलर कर रहा है, बहुत सारे "जादू" हैं) – mikera
@ffriend जावा ब्लॉक स्कॉप्ड वेरिएबल्स (विधि स्कोप के विपरीत) है। मैंने क्लोजर कंपाइलर क्या किया है, इस पर ध्यान नहीं दिया है, लेकिन ऐसा लगता है कि * चलो * को अंतिम चर वाले कोड के ब्लॉक द्वारा कार्यान्वित किया जा सकता है। मुझे यकीन नहीं है कि आपको क्यों लगता है कि इसे बंद करने के साथ लागू किया जाएगा। –