2010-02-19 9 views
14

में उद्धरण का उपयोग गैर-मूल्यांकन में क्लोजर परिणामों में उद्धरण। ':a और :a एक ही परिणाम लौटाएं। 'ए और: ए' के ​​बीच क्या अंतर है? किसी का मूल्यांकन नहीं किया जाता है और अन्य मूल्यांकन स्वयं ही ... लेकिन क्या यह गैर-मूल्यांकन के समान है?क्लोजर

+0

यह स्पष्ट नहीं है कि आप क्या पूछ रहे हैं। क्या आपका मतलब है "क्लोजर रीडर कैसे काम करता है?" किस तरह की स्पष्टीकरण आपके प्रश्न का उत्तर देगी? तथ्य यह है कि कीवर्ड खुद का मूल्यांकन करते हैं। उस संदर्भ में "कैसे" का अर्थ है? –

+0

मैं सहमत हूं। इसका एक "यह एक गैर-मूल्यांकन के समान है"। इस पर ध्यान दिलाने के लिए धन्यवाद। –

उत्तर

21
  1. ':a(quote :a) के लिए आशुलिपि है।

  2. (eval '(quote form)) परिभाषा के अनुसार form देता है। ऐसा कहने के लिए, यदि क्लोजर फ़ंक्शन eval को इसकी तर्क सूची सूची प्राप्त होती है जिसका पहला तत्व प्रतीक quote है, तो यह किसी भी तरह से इसे परिवर्तित किए बिना कहा गया सूची संरचना का दूसरा तत्व देता है (इस प्रकार यह कहा जाता है कि उद्धृत रूप है मूल्यांकित नहीं)। दूसरे शब्दों में, व्यवहार eval जब यह तर्क (quote foo) की सूची संरचना की सूची संरचना है, तो foo अपरिवर्तित लौटने की है, भले ही पर ध्यान न दिया जाए।

  3. जब आप शाब्दिक :a अपने कार्यक्रम में लिख, यह पढ़ने में कीवर्ड :a के रूप में हो जाता है; यानी, पाठ :a का ठोस टुकड़ा एक इन-मेमोरी डेटा संरचना में परिवर्तित हो जाता है जिसे :a कीवर्ड कहा जाता है (लिस्प को होम्योनिक अर्थ है कि कभी-कभी लिस्प डेटा और डेटा के पाठ के प्रतिनिधित्व के बीच अंतर करना मुश्किल होता है, यहां तक ​​कि जब यह स्पष्टीकरण उद्देश्यों के लिए उपयोगी होगा ...)।

  4. इन-स्मृति डेटा संरचना शाब्दिक :a करने के लिए इसी एक जावा वस्तु जो तरीकों आदि और जो दिलचस्प संपत्ति है कि समारोह eval, जब यह एक तर्क के रूप में इस डेटा वस्तु प्राप्त करता है, रिटर्न की एक संख्या को उजागर करता है यह अपरिवर्तित है। दूसरे शब्दों में, कीवर्ड का "खुद का मूल्यांकन" जो आप पूछते हैं वह eval व्यवहार को के रूप में किसी कीवर्ड में पारित करने के लिए व्यवहार है।

  5. इस प्रकार जब eval देखता ':a, यह एक उद्धृत फार्म के रूप में व्यवहार करता है और उसके दूसरे भाग देता है, जो :a होता है। दूसरी तरफ, eval:a देखता है, यह इसे एक कीवर्ड के रूप में मानता है और इसे अपरिवर्तित करता है। वापसी मूल्य दोनों मामलों में समान है (यह केवल कीवर्ड :a है); मूल्यांकन प्रक्रिया थोड़ा अलग है।

  6. Clojure अर्थ विज्ञान - वास्तव में लिस्प अर्थ विज्ञान, लिस्प के किसी भी बोली के लिए - मूल्यों से लौट आए और दुष्प्रभाव समारोह eval जब यह तर्क के रूप में विभिन्न लिस्प डेटा संरचनाओं प्राप्त करता है की वजह से के संदर्भ में निर्दिष्ट कर रहे हैं। इस प्रकार उपर्युक्त बताता है कि वास्तव में क्या होता है जब आप अपने प्रोग्राम में ':a या :a लिखते हैं ((println :a) जैसे कोड कुशल बाइटकोड में संकलित हो सकते हैं जो वास्तव में eval फ़ंक्शन को कोड नहीं करता है, लेकिन अर्थशास्त्र हमेशा संरक्षित होते हैं, इसलिए कि यह अभी भी कार्य करता है जैसे कि यह eval था जिसमें println और कीवर्ड :a) युक्त एक सूची संरचना प्राप्त हुई थी।

  7. कुंजी यहाँ विचार है कि है कि क्या प्रपत्र मूल्यांकन किया जा रहा ':a या :a है की परवाह किए बिना, कीवर्ड डेटा संरचना पढ़ा समय में निर्माण किया है है; तब जब इन रूपों में से एक का मूल्यांकन किया जाता है, तो डेटा संरचना अपरिवर्तित लौटा दी जाती है - हालांकि विभिन्न कारणों से।

+0

विस्तृत स्पष्टीकरण Michal के लिए धन्यवाद। तो eval ': ए' के ​​प्रकार को देखेंगे और जैसा कि एक कीवर्ड वापस आ जाएगा: ए? –

+0

@ इकरस: आपका स्वागत है। और हां, eval रिटर्न ': एक' अपरिवर्तित क्योंकि यह जानता है कि यह कीवर्ड के साथ क्या करना है। आंतरिक रूप से यह वास्तव में जेएमवी द्वारा प्रदान की गई कक्षा-आधारित प्रेषण की सुविधाओं का उपयोग करते हुए, कंपाइलर में कक्षा-आधारित प्रेषण के रूप में लागू किया जाता है; लेकिन यह एक कार्यान्वयन विस्तार है। –

+0

मुझे लगता है 2. होना चाहिए (eval (उद्धरण फ़ॉर्म)) –