डायलन (प्रोग्रामिंग भाषा): Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 25: Line 25:
डायलन एक बहु-प्रतिमान [योजना ([[प्रोग्रामिंग भाषा]])] जिसमें [[कार्यात्मक प्रोग्रामिंग]] और [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) के लिए समर्थन सम्मिलित है, और [[गतिशील प्रोग्रामिंग भाषा]] और [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] है, जबकि कुशल मशीन कोड उत्पन्न करने के लिए डिज़ाइन किया गया एक प्रोग्रामिंग मॉडल प्रदान करता है, जिसमें ठीक- गतिशील और स्थिर व्यवहारों पर सूक्ष्म नियंत्रण सम्मिलित है। इसे 1990 के दशक की प्रारंभ में [[Apple Computer|एप्पल कंप्यूटर]] के नेतृत्व वाले एक समूह द्वारा बनाया गया था।
डायलन एक बहु-प्रतिमान [योजना ([[प्रोग्रामिंग भाषा]])] जिसमें [[कार्यात्मक प्रोग्रामिंग]] और [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) के लिए समर्थन सम्मिलित है, और [[गतिशील प्रोग्रामिंग भाषा]] और [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] है, जबकि कुशल मशीन कोड उत्पन्न करने के लिए डिज़ाइन किया गया एक प्रोग्रामिंग मॉडल प्रदान करता है, जिसमें ठीक- गतिशील और स्थिर व्यवहारों पर सूक्ष्म नियंत्रण सम्मिलित है। इसे 1990 के दशक की प्रारंभ में [[Apple Computer|एप्पल कंप्यूटर]] के नेतृत्व वाले एक समूह द्वारा बनाया गया था।


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


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


डायलन ने अपने शब्दार्थ को स्कीम और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन शुरू में उपस्थित लिस्प प्रणाली के अन्दर बनाए गए थे। चुकीं, डायलन में लिस्प-जैसे उपसर्ग वाक्य-विन्यास के अतिरिक्त [[ALGOL|अल्गोल]] जैसा वाक्य-विन्यास है।
डायलन ने अपने शब्दार्थ को योजना और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन प्रारंभ में उपस्थित लिस्प प्रणाली के अन्दर बनाए गए थे। चुकीं, डायलन में लिस्प-जैसे उपसर्ग वाक्य-विन्यास के अतिरिक्त [[ALGOL|अल्गोल]] जैसा वाक्य-विन्यास है।


== इतिहास ==
== इतिहास ==
Line 41: Line 41:


== वाक्य-विन्यास ==
== वाक्य-विन्यास ==
डायलन की कई वाक्य-विन्यास विशेषताएं इसकी लिस्प विरासत से आती हैं। मूल रूप से, डायलन ने लिस्प-जैसे उपसर्ग वाक्य-विन्यास का उपयोग किया था, जो [[एस-अभिव्यक्ति]] पर आधारित था। जब तक भाषा का डिज़ाइन पूरा हो गया, तब तक वाक्य-विन्यास को अल्गोल जैसे वाक्य-विन्यास में बदल दिया गया था, इस उम्मीद के साथ कि यह प्रोग्रामर के व्यापक दर्शकों के लिए अधिक परिचित होगा। वाक्य-विन्यास माइकल कहल द्वारा डिजाइन किया गया था। डायलन रेफरेंस मैनुअल में इसका विस्तार से वर्णन किया गया है।<ref name="refman"/>
डायलन की कई वाक्य-विन्यास विशेषताएं इसकी लिस्प विरासत से आती हैं। मूल रूप से, डायलन ने लिस्प-जैसे उपसर्ग वाक्य-विन्यास का उपयोग किया था, जो [[एस-अभिव्यक्ति]] पर आधारित था। जब तक भाषा का डिज़ाइन पूरा हो गया, तब तक वाक्य-विन्यास को अल्गोल जैसे वाक्य-विन्यास में बदल दिया गया था, इस आशा के साथ कि यह प्रोग्रामर के व्यापक दर्शकों के लिए अधिक परिचित होगा। वाक्य-विन्यास माइकल कहल द्वारा डिजाइन किया गया था। डायलन रेफरेंस मैनुअल में इसका विस्तार से वर्णन किया गया है।<ref name="refman"/>






=== [[शाब्दिक वाक्य रचना]] ===
=== [[शाब्दिक वाक्य रचना]] ===
डायलन [[मामले की संवेदनशीलता|स्थिति की संवेदनशीलता]] नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां [[हाइफन-ऋण]] | हाइफ़न (माइनस) संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी [[तुतलाना मामला|तुतलाना स्थिति]] या [[कबाब का मामला|कबाब का स्थिति]] कहा जाता है) के भागों को जोड़ने के लिए किया जाता है। लिस्प भाषाओं में यह सम्मेलन सामान्य है।
डायलन [[मामले की संवेदनशीलता|स्थिति की संवेदनशीलता]] नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां [[हाइफन-ऋण|हाइफन-माइनस]] संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी [[तुतलाना मामला|तुतलाना स्थिति]] या [[कबाब का मामला|कबाब का स्थिति]] कहा जाता है) के भागों को जोड़ने के लिए किया जाता है। लिस्प भाषाओं में यह सम्मेलन सामान्य है।


अल्फ़ान्यूमेरिक वर्णों और हाइफ़न-माइनस संकेतों के अतिरिक्त, डायलन पहचानकर्ताओं के भाग के रूप में विभिन्न प्रकार के गैर-अल्फ़ान्यूमेरिक वर्णों की अनुमति देता है। पहचानकर्ताओं में केवल ये गैर-[[अक्षरांकीय]] वर्ण सम्मिलित नहीं हो सकते हैं।<ref name="refman"/> यदि कोई अस्पष्टता है तो खाली स्थान का प्रयोग किया जाता है।
अल्फ़ान्यूमेरिक वर्णों और हाइफ़न-माइनस संकेतों के अतिरिक्त, डायलन पहचानकर्ताओं के भाग के रूप में विभिन्न प्रकार के गैर-अल्फ़ान्यूमेरिक वर्णों की अनुमति देता है। पहचानकर्ताओं में केवल ये गैर-[[अक्षरांकीय]] वर्ण सम्मिलित नहीं हो सकते हैं।<ref name="refman"/> यदि कोई अस्पष्टता है तो खाली स्थान का प्रयोग किया जाता है।
Line 58: Line 58:
     required-init-keyword: y:;
     required-init-keyword: y:;
end class <point>;
end class <point>;
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <code>&lt;point&gt;</code> कोड उदाहरण में।
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>)'''
  '''स्लॉट पॉइंट-एक्स :: <पूर्णांक>,
    आवश्यक-init-कीवर्ड: x:;
  स्लॉट पॉइंट-वाई :: <पूर्णांक>,
    आवश्यक-init-कीवर्ड: y:;'''
'''अंत वर्ग <बिंदु>;
</वाक्यविन्यास हाइलाइट>'''
 
परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <code>&lt;point&gt;</code> कोड उदाहरण में।


में <code>end class &lt;point&gt;</code> दोनों <code>class</code> और <code>&lt;point&gt;</code> वैकल्पिक हैं। यह सभी के लिए सच है <code>end</code> खंड। उदाहरण के लिए, आप लिख सकते हैं <code>end if</code> या केवल <code>end</code> एक समाप्त करने के लिए <code>if</code> कथन।
में <code>end class &lt;point&gt;</code> दोनों <code>class</code> और <code>&lt;point&gt;</code> वैकल्पिक हैं। यह सभी के लिए सच है <code>end</code> खंड। उदाहरण के लिए, आप लिख सकते हैं <code>end if</code> या केवल <code>end</code> एक समाप्त करने के लिए <code>if</code> कथन।
Line 73: Line 64:
का उदहारण बनाना है <code>&lt;point&gt;</code>:<syntaxhighlight>
का उदहारण बनाना है <code>&lt;point&gt;</code>:<syntaxhighlight>
make(<point>, x: 100, y: 200)
make(<point>, x: 100, y: 200)
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>एक ही वर्ग, सबसे कम संभव विधि से फिर से लिखा गया:<syntaxhighlight>
बनाओ (<बिंदु>, एक्स: 100, वाई: 200)
</वाक्यविन्यास हाइलाइट>'''
 
 
एक ही वर्ग, सबसे कम संभव विधि से फिर से लिखा गया:
 
<syntaxhighlight>
define class <point> (<object>)
  slot point-x;
  slot point-y;
end;
</syntaxhighlight><syntaxhighlight>
define class <point> (<object>)
define class <point> (<object>)
   slot point-x;
   slot point-x;
   slot point-y;
   slot point-y;
end;
end;
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>स्लॉट अब दोनों टाइप किए गए हैं <code>&lt;object&gt;</code>. स्लॉट को मैन्युअल रूप से प्रारंभ किया जाना चाहिए:<syntaxhighlight>
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>)'''
'''अंत;
</वाक्यविन्यास हाइलाइट>'''
 
स्लॉट अब दोनों टाइप किए गए हैं <code>&lt;object&gt;</code>. स्लॉट को मैन्युअल रूप से प्रारंभ किया जाना चाहिए:<syntaxhighlight>
let p = make(<point>);
let p = make(<point>);
point-x(p) := 100;  // or p.point-x := 100;
point-x(p) := 100;  // or p.point-x := 100;
point-y(p) := 200;  // or p.point-y := 200;
point-y(p) := 200;  // or p.point-y := 200;
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>परंपरा के अनुसार, निरंतर नाम $ से प्रारंभ होते हैं:<syntaxhighlight>
चलो पी = बनाओ (<बिंदु>);
बिंदु-एक्स(पी) := 100; // या p.point-x := 100;
बिंदु-वाई (पी) := 200; // या p.point-y := 200;
</वाक्यविन्यास हाइलाइट>'''
 
परंपरा के अनुसार, निरंतर नाम $ से शुरू होते हैं:<syntaxhighlight>
define constant $pi :: <double-float> = 3.1415927d0;
define constant $pi :: <double-float> = 3.1415927d0;


</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>फैक्टोरियल फ़ंक्शन:<syntaxhighlight>
निरंतर $ पीआई परिभाषित करें :: <डबल-फ्लोट> = 3.1415927d0;
</वाक्यविन्यास हाइलाइट>'''
 
एक फैक्टोरियल फ़ंक्शन:<syntaxhighlight>
define function factorial (n :: <integer>) => (n! :: <integer>)
define function factorial (n :: <integer>) => (n! :: <integer>)
   case
   case
Line 121: Line 84:
   end
   end
end;
end;
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन>
</syntaxhighlight>यहाँ, <code>n!</code> और <code>&lt;integer&gt;</code> सामान्य पहचानकर्ता हैं।
फ़ंक्शन फ़ैक्टोरियल परिभाषित करें (n :: <पूर्णांक>) => (n! :: <पूर्णांक>)'''
  '''स्थिति
    n < 0 => त्रुटि (नकारात्मक पूर्णांक का भाज्य नहीं ले सकता: %d\n , n);
    एन = 0 => 1;
    अन्यथा => n * भाज्य (n - 1);
  अंत'''
'''अंत;
</वाक्यविन्यास हाइलाइट>'''
 
यहाँ, <code>n!</code> और <code>&lt;integer&gt;</code> सामान्य पहचानकर्ता हैं।


कोई स्पष्ट [[वापसी कथन]] नहीं है। एक विधि या कार्य का परिणाम अंतिम अभिव्यक्ति का मूल्यांकन है। वापसी की स्थिति में एक अभिव्यक्ति के बाद अर्धविराम को छोड़ना एक सामान्य शैली है।
कोई स्पष्ट [[वापसी कथन]] नहीं है। एक विधि या कार्य का परिणाम अंतिम अभिव्यक्ति का मूल्यांकन है। वापसी की स्थिति में एक अभिव्यक्ति के बाद अर्धविराम को छोड़ना एक सामान्य शैली है।
Line 154: Line 107:
   slot position :: <point>, required-init-keyword: position:;
   slot position :: <point>, required-init-keyword: position:;
end class;
end class;
</syntaxhighlight><वाक्यविन्यास लैंग = डायलन>
</syntaxhighlight>इस उदाहरण में, वर्ग<code>&lt;window&gt;</code>परिभाषित किया गया। <वर्ग का नाम> वाक्य-विन्यास केवल सम्मेलन है, वर्ग के नाम को अलग करने के लिए - कोण कोष्ठक केवल वर्ग के नाम का हिस्सा हैं। इसके विपरीत, कुछ भाषाओं में परिपाटी वर्ग के नाम के पहले अक्षर को कैपिटलाइज़ करने या नाम के आगे C या T (उदाहरण के लिए) लगाने की है। <code>&lt;window&gt;</code> एक ही वर्ग से विरासत में मिला है, <code>&lt;view&gt;</code>, और इसमें दो स्लॉट हैं, <code>title</code> विंडो शीर्षक के लिए एक स्ट्रिंग पकड़ना, और <code>position</code> खिड़की के एक कोने के लिए एक XY बिंदु धारण करना। इस उदाहरण में, शीर्षक को डिफ़ॉल्ट मान दिया गया है, जबकि स्थिति को नहीं दिया गया है। वैकल्पिक init-कीवर्ड वाक्य-विन्यास प्रोग्रामर को क्लास के किसी ऑब्जेक्ट को इंस्टेंट करते समय स्लॉट के प्रारंभिक मान को निर्दिष्ट करने की अनुमति देता है।
वर्ग परिभाषित करें <खिड़की> (<दृश्य>)
  स्लॉट शीर्षक :: <स्ट्रिंग> = शीर्षक रहित, init-कीवर्ड: शीर्षक:;
  स्लॉट स्थिति :: <बिंदु>, आवश्यक-इनिट-कीवर्ड: स्थिति :;
'''अंत वर्ग;
</वाक्यविन्यास हाइलाइट>'''
 
इस उदाहरण में, वर्ग<code>&lt;window&gt;</code>परिभाषित किया गया। <वर्ग का नाम> वाक्य-विन्यास केवल सम्मेलन है, वर्ग के नाम को अलग करने के लिए - कोण कोष्ठक केवल वर्ग के नाम का हिस्सा हैं। इसके विपरीत, कुछ भाषाओं में परिपाटी वर्ग के नाम के पहले अक्षर को कैपिटलाइज़ करने या नाम के आगे C या T (उदाहरण के लिए) लगाने की है। <code>&lt;window&gt;</code> एक ही वर्ग से विरासत में मिला है, <code>&lt;view&gt;</code>, और इसमें दो स्लॉट हैं, <code>title</code> विंडो शीर्षक के लिए एक स्ट्रिंग पकड़ना, और <code>position</code> खिड़की के एक कोने के लिए एक XY बिंदु धारण करना। इस उदाहरण में, शीर्षक को डिफ़ॉल्ट मान दिया गया है, जबकि स्थिति को नहीं दिया गया है। वैकल्पिक init-कीवर्ड वाक्य-विन्यास प्रोग्रामर को क्लास के किसी ऑब्जेक्ट को इंस्टेंट करते समय स्लॉट के प्रारंभिक मान को निर्दिष्ट करने की अनुमति देता है।


C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस स्थिति में उपरोक्त परिभाषा में कोई स्पष्ट निर्देश नहीं है, इसलिए दोनों भाषाओं में स्लॉट और विधियों तक पहुंच पर विचार किया जाता है <code>protected</code>, जिसका अर्थ है कि उनका उपयोग केवल उपवर्गों द्वारा किया जा सकता है। असंबंधित कोड को विंडो उदाहरणों का उपयोग करने की अनुमति देने के लिए, उन्हें घोषित किया जाना चाहिए <code>public</code>.
C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस स्थिति में उपरोक्त परिभाषा में कोई स्पष्ट निर्देश नहीं है, इसलिए दोनों भाषाओं में स्लॉट और विधियों तक पहुंच पर विचार किया जाता है <code>protected</code>, जिसका अर्थ है कि उनका उपयोग केवल उपवर्गों द्वारा किया जा सकता है। असंबंधित कोड को विंडो उदाहरणों का उपयोग करने की अनुमति देने के लिए, उन्हें घोषित किया जाना चाहिए <code>public</code>.
Line 178: Line 124:
   w.color := $blue;
   w.color := $blue;
end method;
end method;
</syntaxhighlight>'''<वाक्यविन्यास लैंग = डायलन>
</syntaxhighlight>यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके अन्दर समाहित हो जाएगी <code>&lt;window&gt;</code> कक्षा। ध्यान दें := सेटर कॉल, जो [[सिंटैक्टिक चीनी]] के लिए है <code>color-setter($blue, w)</code>.
परिभाषित विधि टर्न-ब्लू (डब्ल्यू :: <खिड़की>)'''
  '''रंग: = $नीला;'''
'''अंत विधि;
</वाक्यविन्यास हाइलाइट>'''


यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके अन्दर समाहित हो जाएगी <code>&lt;window&gt;</code> कक्षा। ध्यान दें := सेटर कॉल, जो [[सिंटैक्टिक चीनी]] के लिए है <code>color-setter($blue, w)</code>.
जब आप अधिक सामान्य उदाहरणों पर विचार करते हैं तो सामान्य तरीकों की उपयोगिता अपने आप में आ जाती है। उदाहरण के लिए, अधिकांश भाषाओं में एक सामान्य कार्य है <code>to-string</code>, जो वस्तु के लिए कुछ मानव-पठनीय रूप देता है। उदाहरण के लिए, एक विंडो अपना शीर्षक और माता-पिता में अपनी स्थिति वापस कर सकती है, जबकि एक स्ट्रिंग स्वयं वापस आ जाएगी। डायलन में इन विधियों को एक एकल मॉड्यूल में एकत्र किया जा सकता है जिसे कहा जाता है<code>to-string</code>, जिससे इस कोड को वर्ग की परिभाषा से ही हटा दिया जाता है। यदि कोई विशिष्ट वस्तु समर्थन नहीं करती है <code>to-string</code>, इसे सरलता से इसमें जोड़ा जा सकता है <code>to-string</code> मापांक।
 
जब आप अधिक सामान्य उदाहरणों पर विचार करते हैं तो सामान्य तरीकों की उपयोगिता अपने आप में आ जाती है। उदाहरण के लिए, अधिकांश भाषाओं में एक सामान्य कार्य है <code>to-string</code>, जो वस्तु के लिए कुछ मानव-पठनीय रूप देता है। उदाहरण के लिए, एक विंडो अपना शीर्षक और माता-पिता में अपनी स्थिति वापस कर सकती है, जबकि एक स्ट्रिंग स्वयं वापस आ जाएगी। डायलन में इन विधियों को एक एकल मॉड्यूल में एकत्र किया जा सकता है जिसे कहा जाता है<code>to-string</code>, जिससे इस कोड को वर्ग की परिभाषा से ही हटा दिया जाता है। यदि कोई विशिष्ट वस्तु समर्थन नहीं करती है <code>to-string</code>, इसे आसानी से इसमें जोड़ा जा सकता है <code>to-string</code> मापांक।


== एक्स्टेंसिबिलिटी ==
== एक्स्टेंसिबिलिटी ==
यह पूरी अवधारणा कुछ पाठकों को बहुत अजीब लग सकती है। संभालने के लिए कोड <code>to-string</code> एक खिड़की के लिए परिभाषित नहीं किया गया है <code>&lt;window&gt;</code>? इसका कोई अर्थ नहीं हो सकता है जब तक कि आप इस बात पर विचार न करें कि डायलन कॉल को कैसे संभालता है <code>to-string</code>. अधिकांश भाषाओं में{{which|date=June 2013}} जब कार्यक्रम संकलित किया जाता है <code>to-string</code> के लिए <code>&lt;window&gt;</code> देखा जाता है और विधि में एक सूचक (अधिक या कम) के साथ प्रतिस्थापित किया जाता है। डायलन में यह तब होता है जब प्रोग्राम पहली बार चलाया जाता है; [[रन टाइम सिस्टम|रन टाइम प्रणाली]] विधि-नाम/पैरामीटर विवरण की तालिका बनाता है और इस तालिका के माध्यम से गतिशील रूप से विधियों को देखता है। इसका अर्थ है कि एक विशिष्ट विधि के लिए एक फ़ंक्शन कहीं भी स्थित हो सकता है, न कि केवल संकलन-समय इकाई में। अंत में प्रोग्रामर को अपने कोड को रखने के स्थिति में अधिक लचीलापन दिया जाता है, जहां उचित हो, और कार्यात्मक लाइनों के साथ इसे एकत्रित करना जहां यह नहीं है।
यह पूरी अवधारणा कुछ पाठकों को बहुत विचित्र लग सकती है। विंडो के लिए <code>to-string</code> को संभालने के लिए कोड को <code>&lt;window&gt;</code> में परिभाषित नहीं किया गया है? '''एक खिड़की के लिए परिभाषित नहीं किया गया है ?''' यह तब तक समझ में नहीं आता जब तक कि आप इस बात पर विचार न करें कि डायलन <code>to-string</code> कॉल को कैसे संभालता है। अधिकांश भाषाओं में{{which|date=June 2013}} जब प्रोग्राम को संकलित किया जाता है तो <code>&lt;window&gt;</code> के लिए <code>to-string</code> को देखा जाता है और विधि के लिए एक पॉइंटर (अधिक या कम) के साथ प्रतिस्थापित किया जाता है। '''प्रतिस्थापित किया जाता है।''' डायलन में यह तब होता है जब प्रोग्राम पहली बार चलाया जाता है; [[रन टाइम सिस्टम|रन टाइम प्रणाली]] विधि-नाम/पैरामीटर विवरण की तालिका बनाता है और इस तालिका के माध्यम से गतिशील रूप से विधियों को देखता है। इसका अर्थ है कि एक विशिष्ट विधि के लिए एक फ़ंक्शन कहीं भी स्थित हो सकता है, न कि केवल संकलन-समय इकाई में हो सकता है। अंत में प्रोग्रामर को अपने कोड को रखने के स्थिति में अधिक लचीलापन दिया जाता है, जहां उचित हो, और कार्यात्मक लाइनों के साथ इसे एकत्रित करना जहां यह नहीं है।


यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <code>&lt;string&gt;</code>s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी मूलभूत कक्षाएं संभवतः ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है <code>spell-check</code> मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे प्रयुक्त किया जा सकता है <code>define method</code> निर्माण। इस स्थिति में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब <code>spell-check</code> मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी।
यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <code>&lt;string&gt;</code>s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी मूलभूत कक्षाएं संभवतः ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है <code>spell-check</code> मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे प्रयुक्त किया जा सकता है <code>define method</code> निर्माण। इस स्थिति में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब <code>spell-check</code> मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी।
Line 218: Line 158:
*[https://opendylan.org/books/drm/Language_Overview Overview of the language]
*[https://opendylan.org/books/drm/Language_Overview Overview of the language]
*[https://opendylan.org/documentation/intro-dylan/ An Introduction to Dylan]
*[https://opendylan.org/documentation/intro-dylan/ An Introduction to Dylan]
*[https://web.archive.org/web/20140516043246/http://opendylan.org/about/apple-dylan/ एप्पल Dylan TR1]
*[https://web.archive.org/web/20140516043246/http://opendylan.org/about/apple-dylan/ Apple Dylan TR1]
*[http://www.cise.ufl.edu/~jnw/Marlais/ The Marlais Dylan Interpreter] – An implementation of a subset of Dylan, suitable for bootstrapping a compiler
*[http://www.cise.ufl.edu/~jnw/Marlais/ The Marlais Dylan Interpreter] – An implementation of a subset of Dylan, suitable for bootstrapping a compiler
*{{Curlie|Computers/Programming/Languages/Lisp/Dylan/|Dylan}}
*{{Curlie|Computers/Programming/Languages/Lisp/Dylan/|Dylan}}


{{Lisp programming language}}
{{Lisp programming language}}
{{Authority control}}
 
[[Category: डिलन (प्रोग्रामिंग भाषा)| डिलन]] [[Category: क्रॉस-प्लेटफ़ॉर्म सॉफ़्टवेयर]] [[Category: एक्स्टेंसिबल सिंटैक्स प्रोग्रामिंग लैंग्वेज]] [[Category: लिस्प प्रोग्रामिंग भाषा परिवार]] [[Category: 1992 में बनाई गई प्रोग्रामिंग लैंग्वेज]]  
[[Category: डिलन (प्रोग्रामिंग भाषा)| डिलन]] [[Category: क्रॉस-प्लेटफ़ॉर्म सॉफ़्टवेयर]] [[Category: एक्स्टेंसिबल सिंटैक्स प्रोग्रामिंग लैंग्वेज]] [[Category: लिस्प प्रोग्रामिंग भाषा परिवार]] [[Category: 1992 में बनाई गई प्रोग्रामिंग लैंग्वेज]]  



Revision as of 11:48, 6 March 2023

Dylan
File:Dylan logo.png
Paradigmmulti-paradigm: functional, object-oriented
DeveloperOpen Source Community Apple Computer, Harlequin, Carnegie Mellon University
पहली प्रस्तुति1992; 32 years ago (1992)
Stable release
2022.1 / November 28, 2022; 23 months ago (2022-11-28)
टाइपिंग अनुशासनStrong, gradual
प्लेटफॉर्मIA-32, x86-64
ओएसCross-platform
फ़ाइल नाम एक्सटेंशनएसdylan, lid
वेबसाइटopendylan.org
Major implementations
Open Dylan, Gwydion Dylan
Dialects
infix-dylan (AKA Dylan), prefix-dylan (historical only)
Influenced by
CLOS, ALGOL, Scheme, EuLisp
Influenced
Lasso, Python, Ruby, Julia[1]

डायलन एक बहु-प्रतिमान [योजना (प्रोग्रामिंग भाषा)] जिसमें कार्यात्मक प्रोग्रामिंग और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी) के लिए समर्थन सम्मिलित है, और गतिशील प्रोग्रामिंग भाषा और प्रतिबिंब (कंप्यूटर प्रोग्रामिंग) है, जबकि कुशल मशीन कोड उत्पन्न करने के लिए डिज़ाइन किया गया एक प्रोग्रामिंग मॉडल प्रदान करता है, जिसमें ठीक- गतिशील और स्थिर व्यवहारों पर सूक्ष्म नियंत्रण सम्मिलित है। इसे 1990 के दशक की प्रारंभ में एप्पल कंप्यूटर के नेतृत्व वाले एक समूह द्वारा बनाया गया था।

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

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

डायलन ने अपने शब्दार्थ को योजना और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन प्रारंभ में उपस्थित लिस्प प्रणाली के अन्दर बनाए गए थे। चुकीं, डायलन में लिस्प-जैसे उपसर्ग वाक्य-विन्यास के अतिरिक्त अल्गोल जैसा वाक्य-विन्यास है।

इतिहास

डायलन को 1990 के दशक की प्रारंभ में एप्पल कंप्यूटर के नेतृत्व वाले एक समूह द्वारा बनाया गया था। इसके विकास के एक समय में, इसे एप्पल न्यूटन कंप्यूटर के साथ उपयोग करने का नियत था, लेकिन डायलन कार्यान्वयन समय पर पर्याप्त परिपक्वता तक नहीं पहुंचा, और न्यूटन ने इसके अतिरिक्त वाल्टर स्मिथ द्वारा विकसित सी और न्यूटनस्क्रिप्ट के मिश्रण का उपयोग किया। एप्पल ने 1995 में अपने डायलन विकास प्रयास को समाप्त कर दिया, चुकीं उन्होंने एक प्रौद्योगिकी रिलीज़ संस्करण उपलब्ध कराया (एप्पल डायलन टी.आर.1) जिसमें एक उन्नत एकीकृत विकास वातावरण (आईडीई) सम्मिलित था।

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

डायलन भाषा का कोड-नाम राल्फ था। जेम्स जोआक्विन ने डायनामिक भाषा के लिए डायलन नाम चुना।

वाक्य-विन्यास

डायलन की कई वाक्य-विन्यास विशेषताएं इसकी लिस्प विरासत से आती हैं। मूल रूप से, डायलन ने लिस्प-जैसे उपसर्ग वाक्य-विन्यास का उपयोग किया था, जो एस-अभिव्यक्ति पर आधारित था। जब तक भाषा का डिज़ाइन पूरा हो गया, तब तक वाक्य-विन्यास को अल्गोल जैसे वाक्य-विन्यास में बदल दिया गया था, इस आशा के साथ कि यह प्रोग्रामर के व्यापक दर्शकों के लिए अधिक परिचित होगा। वाक्य-विन्यास माइकल कहल द्वारा डिजाइन किया गया था। डायलन रेफरेंस मैनुअल में इसका विस्तार से वर्णन किया गया है।[2]


शाब्दिक वाक्य रचना

डायलन स्थिति की संवेदनशीलता नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां हाइफन-माइनस संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी तुतलाना स्थिति या कबाब का स्थिति कहा जाता है) के भागों को जोड़ने के लिए किया जाता है। लिस्प भाषाओं में यह सम्मेलन सामान्य है।

अल्फ़ान्यूमेरिक वर्णों और हाइफ़न-माइनस संकेतों के अतिरिक्त, डायलन पहचानकर्ताओं के भाग के रूप में विभिन्न प्रकार के गैर-अल्फ़ान्यूमेरिक वर्णों की अनुमति देता है। पहचानकर्ताओं में केवल ये गैर-अक्षरांकीय वर्ण सम्मिलित नहीं हो सकते हैं।[2] यदि कोई अस्पष्टता है तो खाली स्थान का प्रयोग किया जाता है।

उदाहरण कोड

कई स्लॉट के साथ एक साधारण वर्ग:

define class <point> (<object>)
  slot point-x :: <integer>,
    required-init-keyword: x:;
  slot point-y :: <integer>,
    required-init-keyword: y:;
end class <point>;

परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <point> कोड उदाहरण में।

में end class <point> दोनों class और <point> वैकल्पिक हैं। यह सभी के लिए सच है end खंड। उदाहरण के लिए, आप लिख सकते हैं end if या केवल end एक समाप्त करने के लिए if कथन।

का उदहारण बनाना है <point>:

make(<point>, x: 100, y: 200)

एक ही वर्ग, सबसे कम संभव विधि से फिर से लिखा गया:

define class <point> (<object>)
  slot point-x;
  slot point-y;
end;

स्लॉट अब दोनों टाइप किए गए हैं <object>. स्लॉट को मैन्युअल रूप से प्रारंभ किया जाना चाहिए:

let p = make(<point>);
point-x(p) := 100;  // or p.point-x := 100;
point-y(p) := 200;  // or p.point-y := 200;

परंपरा के अनुसार, निरंतर नाम $ से प्रारंभ होते हैं:

define constant $pi :: <double-float> = 3.1415927d0;

फैक्टोरियल फ़ंक्शन:

define function factorial (n :: <integer>) => (n! :: <integer>)
  case
    n < 0     => error("Can't take factorial of negative integer: %d\n", n);
    n = 0     => 1;
    otherwise => n * factorial(n - 1);
  end
end;

यहाँ, n! और <integer> सामान्य पहचानकर्ता हैं।

कोई स्पष्ट वापसी कथन नहीं है। एक विधि या कार्य का परिणाम अंतिम अभिव्यक्ति का मूल्यांकन है। वापसी की स्थिति में एक अभिव्यक्ति के बाद अर्धविराम को छोड़ना एक सामान्य शैली है।

मॉड्यूल बनाम नामस्थान

कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, क्लास इनकैप्सुलेशन और मॉड्युलैरिटी का मुख्य साधन हैं; प्रत्येक वर्ग एक नामस्थान को परिभाषित करता है और नियंत्रित करता है कि कौन सी परिभाषाएँ बाहरी रूप से दिखाई देती हैं। इसके अतिरिक्त, कई भाषाओं में कक्षाएं एक अविभाज्य इकाई को परिभाषित करती हैं जिसका उपयोग समग्र रूप से किया जाना चाहिए। उदाहरण के लिए, ए का उपयोग करना String संयोजन समारोह में सभी के विरुद्ध आयात और संकलन की आवश्यकता होती है String.

डायलन समेत कुछ भाषाओं में एक अलग, स्पष्ट नामस्थान या मॉड्यूल प्रणाली भी सम्मिलित है जो अधिक सामान्य विधि से कैप्सूलीकरण करता है।

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

उदाहरण के लिए, regex समर्थन के लिए ऐड-ऑन लाइब्रेरी पर विचार करें String. कुछ भाषाओं में, कार्यक्षमता को स्ट्रिंग्स में सम्मिलित करने के लिए, कार्यक्षमता को इसमें जोड़ा जाना चाहिए String नाम स्थान। ऐसा होते ही, द String वर्ग बड़ा हो जाता है, और जिन कार्यों को रेगेक्स का उपयोग करने की आवश्यकता नहीं होती है, उन्हें अभी भी बढ़े हुए पुस्तकालय आकार में इसके लिए भुगतान करना होगा। इस कारण से, इस प्रकार के ऐड-ऑन सामान्यतः उनके अपने नामस्थान और ऑब्जेक्ट में रखे जाते हैं। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि नए कार्य अब इसका हिस्सा नहीं हैं String; इसके अतिरिक्त, यह अपने स्वयं के कार्यों के सेट में अलग-थलग है जिसे अलग से बुलाया जाना चाहिए। के अतिरिक्त myString.parseWith(myPattern), जो OO के दृष्टिकोण से प्राकृतिक संगठन होगा, कुछ इस तरह myPattern.parseString(myString) का उपयोग किया जाता है, जो ऑर्डरिंग को प्रभावी ढंग से उलट देता है।

डायलन के तहत, एक ही कोड के लिए कई इंटरफेस को परिभाषित किया जा सकता है, उदाहरण के लिए स्ट्रिंग कॉन्सटेनेशन विधि को स्ट्रिंग इंटरफेस और कॉन्सट इंटरफेस दोनों में रखा जा सकता है, जो विभिन्न वर्गों के सभी अलग-अलग कॉन्सटेनेशन कार्यों को एक साथ एकत्रित करता है। यह सामान्यतः गणित पुस्तकालयों में अधिक उपयोग किया जाता है, जहां कार्य व्यापक रूप से भिन्न वस्तु प्रकारों पर प्रयुक्त होते हैं।

इंटरफ़ेस निर्माण का एक अधिक व्यावहारिक उपयोग एक मॉड्यूल के सार्वजनिक और निजी संस्करणों का निर्माण करना है, कुछ ऐसा जो अन्य भाषाओं में बोल्ट ऑन फीचर के रूप में सम्मिलित होता है जो हमेशा समस्याओं का कारण बनता है और वाक्य-विन्यास जोड़ता है। डायलन के तहत, प्रत्येक फ़ंक्शन कॉल को केवल निजी या विकास इंटरफ़ेस में रखा जा सकता है, और सार्वजनिक रूप से सुलभ कार्यों को एकत्र किया जा सकता है Public. जावा (प्रोग्रामिंग भाषा) या C++ के तहत किसी वस्तु की दृश्यता को कोड में परिभाषित किया गया है, जिसका अर्थ है कि एक समान परिवर्तन का समर्थन करने के लिए, एक प्रोग्रामर को परिभाषाओं को पूरी तरह से फिर से लिखने के लिए मजबूर किया जाएगा, और एक ही समय में दो संस्करण नहीं हो सकते।

कक्षाएं

डायलन में कक्षाएं वर्णन करती हैं slots अधिकांश OO भाषाओं के समान एक फैशन में वस्तुओं के (डेटा सदस्य, फ़ील्ड, ivars, आदि)। स्मालटाक की तरह, स्लॉट तक सभी पहुंच विधियों के माध्यम से है। स्लॉट नामों के आधार पर डिफ़ॉल्ट गेट्टर और सेटर विधियाँ स्वचालित रूप से उत्पन्न होती हैं। अधिकांश अन्य ओओ भाषाओं के विपरीत, कक्षा के लिए प्रयुक्त अन्य विधियों को अधिकांशतः कक्षा के बाहर परिभाषित किया जाता है, और इस प्रकार डायलन में कक्षा परिभाषाओं में सामान्यतः केवल भंडारण की परिभाषा सम्मिलित होती है। उदाहरण के लिए:

define class <window> (<view>)
  slot title :: <string> = "untitled", init-keyword: title:;
  slot position :: <point>, required-init-keyword: position:;
end class;

इस उदाहरण में, वर्ग<window>परिभाषित किया गया। <वर्ग का नाम> वाक्य-विन्यास केवल सम्मेलन है, वर्ग के नाम को अलग करने के लिए - कोण कोष्ठक केवल वर्ग के नाम का हिस्सा हैं। इसके विपरीत, कुछ भाषाओं में परिपाटी वर्ग के नाम के पहले अक्षर को कैपिटलाइज़ करने या नाम के आगे C या T (उदाहरण के लिए) लगाने की है। <window> एक ही वर्ग से विरासत में मिला है, <view>, और इसमें दो स्लॉट हैं, title विंडो शीर्षक के लिए एक स्ट्रिंग पकड़ना, और position खिड़की के एक कोने के लिए एक XY बिंदु धारण करना। इस उदाहरण में, शीर्षक को डिफ़ॉल्ट मान दिया गया है, जबकि स्थिति को नहीं दिया गया है। वैकल्पिक init-कीवर्ड वाक्य-विन्यास प्रोग्रामर को क्लास के किसी ऑब्जेक्ट को इंस्टेंट करते समय स्लॉट के प्रारंभिक मान को निर्दिष्ट करने की अनुमति देता है।

C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस स्थिति में उपरोक्त परिभाषा में कोई स्पष्ट निर्देश नहीं है, इसलिए दोनों भाषाओं में स्लॉट और विधियों तक पहुंच पर विचार किया जाता है protected, जिसका अर्थ है कि उनका उपयोग केवल उपवर्गों द्वारा किया जा सकता है। असंबंधित कोड को विंडो उदाहरणों का उपयोग करने की अनुमति देने के लिए, उन्हें घोषित किया जाना चाहिए public.

डायलन में, इस प्रकार के दृश्यता नियमों को कोड का हिस्सा नहीं माना जाता है, बल्कि मॉड्यूल/इंटरफ़ेस प्रणाली का हिस्सा माना जाता है। यह अधिक लचीलापन जोड़ता है। उदाहरण के लिए, प्रारंभिक विकास के दौरान उपयोग किया जाने वाला एक इंटरफ़ेस सब कुछ सार्वजनिक घोषित कर सकता है, जबकि परीक्षण और परिनियोजन में उपयोग किया जाने वाला इंटरफ़ेस इसे सीमित कर सकता है। सी ++ या जावा के साथ इन परिवर्तनों के लिए स्रोत कोड में परिवर्तन की आवश्यकता होगी, इसलिए लोग ऐसा नहीं करेंगे, जबकि डायलन में यह पूरी तरह से असंबंधित अवधारणा है।

चुकीं यह उदाहरण इसका उपयोग नहीं करता है, लेकिन डायलन भी कई वंशानुक्रम का समर्थन करता है।

विधि और सामान्य कार्य

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

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

डायलन में, कोड को कार्यों में भंडारण से अलग किया जाता है। कई वर्गों में ऐसी विधियाँ होती हैं जो अपने स्वयं के कार्यों को बुलाती हैं, जिससे अधिकांश अन्य OO भाषाओं की तरह दिखती हैं और महसूस होती हैं। चुकीं कोड सामान्य कार्यों में भी स्थित हो सकते हैं, जिसका अर्थ है कि वे किसी विशिष्ट वर्ग से जुड़े नहीं हैं, और किसी के द्वारा मूल रूप से कहे जा सकते हैं। एक विशिष्ट सामान्य कार्य को एक वर्ग में एक विधि से जोड़ना इस प्रकार पूरा किया जाता है:

define method turn-blue (w :: <window>)
  w.color := $blue;
end method;

यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके अन्दर समाहित हो जाएगी <window> कक्षा। ध्यान दें := सेटर कॉल, जो सिंटैक्टिक चीनी के लिए है color-setter($blue, w).

जब आप अधिक सामान्य उदाहरणों पर विचार करते हैं तो सामान्य तरीकों की उपयोगिता अपने आप में आ जाती है। उदाहरण के लिए, अधिकांश भाषाओं में एक सामान्य कार्य है to-string, जो वस्तु के लिए कुछ मानव-पठनीय रूप देता है। उदाहरण के लिए, एक विंडो अपना शीर्षक और माता-पिता में अपनी स्थिति वापस कर सकती है, जबकि एक स्ट्रिंग स्वयं वापस आ जाएगी। डायलन में इन विधियों को एक एकल मॉड्यूल में एकत्र किया जा सकता है जिसे कहा जाता हैto-string, जिससे इस कोड को वर्ग की परिभाषा से ही हटा दिया जाता है। यदि कोई विशिष्ट वस्तु समर्थन नहीं करती है to-string, इसे सरलता से इसमें जोड़ा जा सकता है to-string मापांक।

एक्स्टेंसिबिलिटी

यह पूरी अवधारणा कुछ पाठकों को बहुत विचित्र लग सकती है। विंडो के लिए to-string को संभालने के लिए कोड को <window> में परिभाषित नहीं किया गया है? एक खिड़की के लिए परिभाषित नहीं किया गया है ? यह तब तक समझ में नहीं आता जब तक कि आप इस बात पर विचार न करें कि डायलन to-string कॉल को कैसे संभालता है। अधिकांश भाषाओं में[which?] जब प्रोग्राम को संकलित किया जाता है तो <window> के लिए to-string को देखा जाता है और विधि के लिए एक पॉइंटर (अधिक या कम) के साथ प्रतिस्थापित किया जाता है। प्रतिस्थापित किया जाता है। डायलन में यह तब होता है जब प्रोग्राम पहली बार चलाया जाता है; रन टाइम प्रणाली विधि-नाम/पैरामीटर विवरण की तालिका बनाता है और इस तालिका के माध्यम से गतिशील रूप से विधियों को देखता है। इसका अर्थ है कि एक विशिष्ट विधि के लिए एक फ़ंक्शन कहीं भी स्थित हो सकता है, न कि केवल संकलन-समय इकाई में हो सकता है। अंत में प्रोग्रामर को अपने कोड को रखने के स्थिति में अधिक लचीलापन दिया जाता है, जहां उचित हो, और कार्यात्मक लाइनों के साथ इसे एकत्रित करना जहां यह नहीं है।

यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <string>s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी मूलभूत कक्षाएं संभवतः ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है spell-check मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे प्रयुक्त किया जा सकता है define method निर्माण। इस स्थिति में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब spell-check मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी।

एप्पल डायलन

एप्पल डायलन, एप्पल कंप्यूटरद्वारा निर्मित डायलन का कार्यान्वयन है। यह मूल रूप से एप्पल न्यूटन उत्पाद के लिए विकसित किया गया था।

संदर्भ

  1. Stokel-Walker, Chris. "Julia: The Goldilocks language". Increment. Stripe. Retrieved 23 August 2020.
  2. 2.0 2.1 Andrew Shalit; David Moon; Orca Starbuck (11 September 1996). The Dylan Reference Manual. Apple Press. Addison-Wesley. ISBN 9780201442113.


बाहरी संबंध