नेमर्ले

Nemerle एक सामान्य प्रयोजन [[प्रोग्रामिंग भाषा]] है। सामान्य-उद्देश्य, उच्च स्तरीय प्रोग्रामिंग भाषा|उच्च-स्तरीय, स्थिर टाइपिंग प्रोग्रामिंग भाषा जिसे सामान्य भाषा इन्फ्रास्ट्रक्चर (.NET Framework|.NET/Mono (सॉफ़्टवेयर)) का उपयोग करने वाले प्लेटफार्मों के लिए डिज़ाइन किया गया है। यह कार्यात्मक प्रोग्रामिंग, वस्तु-उन्मुख, पहलू-उन्मुख प्रोग्रामिंग | पहलू-उन्मुख, चिंतनशील प्रोग्रामिंग और अनिवार्य प्रोग्रामिंग सुविधाएँ प्रदान करता है। इसमें एक साधारण सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी#-जैसे सिंटैक्स और एक शक्तिशाली मेटाप्रोग्रामिंग सिस्टम है।

जून 2012 में, नेमेरले के मुख्य डेवलपर्स को चेक गणराज्य सॉफ्टवेयर डेवलपमेंट कंपनी जेटब्रेन्स द्वारा किराए पर लिया गया था। टीम नित्रा को विकसित करने पर ध्यान केंद्रित कर रही थी, जो मौजूदा और नई प्रोग्रामिंग भाषाओं को लागू करने के लिए एक रूपरेखा है।  Nemerle भाषा और Nitra दोनों को JetBrains द्वारा छोड़ दिया गया है या बंद कर दिया गया है; Nitra को 2017 के बाद से इसके मूल रचनाकारों द्वारा अपडेट नहीं किया गया है और Nemerle को अब पूरी तरह से रूसी सॉफ्टवेयर डेवलपमेंट नेटवर्क, JetBrains से स्वतंत्र रूप से बनाए रखा गया है, हालांकि अभी तक कोई बड़ा अपडेट जारी नहीं किया गया है और विकास बहुत धीमी गति से आगे बढ़ रहा है। JetBrains द्वारा वर्षों से न तो नेमेर्ले और न ही नाइट्रा का उल्लेख या संदर्भ दिया गया है।

नेमेर्ले का नाम आर्कमेज नेमेर्ले के नाम पर रखा गया है, जो उर्सुला के. ले गिनी द्वारा फंतासी उपन्यास Earthsea का एक जादूगर में एक पात्र है।

विशेषताएं
Nemerle की सबसे उल्लेखनीय विशेषता प्रोग्रामिंग की शैलियों को मिलाने की क्षमता है जो ऑब्जेक्ट-ओरिएंटेड और कार्यात्मक हैं। प्रोग्राम को ऑब्जेक्ट-ओरिएंटेड कॉन्सेप्ट्स जैसे क्लासेस और नेमस्पेस का उपयोग करके संरचित किया जा सकता है, जबकि विधियों को (वैकल्पिक रूप से) एक कार्यात्मक शैली में लिखा जा सकता है। अन्य उल्लेखनीय विशेषताओं में शामिल हैं:
 * मजबूत प्रकार का अनुमान
 * एक लचीला मेटाप्रोग्रामिंग सबसिस्टम (मैक्रो (कंप्यूटर विज्ञान) का उपयोग करके)
 * C#, Java (प्रोग्रामिंग लैंग्वेज), और C++ की शैली में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के लिए पूर्ण समर्थन
 * एमएल (प्रोग्रामिंग भाषा), OCaml, और हास्केल (प्रोग्रामिंग भाषा) की शैली में कार्यात्मक प्रोग्रामिंग के लिए पूर्ण समर्थन, इन विशेषताओं के साथ:
 * उच्च क्रम के कार्य
 * पैटर्न मिलान
 * बीजगणितीय प्रकार
 * स्थानीय कार्य
 * tuples और अनाम प्रकार
 * कार्यों का आंशिक अनुप्रयोग

मेटाप्रोग्रामिंग सिस्टम महान संकलक एक्स्टेंसिबिलिटी, डोमेन-विशिष्ट भाषाओं को एम्बेड करने, आंशिक मूल्यांकन और पहलू-उन्मुख प्रोग्रामिंग की अनुमति देता है, एक उच्च-स्तरीय जावा (प्रोग्रामिंग भाषा) है। प्रोग्रामर से जितना संभव हो उतना बोझ उठाने के लिए उच्च-स्तरीय दृष्टिकोण। भाषा पैरामीट्रिक बहुरूपता, बेनामी फ़ंक्शन, विस्तार विधियों आदि सहित सभी सामान्य भाषा अवसंरचना (सीएलआई) मानक सुविधाओं को जोड़ती है। .NET या मोनो प्लेटफ़ॉर्म में शामिल पुस्तकालयों तक पहुँचना C# जितना आसान है।

अनुमान टाइप करें
<वाक्यविन्यास लैंग = निमेरल> डेफ एक्स = 1; // इंट मेरी सूची को परिभाषित करें = सूची ; // सामान्य सूची [टी], टाइप टी को अगली पंक्ति में उपयोग से घटाया जाता है myList.Add (एक्स); // कंपाइलर टी के प्रकार को घटाता है जैसे कि मेरी सूची प्रकार [int] बना रहा है 

सब कुछ एक अभिव्यक्ति है
<वाक्यविन्यास लैंग = निमेरल> डेफ एक्स = {// x = 3 के समान डीईएफ़ वाई = 1; डेफ जेड = 2; y + z // यह अंतिम कथन एक ब्लॉक रिटर्न वैल्यू है };

डेफ एक्स = if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) // if, using, try भी भाव हैं सोमवार अन्य दूसरे कल ;

def x = int.Parse (कुछ स्ट्रिंग) आज़माएं पकड़ो { | स्वरूप अपवाद => 0};

डीईएफ़ एक्स = रिटर्नब्लॉक: {   foreach (मैं [1, 2, 3] में) जब (मैं > 2) रिटर्नब्लॉक (सत्य); // बाहर निकलें ब्लॉक (एक्स = सच)

असत्य // x = असत्य }; 

टुपल्स
<वाक्यविन्यास लैंग = निमेरल> डेफ के = (1, एक); // के: (इंट * स्ट्रिंग) डीईएफ़ (ए, बी) = के; // ए = 1, बी = एक 

पैटर्न मिलान
<वाक्यविन्यास लैंग = निमेरल> डीईएफ़ परिणाम = मैच (संख्या) { | 0 => शून्य | 1 => एक | x जब x ऋणात्मक | _ => एक से अधिक } 

कार्यात्मक प्रकार और स्थानीय कार्य
<वाक्यविन्यास लैंग = निमेरल> System.Console का उपयोग करना; // कक्षाएं और मॉड्यूल (स्थैतिक वर्ग) नामस्थान में रखे जा सकते हैं def अगला (x) { x + 1}; // x तर्क के प्रकार और अन्य फ़ंक्शन तर्कों को उपयोग से घटाया जा सकता है

डीईएफ़ मल्टी (एक्स, वाई) {एक्स * वाई};

डीईएफ़ फिबोनैकी (मैं) { | 0 => 0  | 1 => 1  | अन्य => फाइबोनैचि (i - 1) + फाइबोनैचि (i - 2) };

राइटलाइन (अगला (9)); // 10 कंसोल के समान। राइटलाइन (अगला (9)); राइटलाइन (मल्टी (2, 2)); // 4 राइटलाइन (फाइबोनैचि (10)); // 55 

प्रकार
सम प्रकार (SML और OCaml में डेटा प्रकार या योग प्रकार कहा जाता है) कई अलग-अलग प्रकार के डेटा को व्यक्त करने के रूप हैं: <वाक्यविन्यास लैंग = निमेरल> भिन्न आरजीबीरंग { | लाल | पीला | हरा | अलग { लाल : फ्लोट; हरा: तैरना; नीला : तैरना; } } 

मेटाप्रोग्रामिंग
Nemerle का मैक्रो सिस्टम संकलन के दौरान प्रोग्राम कोड बनाने, विश्लेषण करने और संशोधित करने की अनुमति देता है। मैक्रोज़ का उपयोग मेथड कॉल के रूप में या नई भाषा निर्माण के रूप में किया जा सकता है। भाषा के भीतर कई निर्माण मैक्रोज़ (यदि, के लिए, foreach, जबकि, आदि का उपयोग करके) का उपयोग करके कार्यान्वित किए जाते हैं।

अगर मैक्रो उदाहरण: <वाक्यविन्यास लैंग = निमेरल> मैक्रो @if (cond, e1, e2) सिंटैक्स (अगर, (, cond,), e1, वैकल्पिक, और, e2) { /*    <[ ]> अर्ध-उद्धरण के एक क्षेत्र को परिभाषित करता है, नेमेरल कंपाइलर इसमें कोड को बदल देता है एएसटी के लिए, ऐसे परिवर्तन कुछ हद तक सी # में संकलित अभिव्यक्ति के समान हैं */ <[    मैच ($ cond: बूल) {     | सच => $e1 | _ => $e2 } ]> }

// कोड में इस मैक्रो का उपयोग करना: डीईएफ़ मैक्स = अगर (ए> बी) एक और बी; // एक संकलन समय के दौरान ऊपरी रेखा को इसमें बदल दिया जाएगा: डीईएफ़ मैक्स = मैच (ए> बी) { | सच => ए | _ => बी } 

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

निम्नलिखित कर्ली-ब्रेस स्निपेट:

<वाक्यविन्यास लैंग = नेमर्ले> System.Console का उपयोग करना;

[कुक्स] कक्षा फूबार { सार्वजनिक स्थैतिक मुख्य : शून्य { राइटलाइन (हैलो) }

स्थिर फू (एक्स: इंट): शून्य { अगर (एक्स == 3) { डीईएफ़ वाई = एक्स * 42; फू (एक्स) } अन्य { [एक्स]। नक्शा (मजेदार (एक्स) {       एक्स * 2      }) } }

स्टेटिक बार : int { डेफ फू = 2 + 7 * 13; फू } } 

के रूप में फिर से लिखा जा सकता है:

<वाक्यविन्यास लैंग = नेमर्ले> System.Console का उपयोग करना;

[कुक्स] \ वर्ग फूबार सार्वजनिक स्थैतिक मुख्य : शून्य राइटलाइन (हैलो)

स्थिर फू (एक्स: इंट): शून्य अगर (एक्स == 3) डीईएफ़ वाई = एक्स * 42; फू (एक्स) अन्य [एक्स]। नक्शा (मजेदार (एक्स) {       एक्स * 2      })

स्टेटिक बार : इंट डेफ फू = 2 + 7 * 13 फू 

विशेष रूप से, बैकस्लैश का उपयोग किए बिना कई पंक्तियों में मैचों में अभिव्यक्तियों या वैकल्पिक खंडों को तोड़ना संभव नहीं है :

<वाक्यविन्यास लैंग = नेमर्ले>

// यह संकलित नहीं होगा ...

स्टेटिक बार : इंट डेफ फू = 2 + 7    * 13  फू

मिलान | ए | आ => 1 | बी | बी बी => 2 | _ => 0 // लेकिन यह होगा:

स्टेटिक बार : इंट डेफ फू = 2 \ + 7 \    * 13  फू

मिलान | ए \ | आ => 1 | बी \ | बी बी => 2 | _ => 0



इस सिंटैक्स को सक्रिय करने के लिए, उपयोगकर्ता को जोड़ना होगा  फ़ाइल के शीर्ष पर या कंपाइलर विकल्प का उपयोग करें.

आईडीई
Nemerle को एकीकृत विकास पर्यावरण (IDE) Visual Studio 2008 में एकीकृत किया जा सकता है। इसमें Visual Studio 2008 शेल पर आधारित एक पूरी तरह से निःशुल्क IDE भी है। (विजुअल स्टूडियो एक्सप्रेस एडिशन की तरह) और SharpDevelop (लिंक टू प्लगइन सोर्स कोड)।

ऐड-इन्स और एक्सटेंशन का उपयोग करके Nemerle को Visual Studio (2017 तक) में भी एकीकृत किया जा सकता है।

हैलो, विश्व!
पारंपरिक हैलो वर्ल्ड प्रोग्राम|हैलो वर्ल्ड! अधिक सी #-जैसी फैशन में कार्यान्वित किया जा सकता है:

<वाक्यविन्यास लैंग = निमेरल> क्लास हैलो { स्थैतिक मुख्य : शून्य {   System.Console.WriteLine (हैलो, दुनिया!); } } 

या अधिक बस:

<वाक्यविन्यास लैंग = निमेरल> System.Console.WriteLine (हैलो, दुनिया!); 

मैक्रोज़ के उदाहरण
मैक्रोज़ कंपाइलर द्वारा किए गए अतिरिक्त स्थिर चेक के साथ बॉयलरप्लेट कोड उत्पन्न करने की अनुमति देते हैं। वे हाथ से लिखे जाने वाले कोड की मात्रा को कम करते हैं, कोड जनरेशन को सुरक्षित बनाते हैं, और स्रोत कोड को अपेक्षाकृत छोटा और पठनीय रखते हुए प्रोग्राम को कंपाइलर चेक के साथ कोड उत्पन्न करने की अनुमति देते हैं।

स्ट्रिंग स्वरूपण
स्ट्रिंग स्वरूपण मैक्रो $ संकेतन का उपयोग करके चर को स्ट्रिंग जोड़तोड़ के लिए सरल करता है: <वाक्यविन्यास लैंग = निमेरल> def s = $ संख्या $i है; // वेरिएबल i का मान डालें जहाँ $i रखा गया है def s = $ $x + $y = $(x+y); // $(...) का उपयोग गणना करने या सदस्यों तक पहुंचने के लिए किया जा सकता है 

घोषणात्मक कोड जनरेशन
स्ट्रक्चरल एक्वालिटी, मेमोइज़, जेसन, और मैक्रोज़ हैं जो संकलन समय में कोड उत्पन्न करते हैं। हालांकि उनमें से कुछ (स्ट्रक्चरलइक्वालिटी, मेमोइज़) सी # विशेषताओं की तरह दिख सकते हैं, संकलन के दौरान, उन्हें कंपाइलर द्वारा जांचा जाएगा और उनके मैक्रोज़ द्वारा पूर्वनिर्धारित तर्क का उपयोग करके उपयुक्त कोड में बदल दिया जाएगा।

<वाक्यविन्यास लैंग = निमेरल> [संरचनात्मक समानता] // IEquatable [नमूना] लागू करें। तत्व तुलना समानता का उपयोग करके नेट इंटरफ़ेस। वर्ग नमूना {  [मेमोइज़] // पहले मूल्यांकन परिणाम याद रखें सार्वजनिक स्थैतिक कुछ लंबा मूल्यांकन : int {      MathLib.CalculateNthPrime(10000000) }

[निर्भरता संपत्ति] // WPF निर्भरता संपत्ति सार्वजनिक निर्भरता संपत्ति नमूना {प्राप्त करें; तय करना; } सार्वजनिक स्थैतिक मुख्य : शून्य { /* सिंटैक्स मैक्रो json कोड उत्पन्न करता है: जॉब्जेक्ट.ऑब्जेक्ट ([(ए, जेवैल्यू.नंबर (कुछ लंबे मूल्यांकन )), (बी, जेवैल्यू.नंबर (कुछ लंबे मूल्यांकन + 1))]) def jObject = json {a: SomeLongEvaluations; बी: (कुछ लंबे मूल्यांकन + 1)} // ऑब्जेक्ट इनिशियलाइज़ेशन मैक्रो <- सी # कर्ली ब्रैकेट्स ऑब्जेक्ट इनिशियलाइज़ेशन का विकास है def k = डायग्नोस्टिक्स.प्रोसेस <- {         StartInfo <- // सीटीआर कॉल के बिना आंतरिक वस्तुओं के गुणों में प्रवेश कर सकता है {             फ़ाइलनाम = calc.exe; UseShellExecute = सच; }         Exited +=  => राइटलाइन (कैल्क किया गया); // घटनाएँ और प्रतिनिधि }

पढ़ने के लिए लाइन; } } 

डेटाबेस पहुंच
SQL के लिए Nemerle मैक्रोज़ का उपयोग करके आप लिख सकते हैं:

<वाक्यविन्यास लैंग = निमेरल> ExecuteReaderLoop (पहले नाम का चयन करें, कर्मचारी से अंतिम नाम जहां पहला नाम = $ myparm, dbcon, {    राइटलाइन ($ नाम: $firstname $lastname )  }); 

के बजाय

<वाक्यविन्यास लैंग = निमेरल> स्ट्रिंग एसक्यूएल = पहले नाम का चयन करें, कर्मचारी से अंतिम नाम जहां पहला नाम =: ए; (NpgsqlCommand dbcmd = new NpgsqlCommand (sql, dbcon, dbtran) का उपयोग करके) { dbcmd.Parameters.Add (ए, myparm);

(NpgsqlReader रीडर = dbcmd.ExecuteReader ) का उपयोग करना {    जबकि (पाठक। पढ़ें ) {       वर प्रथम नाम = पाठक.GetString (0); var अंतिम नाम = पाठक। गेटस्ट्रिंग (1); कंसोल.राइटलाइन (नाम: {0} {1}, पहला नाम, अंतिम नाम) } } } 

और यह केवल लाइब्रेरी में कुछ संचालन छुपा नहीं रहा है, बल्कि क्वेरी स्ट्रिंग को समझने के लिए कंपाइलर द्वारा किया गया अतिरिक्त कार्य, वहां उपयोग किए जाने वाले चर, और कॉलम डेटाबेस से लौटाए गए हैं। ExecuteReaderLoop मैक्रो आपको मैन्युअल रूप से टाइप करने के लिए मोटे तौर पर समतुल्य कोड उत्पन्न करेगा। इसके अलावा, यह जाँचने के लिए संकलन समय पर डेटाबेस से जुड़ता है कि आपकी SQL क्वेरी वास्तव में समझ में आती है।

नई भाषा का निर्माण
Nemerle मैक्रोज़ के साथ आप भाषा में कुछ नए सिंटैक्स भी पेश कर सकते हैं:

<वाक्यविन्यास लैंग = नेमर्ले> मैक्रो रिवर्सफॉर (i, start, body) सिंटैक्स ( ford, ( , i ; , start ) , body) {  <[ for ($i = $begin; $i >= 0; $i--) $body ]> } </वाक्यविन्यास हाइलाइट>

एक मैक्रो को परिभाषित करता है जो परिचय देता है ford (EXPR ; EXPR) EXPR सिंटैक्स और जैसे इस्तेमाल किया जा सकता है

फोर्ड (आई; एन) प्रिंट (आई);

ASP.NET
के साथ Nemerle Nemerle को या तो सीधे ASP.NET में एम्बेड किया जा सकता है: <वाक्यविन्यास प्रकाश लैंग = एएसपीएक्स-सीएस> <%@ पृष्ठ भाषा = Nemerle%> <स्क्रिप्ट रनैट = सर्वर>

पेज_लोड (_: ऑब्जेक्ट, _: इवेंटआर्ग): शून्य { Message.Text = $ आप पिछली बार इस पेज पर पहुंचे थे: $(DateTime.Now); }

EnterBtn_Click(_ : वस्तु, _ : EventArgs): शून्य { Message.Text = $ Hi $(Name.Text), ASP.NET में आपका स्वागत है! ;   }

</स्क्रिप्ट>

<एचटीएमएल> <शरीर> <फॉर्म रनैट = सर्वर> कृपया अपना नाम दर्ज करें: <एएसपी: टेक्स्टबॉक्स आईडी = नाम रनैट = सर्वर /> <एएसपी: बटन ऑनक्लिक = एंटरबीटीएन_क्लिक टेक्स्ट = रनैट दर्ज करें = सर्वर />

<asp:लेबल आईडी= संदेश रनैट= सर्वर /> </रूप> </शरीर> </वाक्यविन्यास हाइलाइट> ... या एक अलग फ़ाइल में संग्रहीत और एक पंक्ति के साथ दर्ज किया गया: <वाक्यविन्यास प्रकाश लैंग = एएसपीएक्स-सीएस> <%@ पृष्ठ भाषा = Nemerle Src= test.n Inherits= Test %> </वाक्यविन्यास हाइलाइट>

पी इनवोक
नेमेर्ले नेटिव प्लेटफॉर्म लाइब्रेरी का लाभ उठा सकता है। सिंटैक्स C# और अन्य .NET भाषाओं के समान है। यहाँ सबसे सरल उदाहरण है:

<वाक्यविन्यास प्रकाश लैंग = csharp> सिस्टम का उपयोग करना; System.Runtime.InteropServices का उपयोग करना;

क्लास प्लेटफार्म इनवोकटेस्ट {   [DllImport( msvcrt.dll )] सार्वजनिक बाहरी स्थैतिक डालता है (सी: स्ट्रिंग): int;

[DllImport( msvcrt.dll )] आंतरिक बाहरी स्थिर _flushall : int;

सार्वजनिक स्थैतिक मुख्य : शून्य {       _ = डालता है (टेस्ट); _ = _flushall ; } } </वाक्यविन्यास हाइलाइट>

अग्रिम पठन

 * Publications about Nemerle in RSDN Magazine, Russian official science magazine
 * Presentation "Nemerle is notable" by Denis Rystsov
 * Article "Unconventional languages for unconventional supercomputers" by Andrey Adinetz
 * Article "Unconventional languages for unconventional supercomputers" by Andrey Adinetz

बाहरी संबंध

 * GitHub project and repository (new development)
 * Google Code project and repository (old development)
 * Nemerle Forum
 * Nemerle presentation on Microsoft Research SSCLI RFP II Capstone 2005 workshop
 * Nemerle at 99 Bottles of Beer
 * Nemerle at 99 Bottles of Beer