2011-12-04 11 views
70

जावा कंपाइलर को letcom.sun.tools.javac.tree.* में अभिव्यक्तियों का समर्थन है (LetExpr देखें)। JCTree मेंजावा कंपाइलर में "चलो अभिव्यक्ति" (LetExpr) का उद्देश्य?

एक टिप्पणी भी कुछ वाक्य रचना

(let int x = 3; in x+2) 

जो निश्चित रूप से भाषा के व्याकरण द्वारा स्वीकार कर लिया और पहले के एक संकलक चरण में अस्वीकार कर दिया है का उल्लेख है।

मैं इस निर्माण की उत्पत्ति के बारे में सोच रहा हूं, जिसे मैंने पहले कभी नहीं देखा है।

क्या यह आंतरिक रूप से javac द्वारा उपयोग किया जाता है या यह अन्य उपकरणों द्वारा संश्लेषित किया जाता है? क्या यह शायद जावा के शुरुआती दिनों से एक भाषा फीचर से एक आर्टिफैक्ट है जिसने कभी प्रकाश नहीं देखा?

क्या कोई उपयोगी है जो आज इसके साथ किया जा सकता है?

आम तौर पर यह क्यों मौजूद है?

उत्तर

43

आम तौर पर यह क्यों मौजूद है?

यह Google के सुझाव के अनुसार ऑटोबॉक्सिंग के लिए मौजूद है।

आप इस तरह कोड है, तो:

Integer foo = 0; 
let int foo_helper = foo.intValue() in foo_helper++; 

स्रोत:: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6614974

अभिव्यक्ति स्पष्ट रूप से कोई वाक्य रचना प्रतिनिधित्व है बस हो गया,

Integer foo = 0; 
foo++; 

जावा आंतरिक रूप से यह इस सहायक अभिव्यक्ति में बनाता है संकलन को सरल बनाने के लिए केवल एक एएसटी स्तर परिवर्तन।

+13

वह पृष्ठ यह नहीं कहता कि यह * ऑटोबॉक्सिंग के लिए * मौजूद है, केवल यह है कि यह ऑटोबॉक्सिंग में * उपयोग * है। चूंकि पृष्ठ ऑटोबॉक्सिंग में एक बग के बारे में है, चलो-अभिव्यक्तियों के बारे में नहीं, यह आश्चर्य की बात नहीं है कि ऑटोबॉक्सिंग केवल अभिव्यक्तियों के लिए उपयोग का एकमात्र उपयोग है। (मैं यह नहीं कह रहा कि आप गलत हैं - मुझे वास्तव में पता नहीं है - लेकिन मुझे लगता है कि यदि आप एक के बारे में जानते हैं तो अधिक प्रासंगिक/दृढ़/स्पष्ट स्रोत जोड़ने में मददगार होगा।) – ruakh

+3

'चलिए क्या करते हैं int foo_helper = foo.intValue() foo_helper ++ में; 'इसका मतलब भी है? – ArtB

+1

@ArtB यह एमएल वाक्यविन्यास के समान है। अभिव्यक्ति में var = मान दें। इस प्रकार अभिव्यक्ति में, var के सभी उदाहरण मूल्य का मूल्यांकन करते हैं। – Matthew

3

इसे लेट फॉर्म कहा जाता है और इसका उपयोग "संक्षेप में" करने के लिए किया जाता है।

दूसरी ओर, प्रक्रियात्मक भाषाओं में इसे "एक चर घोषित करना" कहा जाता है क्योंकि परिवर्तनीय का "मान" सेल प्रक्रिया भाषाओं में बदल सकता है। (कार्यात्मक भाषाओं में, यह सिर्फ संक्षेप में है और इसे पहले स्थान पर लिखने के लिए कोई अलग नहीं है)

मैं उन भाषाओं के बारे में सोच सकता हूं जो स्रोत कोड में इसका उपयोग करते हैं जो भाषा उपयोगकर्ता लिखते हैं (हास्केल, एमएल, योजना, एसबीसीएल, आर्क, ...), इसलिए सुनिश्चित नहीं है कि आपने इसे अभी तक कैसे नहीं देखा ...

या क्या आप जावा में ही थे?

(\x (x + 5)) 2 

जो अंततः

(2 + 5) 

जहां \ लैम्ब्डा माना जाता है कम हो जाएगा:

let x = 2 in (x + 5) 

के लिए आशुलिपि है।

जावा में क्यों है, यह सुनिश्चित नहीं है। ऐसा करने के लिए क्या करना है वैरिएबल घोषित करना, इसलिए जांच करें कि इसका उपयोग वहां किया गया है या नहीं।

+1

अभिव्यक्ति के बाद अद्यतन नहीं किया जाएगा सख्त कार्यात्मक भाषा (जैसे एमएल, योजना) में, एक बाध्यकारी का उपयोग करके अभिव्यक्ति को लिखने से काफी अलग है क्योंकि अभिव्यक्ति को बिंदु पर मूल्यांकन किया जाना चाहिए जहां यह बाध्य है। जावा के लिए दिमाग में आने वाले सबसे अधिक संभावित उपयोग कोड को साइड इफेक्ट्स के साथ स्टेटिक सिंगल असाइनमेंट फॉर्म में कनवर्ट करना है, जिसे ऑप्टिमाइज्ड बाइटकोड बनाने के लिए अधिक आसानी से विश्लेषण किया जाता है। –