2010-06-14 17 views
14

मैं एक स्थिर टाइप की गई भाषा में कुछ मेटाप्रोग्रामिंग करना चाहता हूं, जहां मेरे प्रोग्राम और मेरे मेटा-प्रोग्राम दोनों टाइप किए जाएंगे। मेरा मतलब यह एक मजबूत अर्थ में है: यदि मेरा प्रोग्राम जनरेटर संकलित करता है, तो मैं चाहता हूं कि टाइप सिस्टम इतना मजबूत हो कि केवल टाइप-सही प्रोग्राम उत्पन्न किए जा सकें।टाइप किए गए मेटाप्रोग्रामिंग भाषा

जहां तक ​​मुझे पता है, केवल metaocaml ऐसा कर सकता है। (नहीं, न तो टेम्पलेट हास्केल और न ही सी ++ टेम्पलेट बिल फिट करते हैं - this paper देखें)। प्रश्न: अन्य भाषाएं/सिस्टम इस अनुमति क्यों देते हैं?

संपादित करें: जहां तक ​​मैं कह सकता हूं, मेटाकोमल मर चुका है। ओलेग tried to resurrect it, लेकिन यह अभी भी ओकैमल के पीछे कई संस्करणों को अटक गया है। एक प्रयोगात्मक भाषाओं के साथ जाना चाहती है तो (यानी भी ज्यादा metaocaml से, ऐसा लगता है कि Ur और बहुत संभव है Idris क्षेत्र के लिए बिल फिट। किसी भी अन्य नई प्रविष्टियां?

+1

वहाँ एक सवाल है? – Ken

+3

@ केन: हाँ - मुझे भाषाएं/सिस्टम दें जो इसकी अनुमति देते हैं। मैं सवाल संपादित करूंगा (हालांकि मुझे लगता है कि 2 उत्तरदाताओं ने मुझे पूरी तरह से समझ लिया)। –

+1

मुझे टी के बारे में टिप्पणी करने का इरादा था, [यह विषय हास्केल-कैफे मेलिंग सूची पर आया था] (http://www.haskell.org/pipermail/haskell-cafe/2010-April/075753.html) थोड़ा वापस, लेकिन धागे को खोजने के बाद ऐसा लगता है कि, स्पष्ट कारणों से, यह इस प्रश्न का उत्तर देने में कोई सहायता नहीं प्रदान करता है ... –

उत्तर

6

एफ # Code Quotations के माध्यम से भी ऐसा कर सकते हैं।

+0

यह * टाइप चेक * उद्धरण (आवेदन संदर्भ की अनुपस्थिति में), * और * उनके आवेदन टाइप करें? यह विश्वास करना आसान है कि यह वाक्यविन्यास जांच करता है। –

+2

हां यह टाइप भी एप्लिकेशन को चेक करता है, अगर आप यही पूछ रहे हैं। जैसे 'x = <@square [email protected]>' दें, यहां x में 'expr ' प्रकार है। अभिव्यक्ति मूल्यांकन एएसटी-पुनर्लेखन द्वारा किया जाता है। – Stringer

8

ऐसा करने के लिए, आपको यह सुनिश्चित करना होगा कि अंतर्निहित श्वास की प्रकार प्रणाली सीधे मेटाप्रोग्राम द्वारा सम्मानित/जांच की जाती है। व्यावहारिक मामले के रूप में, यह लगभग मेटाप्रोग्रामिंग को अंतर्निहित भाषा में रखने के लिए मजबूर करता है ... इसलिए मुझे लगता है मुझे आश्चर्य नहीं है कि आप इसे मेटाओकैमल में कर सकते हैं।

हम में से अधिकांश को मेटाप्रोग्रामिंग टूल नहीं मिलते हैं अंतर्निहित भाषा के लिए (सी ++ बल्कि अपवाद है, और मैंने इसे अस्वीकार कर दिया है और प्रतिबिंब आधारित सिस्टम मनमाने ढंग से परिवर्तन करने के लिए बहुत कमजोर होने के रूप में)।

एक प्रणाली जो कोड पर मनमाने ढंग से परिवर्तन (या उन लोगों के सेट से बना मेटाप्रोग्राम) कर सकती है DMS Software Reengineering Toolkit है। डीएमएस के कई वास्तविक लैंगुग के लिए फ्रंट सिरों हैं, पार्सिंग (एएसटी समेत) संकलक डेटा संरचनाएं बनाता है। डीएमएस source-to-source program transformations प्रदान करता है जो लक्ष्य भाषा के सतह वाक्यविन्यास का उपयोग करके एएसटी-रीराइट्स के रूप में परिवर्तन का प्रतिनिधित्व करता है। यह आपकी आवश्यकता को एक निश्चित डिग्री तक पूरा करता है: यदि आपके परिवर्तन नियम वाक्य रचनात्मक रूप से सही हैं (और उन्हें डीएमएस द्वारा चेक किया गया है), तो परिवर्तित प्रोग्राम वाक्य रचनात्मक रूप से सही होगा। यह आपकी प्रकार-शुद्धता आवश्यकता को प्राप्त नहीं करता है, क्योंकि टाइप-चेकिंग तंत्र लक्ष्य भाषा के बाहर लागू किए जाते हैं। प्रिंसिपल में, प्रोग्राम ट्रांसफॉर्मेशन बढ़ाने के लिए कोई एक प्रकार का सुरक्षित चेकर हो सकता है; प्रैक्टिस में, हमने पाया है कि हम विश्वसनीय रूप से कोड ट्रांसफॉर्मेशन कर सकते हैं।

और यदि आपके पास टाइप-सुरक्षित परिवर्तन हैं, तो आपके पास अपने मूल कार्यक्रम के संबंध में अर्थात् सुरक्षा की गारंटी नहीं है। तो, आपको अभी भी मेटाप्रोग्राम डीबग करना होगा।

+0

स्ट्रेटगो और TXL से तुलना कैसे करता है? –

+0

इसी तरह, इन तीनों में सतह-वाक्यविन्यास एएसटी पुनर्लेखन है। डीएमएस में विभिन्न प्रकार की उत्पादन-गुणवत्ता वाली भाषा के सामने हैं। डीएमएस नियंत्रण/डेटाफ्लो/कॉलग्राफ/पॉइंटस्टो और प्रतीकात्मक रेंज एनालिसिस तंत्र प्रदान करता है जो स्ट्रेटगो और TXL प्रदान नहीं करते हैं। उनके समर्थकों का सुझाव है कि आप विभिन्न पुनर्लेखन नियमों को कोड करके मांग पर (प्रवाह) विश्लेषण के भाग की गणना कर सकते हैं, लेकिन यह एक ऐसा दृष्टिकोण नहीं है जिसे मैं व्यावहारिक मानता हूं। विभिन्न प्रकार के प्रोग्राम मैनिपुलेशन तकनीकों के लिए डीएमएस की अधिक तुलना के लिए, http://www.semdesigns.com/products/DMS/DMSComparison.html –

1

स्काला में संकलन समय metaprogramming।

Our flavor of macros is reminiscent of Lisp macros, adapted to incorporate type safety and rich syntax. Unlike infamous C/C++ preprocessor macros, Scala macros: 1) are written in full-fledged Scala, 2) work with expression trees, not with raw strings, 3) cannot change syntax of Scala.

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