डायलन (प्रोग्रामिंग भाषा): Difference between revisions
No edit summary |
No edit summary |
||
Line 23: | Line 23: | ||
[[Julia (programming language)|Julia]]<ref name="goldilocks">{{cite web |last1=Stokel-Walker |first1=Chris |title=Julia: The Goldilocks language |url=https://increment.com/programming-languages/goldilocks-language-history-of-julia/ |website=Increment |publisher=Stripe |access-date=23 August 2020}}</ref> | [[Julia (programming language)|Julia]]<ref name="goldilocks">{{cite web |last1=Stokel-Walker |first1=Chris |title=Julia: The Goldilocks language |url=https://increment.com/programming-languages/goldilocks-language-history-of-julia/ |website=Increment |publisher=Stripe |access-date=23 August 2020}}</ref> | ||
}} | }} | ||
डायलन एक बहु-प्रतिमान | डायलन एक बहु-प्रतिमान [योजना ([[प्रोग्रामिंग भाषा]])] जिसमें [[कार्यात्मक प्रोग्रामिंग]] और [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] (ओओपी) के लिए समर्थन सम्मिलित है, और [[गतिशील प्रोग्रामिंग भाषा]] और [[प्रतिबिंब (कंप्यूटर प्रोग्रामिंग)]] है, जबकि कुशल मशीन कोड उत्पन्न करने के लिए डिज़ाइन किया गया एक प्रोग्रामिंग मॉडल प्रदान करता है, जिसमें ठीक- गतिशील और स्थिर व्यवहारों पर सूक्ष्म नियंत्रण सम्मिलित है। इसे 1990 के दशक की प्रारंभ में [[Apple Computer|एप्पल कंप्यूटर]] के नेतृत्व वाले एक समूह द्वारा बनाया गया था। | ||
डायलन स्कीम (प्रोग्रामिंग भाषा) और [[सामान्य लिस्प]] से निकला है और [[कॉमन लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट प्रणाली]] (क्लोस) से प्राप्त एक एकीकृत ऑब्जेक्ट प्रणाली जोड़ता है। डायलन में, सभी मान (संख्याओं, वर्णों, कार्यों और कक्षा (कंप्यूटर प्रोग्रामिंग) सहित) [[प्रथम श्रेणी की वस्तु]]एं हैं। डायलन [[एकाधिक वंशानुक्रम]], पॉलीमोर्फिज्म (कंप्यूटर साइंस), [[एकाधिक प्रेषण]], [[कीवर्ड तर्क]], वस्तु आत्मनिरीक्षण, [[पैटर्न मिलान]]-आधारित [[सिंटैक्टिक मैक्रो]]ज़ और कई अन्य उन्नत सुविधाओं का समर्थन करता है। कार्यक्रम गतिशीलता पर ठीक-ठाक नियंत्रण व्यक्त कर सकते हैं, उन कार्यक्रमों को स्वीकार कर सकते हैं जो गतिशील और स्थिर प्रोग्रामिंग के बीच निरंतरता रखते हैं और विकासवादी विकास का समर्थन करते हैं (वृद्धिशील शोधन और अनुकूलन के बाद तेजी से प्रोटोटाइप की अनुमति) होती है। | डायलन स्कीम (प्रोग्रामिंग भाषा) और [[सामान्य लिस्प]] से निकला है और [[कॉमन लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट प्रणाली]] (क्लोस) से प्राप्त एक एकीकृत ऑब्जेक्ट प्रणाली जोड़ता है। डायलन में, सभी मान (संख्याओं, वर्णों, कार्यों और कक्षा (कंप्यूटर प्रोग्रामिंग) सहित) [[प्रथम श्रेणी की वस्तु]]एं हैं। डायलन [[एकाधिक वंशानुक्रम]], पॉलीमोर्फिज्म (कंप्यूटर साइंस), [[एकाधिक प्रेषण]], [[कीवर्ड तर्क]], वस्तु आत्मनिरीक्षण, [[पैटर्न मिलान]]-आधारित [[सिंटैक्टिक मैक्रो]]ज़ और कई अन्य उन्नत सुविधाओं का समर्थन करता है। कार्यक्रम गतिशीलता पर ठीक-ठाक नियंत्रण व्यक्त कर सकते हैं, उन कार्यक्रमों को स्वीकार कर सकते हैं जो गतिशील और स्थिर प्रोग्रामिंग के बीच निरंतरता रखते हैं और विकासवादी विकास का समर्थन करते हैं (वृद्धिशील शोधन और अनुकूलन के बाद तेजी से प्रोटोटाइप की अनुमति) होती है। | ||
Line 29: | Line 29: | ||
डायलन का मुख्य डिजाइन लक्ष्य एक गतिशील भाषा बनना है जो व्यावसायिक सॉफ्टवेयर विकसित करने के लिए उपयुक्त है। डायलन [[लिस्प (प्रोग्रामिंग भाषा)]] प्रणाली के पूर्ण लचीलेपन के लिए प्राकृतिक सीमाओं को प्रस्तुत करके संभावित प्रदर्शन के विषयों को संबोधित करने का प्रयास करता है, जिससे [[संकलक]] को पुस्तकालय (कंप्यूटिंग) जैसी संकलित इकाइयों को स्पष्ट रूप से समझने की अनुमति मिलती है। | डायलन का मुख्य डिजाइन लक्ष्य एक गतिशील भाषा बनना है जो व्यावसायिक सॉफ्टवेयर विकसित करने के लिए उपयुक्त है। डायलन [[लिस्प (प्रोग्रामिंग भाषा)]] प्रणाली के पूर्ण लचीलेपन के लिए प्राकृतिक सीमाओं को प्रस्तुत करके संभावित प्रदर्शन के विषयों को संबोधित करने का प्रयास करता है, जिससे [[संकलक]] को पुस्तकालय (कंप्यूटिंग) जैसी संकलित इकाइयों को स्पष्ट रूप से समझने की अनुमति मिलती है। | ||
डायलन ने अपने शब्दार्थ को स्कीम और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन शुरू में उपस्थित लिस्प प्रणाली के अन्दर बनाए गए थे। चुकीं, डायलन में लिस्प-जैसे उपसर्ग | डायलन ने अपने शब्दार्थ को स्कीम और अन्य लिस्प्स से प्राप्त किया है; कुछ डायलन कार्यान्वयन शुरू में उपस्थित लिस्प प्रणाली के अन्दर बनाए गए थे। चुकीं, डायलन में लिस्प-जैसे उपसर्ग वाक्य-विन्यास के अतिरिक्त [[ALGOL|अल्गोल]] जैसा वाक्य-विन्यास है। | ||
== इतिहास == | == इतिहास == | ||
Line 40: | Line 40: | ||
डायलन भाषा का कोड-नाम राल्फ था। जेम्स जोआक्विन ने डायनामिक भाषा के लिए डायलन नाम चुना। | डायलन भाषा का कोड-नाम राल्फ था। जेम्स जोआक्विन ने डायनामिक भाषा के लिए डायलन नाम चुना। | ||
== | == वाक्य-विन्यास == | ||
डायलन की कई | डायलन की कई वाक्य-विन्यास विशेषताएं इसकी लिस्प विरासत से आती हैं। मूल रूप से, डायलन ने लिस्प-जैसे उपसर्ग वाक्य-विन्यास का उपयोग किया था, जो [[एस-अभिव्यक्ति]] पर आधारित था। जब तक भाषा का डिज़ाइन पूरा हो गया, तब तक वाक्य-विन्यास को अल्गोल जैसे वाक्य-विन्यास में बदल दिया गया था, इस उम्मीद के साथ कि यह प्रोग्रामर के व्यापक दर्शकों के लिए अधिक परिचित होगा। वाक्य-विन्यास माइकल कहल द्वारा डिजाइन किया गया था। डायलन रेफरेंस मैनुअल में इसका विस्तार से वर्णन किया गया है।<ref name="refman"/> | ||
=== [[शाब्दिक वाक्य रचना]] === | === [[शाब्दिक वाक्य रचना]] === | ||
डायलन [[मामले की संवेदनशीलता]] नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां [[हाइफन-ऋण]] | हाइफ़न (माइनस) संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी [[तुतलाना मामला]] या [[कबाब का मामला]] कहा जाता है) के | डायलन [[मामले की संवेदनशीलता|स्थिति की संवेदनशीलता]] नहीं है। डायलन का शाब्दिक वाक्य-विन्यास एक नामकरण सम्मेलन के उपयोग की अनुमति देता है जहां [[हाइफन-ऋण]] | हाइफ़न (माइनस) संकेतों का उपयोग बहु-शब्द पहचानकर्ताओं (कभी-कभी [[तुतलाना मामला|तुतलाना स्थिति]] या [[कबाब का मामला|कबाब का स्थिति]] कहा जाता है) के भागों को जोड़ने के लिए किया जाता है। लिस्प भाषाओं में यह सम्मेलन सामान्य है। | ||
अल्फ़ान्यूमेरिक वर्णों और हाइफ़न-माइनस संकेतों के | अल्फ़ान्यूमेरिक वर्णों और हाइफ़न-माइनस संकेतों के अतिरिक्त, डायलन पहचानकर्ताओं के भाग के रूप में विभिन्न प्रकार के गैर-अल्फ़ान्यूमेरिक वर्णों की अनुमति देता है। पहचानकर्ताओं में केवल ये गैर-[[अक्षरांकीय]] वर्ण सम्मिलित नहीं हो सकते हैं।<ref name="refman"/> यदि कोई अस्पष्टता है तो खाली स्थान का प्रयोग किया जाता है। | ||
=== उदाहरण कोड === | === उदाहरण कोड === | ||
कई स्लॉट के साथ एक साधारण वर्ग: | कई स्लॉट के साथ एक साधारण वर्ग:<syntaxhighlight> | ||
define class <point> (<object>) | |||
<वाक्यविन्यास प्रकाश लैंग = डायलन> | slot point-x :: <integer>, | ||
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>) | required-init-keyword: x:; | ||
स्लॉट पॉइंट-एक्स :: <पूर्णांक>, | slot point-y :: <integer>, | ||
required-init-keyword: y:; | |||
end class <point>; | |||
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | |||
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>)''' | |||
'''स्लॉट पॉइंट-एक्स :: <पूर्णांक>, | |||
आवश्यक-init-कीवर्ड: x:; | आवश्यक-init-कीवर्ड: x:; | ||
स्लॉट पॉइंट-वाई :: <पूर्णांक>, | स्लॉट पॉइंट-वाई :: <पूर्णांक>, | ||
आवश्यक-init-कीवर्ड: y:; | आवश्यक-init-कीवर्ड: y:;''' | ||
अंत वर्ग <बिंदु>; | '''अंत वर्ग <बिंदु>; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <code><point></code> कोड उदाहरण में। | परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <code><point></code> कोड उदाहरण में। | ||
Line 66: | Line 71: | ||
में <code>end class <point></code> दोनों <code>class</code> और <code><point></code> वैकल्पिक हैं। यह सभी के लिए सच है <code>end</code> खंड। उदाहरण के लिए, आप लिख सकते हैं <code>end if</code> या केवल <code>end</code> एक समाप्त करने के लिए <code>if</code> कथन। | में <code>end class <point></code> दोनों <code>class</code> और <code><point></code> वैकल्पिक हैं। यह सभी के लिए सच है <code>end</code> खंड। उदाहरण के लिए, आप लिख सकते हैं <code>end if</code> या केवल <code>end</code> एक समाप्त करने के लिए <code>if</code> कथन। | ||
का उदहारण बनाना है <code><point></code>: | का उदहारण बनाना है <code><point></code>:<syntaxhighlight> | ||
make(<point>, x: 100, y: 200) | |||
<वाक्यविन्यास प्रकाश लैंग = डायलन> | </syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | ||
बनाओ (<बिंदु>, एक्स: 100, वाई: 200) | बनाओ (<बिंदु>, एक्स: 100, वाई: 200) | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
एक ही वर्ग, सबसे कम संभव विधि से फिर से लिखा गया: | |||
<syntaxhighlight> | |||
define class <point> (<object>) | |||
slot point-x; | |||
slot point-y; | |||
end; | |||
</syntaxhighlight><syntaxhighlight> | |||
define class <point> (<object>) | |||
slot point-x; | |||
slot point-y; | |||
end; | |||
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | |||
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>)''' | |||
'''अंत; | |||
</वाक्यविन्यास हाइलाइट>''' | |||
<वाक्यविन्यास प्रकाश लैंग = डायलन> | स्लॉट अब दोनों टाइप किए गए हैं <code><object></code>. स्लॉट को मैन्युअल रूप से प्रारंभ किया जाना चाहिए:<syntaxhighlight> | ||
let p = make(<point>); | |||
point-x(p) := 100; // or p.point-x := 100; | |||
point-y(p) := 200; // or p.point-y := 200; | |||
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | |||
चलो पी = बनाओ (<बिंदु>); | चलो पी = बनाओ (<बिंदु>); | ||
बिंदु-एक्स(पी) := 100; // या p.point-x := 100; | बिंदु-एक्स(पी) := 100; // या p.point-x := 100; | ||
बिंदु-वाई (पी) := 200; // या p.point-y := 200; | बिंदु-वाई (पी) := 200; // या p.point-y := 200; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
परंपरा के अनुसार, निरंतर नाम $ से शुरू होते हैं: | परंपरा के अनुसार, निरंतर नाम $ से शुरू होते हैं:<syntaxhighlight> | ||
define constant $pi :: <double-float> = 3.1415927d0; | |||
<वाक्यविन्यास प्रकाश लैंग = डायलन> | </syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | ||
निरंतर $ पीआई परिभाषित करें :: <डबल-फ्लोट> = 3.1415927d0; | निरंतर $ पीआई परिभाषित करें :: <डबल-फ्लोट> = 3.1415927d0; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
एक फैक्टोरियल फ़ंक्शन: | एक फैक्टोरियल फ़ंक्शन:<syntaxhighlight> | ||
<वाक्यविन्यास प्रकाश लैंग = डायलन> | define function factorial (n :: <integer>) => (n! :: <integer>) | ||
फ़ंक्शन फ़ैक्टोरियल परिभाषित करें (n :: <पूर्णांक>) => (n! :: <पूर्णांक>) | case | ||
n < 0 => error("Can't take factorial of negative integer: %d\n", n); | |||
n = 0 => 1; | |||
otherwise => n * factorial(n - 1); | |||
end | |||
end; | |||
</syntaxhighlight>'''<वाक्यविन्यास प्रकाश लैंग = डायलन> | |||
फ़ंक्शन फ़ैक्टोरियल परिभाषित करें (n :: <पूर्णांक>) => (n! :: <पूर्णांक>)''' | |||
'''स्थिति | |||
n < 0 => त्रुटि (नकारात्मक पूर्णांक का भाज्य नहीं ले सकता: %d\n , n); | n < 0 => त्रुटि (नकारात्मक पूर्णांक का भाज्य नहीं ले सकता: %d\n , n); | ||
एन = 0 => 1; | एन = 0 => 1; | ||
अन्यथा => n * भाज्य (n - 1); | अन्यथा => n * भाज्य (n - 1); | ||
अंत | अंत''' | ||
अंत; | '''अंत; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
यहाँ, <code>n!</code> और <code><integer></code> सामान्य पहचानकर्ता हैं। | यहाँ, <code>n!</code> और <code><integer></code> सामान्य पहचानकर्ता हैं। | ||
Line 112: | Line 136: | ||
== मॉड्यूल बनाम नामस्थान == | == मॉड्यूल बनाम नामस्थान == | ||
कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, क्लास इनकैप्सुलेशन और मॉड्युलैरिटी का मुख्य साधन हैं; प्रत्येक वर्ग एक नामस्थान को परिभाषित करता है और नियंत्रित करता है कि कौन सी परिभाषाएँ बाहरी रूप से दिखाई देती हैं। इसके | कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, क्लास इनकैप्सुलेशन और मॉड्युलैरिटी का मुख्य साधन हैं; प्रत्येक वर्ग एक नामस्थान को परिभाषित करता है और नियंत्रित करता है कि कौन सी परिभाषाएँ बाहरी रूप से दिखाई देती हैं। इसके अतिरिक्त, कई भाषाओं में कक्षाएं एक अविभाज्य इकाई को परिभाषित करती हैं जिसका उपयोग समग्र रूप से किया जाना चाहिए। उदाहरण के लिए, ए का उपयोग करना <code>String</code> संयोजन समारोह में सभी के विरुद्ध आयात और संकलन की आवश्यकता होती है <code>String</code>. | ||
डायलन समेत कुछ भाषाओं में एक अलग, स्पष्ट नामस्थान या मॉड्यूल प्रणाली भी सम्मिलित है जो अधिक सामान्य | डायलन समेत कुछ भाषाओं में एक अलग, स्पष्ट नामस्थान या मॉड्यूल प्रणाली भी सम्मिलित है जो अधिक सामान्य विधि से कैप्सूलीकरण करता है। | ||
डायलन में, संकलन-इकाई और आयात-इकाई की अवधारणाओं को अलग किया गया है, और कक्षाओं का विशेष रूप से कोई लेना-देना नहीं है। एक पुस्तकालय उन वस्तुओं को परिभाषित करता है जिन्हें संकलित और एक साथ संभाला जाना चाहिए, जबकि एक मॉड्यूल एक नाम स्थान को परिभाषित करता है। कक्षाओं को मॉड्यूल में एक साथ रखा जा सकता है, या प्रोग्रामर की इच्छा के अनुसार उन्हें काट दिया जा सकता है। | डायलन में, संकलन-इकाई और आयात-इकाई की अवधारणाओं को अलग किया गया है, और कक्षाओं का विशेष रूप से कोई लेना-देना नहीं है। एक पुस्तकालय उन वस्तुओं को परिभाषित करता है जिन्हें संकलित और एक साथ संभाला जाना चाहिए, जबकि एक मॉड्यूल एक नाम स्थान को परिभाषित करता है। कक्षाओं को मॉड्यूल में एक साथ रखा जा सकता है, या प्रोग्रामर की इच्छा के अनुसार उन्हें काट दिया जा सकता है। अधिकांशतः एक वर्ग के लिए पूरी परिभाषा एक मॉड्यूल में वर्तमान नहीं होती है, लेकिन कई में फैली हुई है जो वैकल्पिक रूप से एक साथ एकत्र की जाती हैं। अलग-अलग कार्यक्रमों में एक ही वर्ग की अलग-अलग परिभाषाएँ हो सकती हैं, जिसमें केवल वही सम्मिलित है जिसकी उन्हें आवश्यकता है। | ||
उदाहरण के लिए, [[regex]] समर्थन के लिए ऐड-ऑन लाइब्रेरी पर विचार करें <code>String</code>. कुछ भाषाओं में, कार्यक्षमता को स्ट्रिंग्स में सम्मिलित करने के लिए, कार्यक्षमता को इसमें जोड़ा जाना चाहिए <code>String</code> नाम स्थान। ऐसा होते ही, द <code>String</code> वर्ग बड़ा हो जाता है, और जिन कार्यों को रेगेक्स का उपयोग करने की आवश्यकता नहीं होती है, उन्हें अभी भी बढ़े हुए पुस्तकालय आकार में इसके लिए भुगतान करना होगा। इस कारण से, इस प्रकार के ऐड-ऑन | उदाहरण के लिए, [[regex]] समर्थन के लिए ऐड-ऑन लाइब्रेरी पर विचार करें <code>String</code>. कुछ भाषाओं में, कार्यक्षमता को स्ट्रिंग्स में सम्मिलित करने के लिए, कार्यक्षमता को इसमें जोड़ा जाना चाहिए <code>String</code> नाम स्थान। ऐसा होते ही, द <code>String</code> वर्ग बड़ा हो जाता है, और जिन कार्यों को रेगेक्स का उपयोग करने की आवश्यकता नहीं होती है, उन्हें अभी भी बढ़े हुए पुस्तकालय आकार में इसके लिए भुगतान करना होगा। इस कारण से, इस प्रकार के ऐड-ऑन सामान्यतः उनके अपने नामस्थान और ऑब्जेक्ट में रखे जाते हैं। इस दृष्टिकोण का नकारात्मक पक्ष यह है कि नए कार्य अब इसका हिस्सा नहीं हैं <code>String</code>; इसके अतिरिक्त, यह अपने स्वयं के कार्यों के सेट में अलग-थलग है जिसे अलग से बुलाया जाना चाहिए। के अतिरिक्त <code>myString.parseWith(myPattern)</code>, जो OO के दृष्टिकोण से प्राकृतिक संगठन होगा, कुछ इस तरह <code>myPattern.parseString(myString)</code> का उपयोग किया जाता है, जो ऑर्डरिंग को प्रभावी ढंग से उलट देता है। | ||
डायलन के तहत, एक ही कोड के लिए कई इंटरफेस को परिभाषित किया जा सकता है, उदाहरण के लिए स्ट्रिंग कॉन्सटेनेशन विधि को स्ट्रिंग इंटरफेस और कॉन्सट इंटरफेस दोनों में रखा जा सकता है, जो विभिन्न वर्गों के सभी अलग-अलग कॉन्सटेनेशन कार्यों को एक साथ एकत्रित करता है। यह | डायलन के तहत, एक ही कोड के लिए कई इंटरफेस को परिभाषित किया जा सकता है, उदाहरण के लिए स्ट्रिंग कॉन्सटेनेशन विधि को स्ट्रिंग इंटरफेस और कॉन्सट इंटरफेस दोनों में रखा जा सकता है, जो विभिन्न वर्गों के सभी अलग-अलग कॉन्सटेनेशन कार्यों को एक साथ एकत्रित करता है। यह सामान्यतः गणित पुस्तकालयों में अधिक उपयोग किया जाता है, जहां कार्य व्यापक रूप से भिन्न वस्तु प्रकारों पर प्रयुक्त होते हैं। | ||
इंटरफ़ेस निर्माण का एक अधिक व्यावहारिक उपयोग एक मॉड्यूल के सार्वजनिक और निजी संस्करणों का निर्माण करना है, कुछ ऐसा जो अन्य भाषाओं में बोल्ट ऑन फीचर के रूप में सम्मिलित होता है जो हमेशा समस्याओं का कारण बनता है और | इंटरफ़ेस निर्माण का एक अधिक व्यावहारिक उपयोग एक मॉड्यूल के सार्वजनिक और निजी संस्करणों का निर्माण करना है, कुछ ऐसा जो अन्य भाषाओं में बोल्ट ऑन फीचर के रूप में सम्मिलित होता है जो हमेशा समस्याओं का कारण बनता है और वाक्य-विन्यास जोड़ता है। डायलन के तहत, प्रत्येक फ़ंक्शन कॉल को केवल निजी या विकास इंटरफ़ेस में रखा जा सकता है, और सार्वजनिक रूप से सुलभ कार्यों को एकत्र किया जा सकता है <code>Public</code>. [[जावा (प्रोग्रामिंग भाषा)]] या [[C++]] के तहत किसी वस्तु की दृश्यता को कोड में परिभाषित किया गया है, जिसका अर्थ है कि एक समान परिवर्तन का समर्थन करने के लिए, एक प्रोग्रामर को परिभाषाओं को पूरी तरह से फिर से लिखने के लिए मजबूर किया जाएगा, और एक ही समय में दो संस्करण नहीं हो सकते। | ||
== कक्षाएं == | == कक्षाएं == | ||
डायलन में कक्षाएं वर्णन करती हैं <code>slots</code> अधिकांश OO भाषाओं के समान एक फैशन में वस्तुओं के (डेटा सदस्य, फ़ील्ड, ivars, आदि)। स्मालटाक की तरह, स्लॉट तक सभी पहुंच विधियों के माध्यम से है। स्लॉट नामों के आधार पर डिफ़ॉल्ट गेट्टर और सेटर विधियाँ स्वचालित रूप से उत्पन्न होती हैं। अधिकांश अन्य ओओ भाषाओं के विपरीत, कक्षा के लिए | डायलन में कक्षाएं वर्णन करती हैं <code>slots</code> अधिकांश OO भाषाओं के समान एक फैशन में वस्तुओं के (डेटा सदस्य, फ़ील्ड, ivars, आदि)। स्मालटाक की तरह, स्लॉट तक सभी पहुंच विधियों के माध्यम से है। स्लॉट नामों के आधार पर डिफ़ॉल्ट गेट्टर और सेटर विधियाँ स्वचालित रूप से उत्पन्न होती हैं। अधिकांश अन्य ओओ भाषाओं के विपरीत, कक्षा के लिए प्रयुक्त अन्य विधियों को अधिकांशतः कक्षा के बाहर परिभाषित किया जाता है, और इस प्रकार डायलन में कक्षा परिभाषाओं में सामान्यतः केवल भंडारण की परिभाषा सम्मिलित होती है। उदाहरण के लिए:<syntaxhighlight> | ||
define class <window> (<view>) | |||
<वाक्यविन्यास लैंग = डायलन> | slot title :: <string> = "untitled", init-keyword: title:; | ||
slot position :: <point>, required-init-keyword: position:; | |||
end class; | |||
</syntaxhighlight><वाक्यविन्यास लैंग = डायलन> | |||
वर्ग परिभाषित करें <खिड़की> (<दृश्य>) | वर्ग परिभाषित करें <खिड़की> (<दृश्य>) | ||
स्लॉट शीर्षक :: <स्ट्रिंग> = शीर्षक रहित, init-कीवर्ड: शीर्षक:; | स्लॉट शीर्षक :: <स्ट्रिंग> = शीर्षक रहित, init-कीवर्ड: शीर्षक:; | ||
स्लॉट स्थिति :: <बिंदु>, आवश्यक-इनिट-कीवर्ड: स्थिति :; | स्लॉट स्थिति :: <बिंदु>, आवश्यक-इनिट-कीवर्ड: स्थिति :; | ||
अंत वर्ग; | '''अंत वर्ग; | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट>''' | ||
इस उदाहरण में, वर्ग<code><window></code>परिभाषित किया गया। <वर्ग का नाम> | इस उदाहरण में, वर्ग<code><window></code>परिभाषित किया गया। <वर्ग का नाम> वाक्य-विन्यास केवल सम्मेलन है, वर्ग के नाम को अलग करने के लिए - कोण कोष्ठक केवल वर्ग के नाम का हिस्सा हैं। इसके विपरीत, कुछ भाषाओं में परिपाटी वर्ग के नाम के पहले अक्षर को कैपिटलाइज़ करने या नाम के आगे C या T (उदाहरण के लिए) लगाने की है। <code><window></code> एक ही वर्ग से विरासत में मिला है, <code><view></code>, और इसमें दो स्लॉट हैं, <code>title</code> विंडो शीर्षक के लिए एक स्ट्रिंग पकड़ना, और <code>position</code> खिड़की के एक कोने के लिए एक XY बिंदु धारण करना। इस उदाहरण में, शीर्षक को डिफ़ॉल्ट मान दिया गया है, जबकि स्थिति को नहीं दिया गया है। वैकल्पिक init-कीवर्ड वाक्य-विन्यास प्रोग्रामर को क्लास के किसी ऑब्जेक्ट को इंस्टेंट करते समय स्लॉट के प्रारंभिक मान को निर्दिष्ट करने की अनुमति देता है। | ||
C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस | C++ या Java जैसी भाषाओं में, वर्ग अपने इंटरफ़ेस को भी परिभाषित करेगा। इस स्थिति में उपरोक्त परिभाषा में कोई स्पष्ट निर्देश नहीं है, इसलिए दोनों भाषाओं में स्लॉट और विधियों तक पहुंच पर विचार किया जाता है <code>protected</code>, जिसका अर्थ है कि उनका उपयोग केवल उपवर्गों द्वारा किया जा सकता है। असंबंधित कोड को विंडो उदाहरणों का उपयोग करने की अनुमति देने के लिए, उन्हें घोषित किया जाना चाहिए <code>public</code>. | ||
डायलन में, इस प्रकार के दृश्यता नियमों को कोड का हिस्सा नहीं माना जाता है, बल्कि मॉड्यूल/इंटरफ़ेस प्रणाली का हिस्सा माना जाता है। यह | डायलन में, इस प्रकार के दृश्यता नियमों को कोड का हिस्सा नहीं माना जाता है, बल्कि मॉड्यूल/इंटरफ़ेस प्रणाली का हिस्सा माना जाता है। यह अधिक लचीलापन जोड़ता है। उदाहरण के लिए, प्रारंभिक विकास के दौरान उपयोग किया जाने वाला एक इंटरफ़ेस सब कुछ सार्वजनिक घोषित कर सकता है, जबकि परीक्षण और परिनियोजन में उपयोग किया जाने वाला इंटरफ़ेस इसे सीमित कर सकता है। सी ++ या जावा के साथ इन परिवर्तनों के लिए स्रोत कोड में परिवर्तन की आवश्यकता होगी, इसलिए लोग ऐसा नहीं करेंगे, जबकि डायलन में यह पूरी तरह से असंबंधित अवधारणा है। | ||
चुकीं यह उदाहरण इसका उपयोग नहीं करता है, लेकिन डायलन भी कई वंशानुक्रम का समर्थन करता है। | चुकीं यह उदाहरण इसका उपयोग नहीं करता है, लेकिन डायलन भी कई वंशानुक्रम का समर्थन करता है। | ||
== | == विधि और सामान्य कार्य == | ||
डायलन में, विधियाँ आंतरिक रूप से किसी विशिष्ट वर्ग से संबद्ध नहीं हैं; विधियों को कक्षाओं के बाहर विद्यमान माना जा सकता है। सीएलओएस की तरह, डायलन मल्टीपल डिस्पैच (मल्टीमेथड्स) पर आधारित है, जहां बुलाए जाने वाले विशिष्ट | डायलन में, विधियाँ आंतरिक रूप से किसी विशिष्ट वर्ग से संबद्ध नहीं हैं; विधियों को कक्षाओं के बाहर विद्यमान माना जा सकता है। सीएलओएस की तरह, डायलन मल्टीपल डिस्पैच (मल्टीमेथड्स) पर आधारित है, जहां बुलाए जाने वाले विशिष्ट विधि को उसके सभी तर्कों के प्रकारों के आधार पर चुना जाता है। विधि को संकलित समय पर जानने की आवश्यकता नहीं है, यह समझ कि उपयोगकर्ता की प्राथमिकताओं के आधार पर आवश्यक फ़ंक्शन उपलब्ध हो सकता है या नहीं। | ||
जावा के तहत एक विशिष्ट वर्ग में समान विधियों को अलग किया जाएगा। उस कार्यक्षमता का उपयोग करने के लिए प्रोग्रामर को उस वर्ग को आयात करने और विधि को कॉल करने के लिए स्पष्ट रूप से संदर्भित करने के लिए मजबूर किया जाता है। यदि वह वर्ग अनुपलब्ध है, या संकलन समय पर अज्ञात है, तो एप्लिकेशन केवल संकलन नहीं करेगा। | जावा के तहत एक विशिष्ट वर्ग में समान विधियों को अलग किया जाएगा। उस कार्यक्षमता का उपयोग करने के लिए प्रोग्रामर को उस वर्ग को आयात करने और विधि को कॉल करने के लिए स्पष्ट रूप से संदर्भित करने के लिए मजबूर किया जाता है। यदि वह वर्ग अनुपलब्ध है, या संकलन समय पर अज्ञात है, तो एप्लिकेशन केवल संकलन नहीं करेगा। | ||
डायलन में, कोड को कार्यों में भंडारण से अलग किया जाता है। कई वर्गों में ऐसी विधियाँ होती हैं जो अपने स्वयं के कार्यों को बुलाती हैं, जिससे अधिकांश अन्य OO भाषाओं की तरह दिखती हैं और महसूस होती हैं। चुकीं कोड सामान्य कार्यों में भी स्थित हो सकते हैं, जिसका अर्थ है कि वे किसी विशिष्ट वर्ग से जुड़े नहीं हैं, और किसी के द्वारा मूल रूप से कहे जा सकते हैं। एक विशिष्ट सामान्य कार्य को एक वर्ग में एक विधि से जोड़ना इस प्रकार पूरा किया जाता है: | डायलन में, कोड को कार्यों में भंडारण से अलग किया जाता है। कई वर्गों में ऐसी विधियाँ होती हैं जो अपने स्वयं के कार्यों को बुलाती हैं, जिससे अधिकांश अन्य OO भाषाओं की तरह दिखती हैं और महसूस होती हैं। चुकीं कोड सामान्य कार्यों में भी स्थित हो सकते हैं, जिसका अर्थ है कि वे किसी विशिष्ट वर्ग से जुड़े नहीं हैं, और किसी के द्वारा मूल रूप से कहे जा सकते हैं। एक विशिष्ट सामान्य कार्य को एक वर्ग में एक विधि से जोड़ना इस प्रकार पूरा किया जाता है:<syntaxhighlight> | ||
define method turn-blue (w :: <window>) | |||
<वाक्यविन्यास लैंग = डायलन> | w.color := $blue; | ||
परिभाषित विधि टर्न-ब्लू (डब्ल्यू :: <खिड़की>) | end method; | ||
रंग: = $नीला; | </syntaxhighlight>'''<वाक्यविन्यास लैंग = डायलन> | ||
अंत विधि; | परिभाषित विधि टर्न-ब्लू (डब्ल्यू :: <खिड़की>)''' | ||
</वाक्यविन्यास हाइलाइट> | '''रंग: = $नीला;''' | ||
'''अंत विधि; | |||
</वाक्यविन्यास हाइलाइट>''' | |||
यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके अन्दर समाहित हो जाएगी <code><window></code> कक्षा। ध्यान दें := सेटर कॉल, जो [[सिंटैक्टिक चीनी]] के लिए है <code>color-setter($blue, w)</code>. | यह परिभाषा अन्य भाषाओं की परिभाषा के समान है, और संभवतः इसके अन्दर समाहित हो जाएगी <code><window></code> कक्षा। ध्यान दें := सेटर कॉल, जो [[सिंटैक्टिक चीनी]] के लिए है <code>color-setter($blue, w)</code>. | ||
Line 160: | Line 189: | ||
== एक्स्टेंसिबिलिटी == | == एक्स्टेंसिबिलिटी == | ||
यह पूरी अवधारणा कुछ पाठकों को बहुत अजीब लग सकती है। संभालने के लिए कोड <code>to-string</code> एक खिड़की के लिए परिभाषित नहीं किया गया है <code><window></code>? इसका कोई | यह पूरी अवधारणा कुछ पाठकों को बहुत अजीब लग सकती है। संभालने के लिए कोड <code>to-string</code> एक खिड़की के लिए परिभाषित नहीं किया गया है <code><window></code>? इसका कोई अर्थ नहीं हो सकता है जब तक कि आप इस बात पर विचार न करें कि डायलन कॉल को कैसे संभालता है <code>to-string</code>. अधिकांश भाषाओं में{{which|date=June 2013}} जब कार्यक्रम संकलित किया जाता है <code>to-string</code> के लिए <code><window></code> देखा जाता है और विधि में एक सूचक (अधिक या कम) के साथ प्रतिस्थापित किया जाता है। डायलन में यह तब होता है जब प्रोग्राम पहली बार चलाया जाता है; [[रन टाइम सिस्टम|रन टाइम प्रणाली]] विधि-नाम/पैरामीटर विवरण की तालिका बनाता है और इस तालिका के माध्यम से गतिशील रूप से विधियों को देखता है। इसका अर्थ है कि एक विशिष्ट विधि के लिए एक फ़ंक्शन कहीं भी स्थित हो सकता है, न कि केवल संकलन-समय इकाई में। अंत में प्रोग्रामर को अपने कोड को रखने के स्थिति में अधिक लचीलापन दिया जाता है, जहां उचित हो, और कार्यात्मक लाइनों के साथ इसे एकत्रित करना जहां यह नहीं है। | ||
यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <code><string></code>s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी | यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <code><string></code>s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी मूलभूत कक्षाएं संभवतः ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है <code>spell-check</code> मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे प्रयुक्त किया जा सकता है <code>define method</code> निर्माण। इस स्थिति में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब <code>spell-check</code> मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी। | ||
== एप्पल डायलन == | == एप्पल डायलन == | ||
{{main| | {{main|एप्पल डायलन}} | ||
एप्पल | |||
एप्पल डायलन, एप्पल कंप्यूटरद्वारा निर्मित डायलन का कार्यान्वयन है। यह मूल रूप से एप्पल न्यूटन उत्पाद के लिए विकसित किया गया था। | |||
==संदर्भ== | ==संदर्भ== |
Revision as of 11:31, 6 March 2023
File:Dylan logo.png | |
Paradigm | multi-paradigm: functional, object-oriented |
---|---|
Developer | Open Source Community Apple Computer, Harlequin, Carnegie Mellon University |
पहली प्रस्तुति | 1992 |
Stable release | 2022.1
/ November 28, 2022 |
टाइपिंग अनुशासन | Strong, gradual |
प्लेटफॉर्म | IA-32, x86-64 |
ओएस | Cross-platform |
फ़ाइल नाम एक्सटेंशनएस | dylan, lid |
वेबसाइट | opendylan |
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>;
<वाक्यविन्यास प्रकाश लैंग = डायलन>
परिभाषित वर्ग <बिंदु> (<ऑब्जेक्ट>)
स्लॉट पॉइंट-एक्स :: <पूर्णांक>, आवश्यक-init-कीवर्ड: x:; स्लॉट पॉइंट-वाई :: <पूर्णांक>, आवश्यक-init-कीवर्ड: y:;
अंत वर्ग <बिंदु>; </वाक्यविन्यास हाइलाइट>
परिपाटी के अनुसार, कक्षाओं को कोण कोष्ठक के रूप में उपयोग किए जाने वाले संकेतों से कम और अधिक से अधिक नामित किया जाता है, उदा। नामित वर्ग <point>
कोड उदाहरण में।
में end class <point>
दोनों class
और <point>
वैकल्पिक हैं। यह सभी के लिए सच है end
खंड। उदाहरण के लिए, आप लिख सकते हैं end if
या केवल end
एक समाप्त करने के लिए if
कथन।
का उदहारण बनाना है <point>
:
make(<point>, x: 100, y: 200)
<वाक्यविन्यास प्रकाश लैंग = डायलन>
बनाओ (<बिंदु>, एक्स: 100, वाई: 200) </वाक्यविन्यास हाइलाइट>
एक ही वर्ग, सबसे कम संभव विधि से फिर से लिखा गया:
define class <point> (<object>)
slot point-x;
slot point-y;
end;
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;
<वाक्यविन्यास प्रकाश लैंग = डायलन>
चलो पी = बनाओ (<बिंदु>); बिंदु-एक्स(पी) := 100; // या p.point-x := 100; बिंदु-वाई (पी) := 200; // या p.point-y := 200; </वाक्यविन्यास हाइलाइट>
परंपरा के अनुसार, निरंतर नाम $ से शुरू होते हैं:
define constant $pi :: <double-float> = 3.1415927d0;
<वाक्यविन्यास प्रकाश लैंग = डायलन>
निरंतर $ पीआई परिभाषित करें :: <डबल-फ्लोट> = 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 :: <पूर्णांक>) => (n! :: <पूर्णांक>)
स्थिति n < 0 => त्रुटि (नकारात्मक पूर्णांक का भाज्य नहीं ले सकता: %d\n , n); एन = 0 => 1; अन्यथा => n * भाज्य (n - 1); अंत
अंत; </वाक्यविन्यास हाइलाइट>
यहाँ, 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;
<वाक्यविन्यास लैंग = डायलन>
वर्ग परिभाषित करें <खिड़की> (<दृश्य>)
स्लॉट शीर्षक :: <स्ट्रिंग> = शीर्षक रहित, init-कीवर्ड: शीर्षक:; स्लॉट स्थिति :: <बिंदु>, आवश्यक-इनिट-कीवर्ड: स्थिति :;
अंत वर्ग; </वाक्यविन्यास हाइलाइट>
इस उदाहरण में, वर्ग<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?] जब कार्यक्रम संकलित किया जाता है to-string
के लिए <window>
देखा जाता है और विधि में एक सूचक (अधिक या कम) के साथ प्रतिस्थापित किया जाता है। डायलन में यह तब होता है जब प्रोग्राम पहली बार चलाया जाता है; रन टाइम प्रणाली विधि-नाम/पैरामीटर विवरण की तालिका बनाता है और इस तालिका के माध्यम से गतिशील रूप से विधियों को देखता है। इसका अर्थ है कि एक विशिष्ट विधि के लिए एक फ़ंक्शन कहीं भी स्थित हो सकता है, न कि केवल संकलन-समय इकाई में। अंत में प्रोग्रामर को अपने कोड को रखने के स्थिति में अधिक लचीलापन दिया जाता है, जहां उचित हो, और कार्यात्मक लाइनों के साथ इसे एकत्रित करना जहां यह नहीं है।
यहाँ निहितार्थ यह है कि एक प्रोग्रामर एक अलग फ़ाइल में फ़ंक्शन को परिभाषित करके उपस्थित कक्षाओं में कार्यक्षमता जोड़ सकता है। उदाहरण के लिए, हो सकता है कि आप सभी में वर्तनी जाँच जोड़ना चाहें <string>
s, जिसे C++ या Java में स्ट्रिंग क्लास के सोर्स कोड तक पहुंच की आवश्यकता होगी- और ऐसी मूलभूत कक्षाएं संभवतः ही कभी स्रोत के रूप में दी जाती हैं। डायलन (और अन्य एक्स्टेंसिबल भाषाओं) में वर्तनी जाँच विधि को इसमें जोड़ा जा सकता है spell-check
मॉड्यूल, उन सभी वर्गों को परिभाषित करता है जिन पर इसे प्रयुक्त किया जा सकता है define method
निर्माण। इस स्थिति में वास्तविक कार्यक्षमता को एकल सामान्य फ़ंक्शन में परिभाषित किया जा सकता है, जो एक स्ट्रिंग लेता है और त्रुटियां लौटाता है। जब spell-check
मॉड्यूल आपके प्रोग्राम में संकलित है, सभी स्ट्रिंग्स (और अन्य ऑब्जेक्ट्स) को अतिरिक्त कार्यक्षमता मिलेगी।
एप्पल डायलन
एप्पल डायलन, एप्पल कंप्यूटरद्वारा निर्मित डायलन का कार्यान्वयन है। यह मूल रूप से एप्पल न्यूटन उत्पाद के लिए विकसित किया गया था।
संदर्भ
- ↑ Stokel-Walker, Chris. "Julia: The Goldilocks language". Increment. Stripe. Retrieved 23 August 2020.
- ↑ 2.0 2.1 Andrew Shalit; David Moon; Orca Starbuck (11 September 1996). The Dylan Reference Manual. Apple Press. Addison-Wesley. ISBN 9780201442113.
बाहरी संबंध
- Official website, Open Dylan – hosts open source, optimizing Dylan compiler targeting Unix/Linux, macOS, Microsoft Windows
- Overview of the language
- An Introduction to Dylan
- एप्पल Dylan TR1
- The Marlais Dylan Interpreter – An implementation of a subset of Dylan, suitable for bootstrapping a compiler
- Dylan at Curlie