क्या आप स्थिर प्रकार की जांच (जैसे जावा) के साथ भाषाएं नाम दे सकते हैं और जहां कोड डेटा है (जैसे LISP में)? मेरा मतलब है कि दोनों चीजें एक भाषा में हैं।क्या आप स्टेटिक टाइप चेकिंग वाली भाषा के बारे में जानते हैं जहां कोड डेटा है?
उत्तर
आप बस एक स्थिर टाइप किया भाषा में गतिशील रूप से कोड को निष्पादित करने की क्षमता के लिए देख रहे हैं, तो जावा ही ऐसा कर सकते हैं:
http://www.javaworld.com/javaworld/jw-06-2006/jw-0612-dynamic.html
आप (उससे अधिक की आवश्यकता चाहते हैं तरीकों और वर्गों प्रथम श्रेणी की वस्तुओं, आदि के रूप में), तो आप इसके बजाय हास्केल या सी # (जैसा कि अन्य उत्तरों में उल्लिखित) की तरह कुछ उपयोग करना चाहेंगे।
एफ # Quotation expressions है।
// typed
let e : Expr<int> = <@ 1 + 1 @>
// untyped
let e' : Expr = <@@ 1 + 1 @@>
// splicing with %
// similar to Lisp's unquote-splicing, but type-checked:
// you can only splice expressions of the appropriate type
<@ 1 + %e @>
मुझे लगता है कि इन सी # में उपलब्ध हैं, लेकिन (1) मैं नहीं जानता कि क्या वाक्य रचना है (2) डाटा संरचनाओं अलग हैं: MSDN पृष्ठ से।
इन भाषाओं, संकलन समय पर डेटा के रूप में कोड की अनुमति देने के लिस्प मैक्रो की तरह:
- हास्केल Template Haskell है।
- बू macros है।
- O'Caml में camlp5 है, जो एक परिष्कृत प्रीप्रोसेसर है।
अस्वीकरण: मैं वास्तव में इनमें से किसी भी उपयोग नहीं किया है। जहां तक मुझे पता है, वे लिस्प के quote
की तुलना में अधिक जटिल हैं।
हालांकि, quote
का उपयोग करते हुए "डेटा के रूप में कोड" का 90% बंद होने के साथ पूरा किया जा सकता है, क्योंकि वे मूल्यांकन में भी देरी करते हैं। बंद करने के लिए कई भाषाओं में सुविधाजनक वाक्यविन्यास होता है (सी #, क्लोजर, स्कैला और रूबी विशेष रूप से दिमाग में आते हैं) और quote
की आवश्यकता नहीं है। यहां तक कि योजना में, जो एक निश्चित लिस्प है, प्रचलित शैली मैक्रोज़ लिखने पर कार्यों को पारित करने का पक्ष लेती है।
मैक्रोज़ 'संकलन समय' नहीं हैं। मैक्रोज़ लिस्प दुभाषियों में पूरी तरह से अच्छी तरह से काम करते हैं। मूल्यांकन में देरी के बारे में लिस्प मैक्रोज भी 90% नहीं हैं। मैक्रोज़ के बहुत सारे उद्देश्य हैं। अधिकांश में देरी मूल्यांकन के साथ कुछ लेना देना नहीं है। –
आम लिस्प और योजना (जहां तक मुझे याद है) में 'रीड टाइम' पर मैक्रो मूल्यांकन होता है। मुझे नहीं पता था कि क्या पूछताछकर्ता इस शब्द को पहचान लेगा, इसलिए मैंने कम सटीक लेकिन अधिक आम इस्तेमाल किया। प्रथम श्रेणी के मैक्रोज़ के साथ प्रयोगात्मक लिस्पस रहे हैं, लेकिन वे व्यापक नहीं हैं। मूल्यांकन में देरी के लिए, यह ठीक है कि 'उद्धरण' क्या है, और कम आसानी से यद्यपि आपको क्या बंद कर देता है। मैं केवल मैक्रोज़ के बारे में बात नहीं कर रहा था, क्योंकि वे कोड-ए-डेटा के प्रतिबंधित उपयोग हैं। –
नाथन, मैक्रो मूल्यांकन सामान्य लिस्प में 'रीड टाइम' पर नहीं होता है। थोड़ा सा भी नहीं। मैक्रो विस्तार व्याख्या और/या संकलन के दौरान होता है और सीएल मानक में वर्णित है। यदि कोड का अर्थ चलता है, तो व्याख्या के दौरान मैक्रोज़ का विस्तार किया जा सकता है। QUOTE 'बंद' जैसे मूल्यांकन में देरी के लिए भी नहीं है। शाब्दिक डेटा को दर्शाने के लिए QUOTE है। उद्धृत कोड में देरी नहीं होती है, ताकि इसे 'मजबूर' किया जा सके। अगर कोई उद्धृत कोड निष्पादित करना चाहता है, तो इसे विकसित करना होगा। यह एक बड़ा अंतर है। –
क्यूई एक स्थाई रूप से टाइप लिस्प बोली है। इसके अलावा, कई अन्य लिस्प बोलीभाषाओं में (वैकल्पिक) स्थैतिक टाइपिंग है।
जावा के पास इस तरह की बहुत सीमित क्षमताएं हैं।
दिलचस्प सवाल, इतना आप metaprogramming और स्थिर टाइपिंग हो सकता है कि क्या नहीं है तुम हो सकता है या नहीं गतिशील metaprogramming हो यह स्थिर प्रकार सुरक्षित।
जो metaprogramming करता है और प्रकार-सुरक्षित है खाका हास्केल नहीं है, लेकिन यह स्थिर metaprogramming है।
फिलहाल मैं किसी भी भाषा के बारे में नहीं सोच सकता जो मुझे पता है कि गतिशील मेटाप्रोग्रामिंग और जहां गतिशील मेटाप्रोग्रामिंग स्थिर रूप से प्रकार-सुरक्षित है। क्यूई ऐसा करने के लिए बाध्य हो सकता है, लेकिन मुझे यकीन नहीं है।
क्या मैं शर्तों के स्पष्टीकरण के लिए पूछ सकता हूं? मुझे यकीन नहीं है कि मैं आपके बिंदु को समझता हूं। गतिशील बनाम स्थैतिक मेटाप्रोग्रामिंग द्वारा आपका क्या मतलब है? स्थैतिक मेटाप्रोग्रामिंग "संकलन समय पर" है, यानी मैक्रोज़, गतिशील बनाम, "रन टाइम पर" यानी मनमाने ढंग से अभिव्यक्ति उद्धरण? –
Template Haskell स्थिर रूप से टाइप किया गया है लेकिन आपको डेटा, उर्फ मेटाप्रोग्रामिंग के रूप में कोड में हेरफेर करने की अनुमति देता है। संबंधित भाषाओं में मेटाएमएल और मेटाकामल शामिल हैं। टिम शेर्ड के काम को देखो।
मेटाएमएल और मेटाकामल TH से काफी अलग हैं - पूर्व दोगुनी टाइप किए गए हैं (टाइप किए गए जनरेटर केवल टाइप किए गए कोड उत्पन्न करने की गारंटी देते हैं) जबकि TH केवल एकमात्र टाइप किया गया है, यानी केवल टेम्पलेट विस्तार का परिणाम टाइप-चेक किया गया है। –
@ जैक्स अच्छे बिंदु, लेकिन वे अभी भी उतने ही समान हैं कि मैं उन्हें एक ही जवाब में रखना चाहता हूं :-) –
Racket (पूर्व में पीएलटी योजना) में statically typed dialect है, जो मैक्रोज़ सहित योजना मुहावरे के साथ अच्छी तरह से काम करने के लिए डिज़ाइन किया गया है। (यह प्रकार की जाँच विस्तार परिणामों से काम करता है।)
शायद Strongtalk या Zero जो चिंतनशील प्रणाली एक ला स्मालटाक हैं, लेकिन स्थिर लिखे जाते हैं।
मैं इस प्रश्न के उत्तर के साथ सहमत होना चाहूंगा: http://stackoverflow.com/questions/2953141/why-are-most-s-expression- भाषाएं- गतिशील रूप से- यह है कि यह संभव नहीं है दोनों। –
@ डैनियल: उस प्रश्न का केवल सबसे कम वोट वाला जवाब दावा करता है कि दोनों होना संभव नहीं है। यह दावा करके यह करता है कि टाइपिंग वास्तव में कठिन होगी। मुश्किल, हाँ, लेकिन असंभव नहीं है। –
यह http://stackoverflow.com/questions/3037643/typed-metaprogramming- भाषाएं –