जेनेरिक फ़ंक्शन: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{Distinguish|सामान्यीकृत | {{Distinguish|सामान्यीकृत फ़ंक्शन}} | ||
[[कंप्यूटर प्रोग्रामिंग]] में, '''जेनेरिक | [[कंप्यूटर प्रोग्रामिंग]] में, '''जेनेरिक फ़ंक्शन''' (फंक्शन) ऐसे फ़ंक्शन होता है जो [[बहुरूपता (कंप्यूटर विज्ञान)|पॉलीमॉरफिस्म]] (बहुरूपता) के लिए परिभाषित होता है। | ||
== स्थैतिक रूप से टाइप की गई भाषाओं में == | == स्थैतिक रूप से टाइप की गई भाषाओं में == | ||
स्थैतिक रूप से टाइप भाषाओं (जैसे [[सी++]] और [[जावा (प्रोग्रामिंग भाषा)|जावा]]) में, ''जेनेरिक | स्थैतिक रूप से टाइप भाषाओं (जैसे [[सी++]] और [[जावा (प्रोग्रामिंग भाषा)|जावा]]) में, ''जेनेरिक फ़ंक्शन'' शब्द का उपयोग ''कॉंपाइल टाइम पॉलीमॉरफिस्म'' ([[स्थैतिक प्रेषण|स्थैतिक डिस्पैच]]), विशेष रूप से [[पैरामीट्रिक बहुरूपता|पैरामीट्रिक पॉलीमॉरफिस्म]] के लिए एक प्रक्रिया (मेकेनिज़्म) को संदर्भित करता है। ये [[टाइप पैरामीटर|टाइप पैरामीटर्स]] के साथ परिभाषित फ़ंक्शन होते हैं, जिन्हें [[संकलन समय|कॉंपाइल टाइम]] टाइप इनफार्मेशन के साथ हल किया जाना चाहिए। कंपाइलर किसी भी फ़ंक्शन ओवरलोडिंग को उचित रूप से हल करते हुए, उपयुक्त संस्करणों को शीघ्र प्रचलित के लिए इन टाइप्स का उपयोग करता है। | ||
== सामान्य लिस्प ऑब्जेक्ट सिस्टम में == | == सामान्य लिस्प ऑब्जेक्ट सिस्टम में == | ||
कुछ [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] सिस्टम में, जैसे कि [[सामान्य लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस)<ref>[http://www.dreamsongs.com/Files/ECOOP.pdf The Common Lisp Object System: An Overview]</ref> और [[डायलन (प्रोग्रामिंग भाषा)|डायलन]], जेनेरिक | कुछ [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] सिस्टम में, जैसे कि [[सामान्य लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस)<ref>[http://www.dreamsongs.com/Files/ECOOP.pdf The Common Lisp Object System: An Overview]</ref> और [[डायलन (प्रोग्रामिंग भाषा)|डायलन]], जेनेरिक फ़ंक्शन एंटिटी होता है जिसमें सभी ऐसे नाम वाले मेथड्स सम्मिलित होते हैं। सामान्यतः जेनेरिक फ़ंक्शन एक क्लास का एक उदाहरण होता है जो फ़ंक्शन और स्टैण्डर्ड-ऑब्जेक्ट दोनों से प्राप्त होता है। इस प्रकार, ''जेनेरिक फ़ंक्शन'', ''फ़ंक्शन'' (जिन्हें आर्ग्यूमेंट्स के साथ कॉल और लागू किया जा सकता है) और ''स्टैंडर्ड-ऑब्जेक्ट्स'' होते हैं। मेटाऑब्जेक्ट प्रोटोकॉल की किताब "[[मेटाऑब्जेक्ट प्रोटोकॉल की कला|द आर्ट ऑफ़ द मेटाओबजेक्ट प्रोटोकॉल]]" विस्तार से सीएलओएस जेनेरिक फ़ंक्शन के अंतर्गत कार्यान्वयन और उपयोग की व्याख्या करती है। | ||
लिस्प के शुरुआती ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एक्सटेंशन में से एक फ्लेवर्स है। इसमें स्मॉलटॉक से प्रभावित सामान्य मैसेज भेजने की परियोजना का उपयोग किया गया। मैसेज भेजने के लिए फ्लेवर्स सिंटैक्स निम्नलिखित है: | लिस्प के शुरुआती ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एक्सटेंशन में से एक फ्लेवर्स है। इसमें स्मॉलटॉक से प्रभावित सामान्य मैसेज भेजने की परियोजना का उपयोग किया गया। मैसेज भेजने के लिए फ्लेवर्स सिंटैक्स निम्नलिखित है: | ||
Line 14: | Line 14: | ||
(send object :message) | (send object :message) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
नए फ्लेवर्स के साथ, यह निर्णय लिया गया कि मैसेज एक वास्तविक | नए फ्लेवर्स के साथ, यह निर्णय लिया गया कि मैसेज एक वास्तविक फ़ंक्शन होना चाहिए और सामान्य फ़ंक्शन कॉलिंग सिंटैक्स का उपयोग किया जाना चाहिए: | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
(message object) | (message object) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
''मैसेज'' अब स्वयं में एक ''जेनेरिक | ''मैसेज'' अब स्वयं में एक ''जेनेरिक फ़ंक्शन'', ऑब्जेक्ट और फ़ंक्शन होता है। ''मैसेज'' के भिन्न-भिन्न कार्यान्वयन को ''मेथड्स'' कहा जाता है। | ||
[[कॉमनलूप्स]] में भी यही विचार लागू किया गया था।<ref>{{Cite web |url=http://www2.parc.com/istl/groups/gir/papers/stefik-commonloops-oopsla66.pdf |title=कॉमनलूप्स, लिस्प और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को मर्ज करना|access-date=2009-12-10 |archive-url=https://web.archive.org/web/20110604013117/http://www2.parc.com/istl/groups/gir/papers/stefik-commonloops-oopsla66.pdf |archive-date=2011-06-04 |url-status=dead }}</ref> कॉमन लिस्प ऑब्जेक्ट सिस्टम के लिए नए फ्लेवर्स और कॉमनलूप्स मुख्य प्रभाव थे। | [[कॉमनलूप्स]] में भी यही विचार लागू किया गया था।<ref>{{Cite web |url=http://www2.parc.com/istl/groups/gir/papers/stefik-commonloops-oopsla66.pdf |title=कॉमनलूप्स, लिस्प और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को मर्ज करना|access-date=2009-12-10 |archive-url=https://web.archive.org/web/20110604013117/http://www2.parc.com/istl/groups/gir/papers/stefik-commonloops-oopsla66.pdf |archive-date=2011-06-04 |url-status=dead }}</ref> कॉमन लिस्प ऑब्जेक्ट सिस्टम के लिए नए फ्लेवर्स और कॉमनलूप्स मुख्य प्रभाव थे। | ||
Line 26: | Line 26: | ||
=== सामान्य लिस्प === | === सामान्य लिस्प === | ||
एक जेनेरिक | एक जेनेरिक फ़ंक्शन को दो पैरामीटर ऑब्जेक्ट-1 और ऑब्जेक्ट-2 के साथ परिभाषित करें। जेनेरिक फ़ंक्शन का नाम ''कोलाइड'' है। | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
(defgeneric collide (object-1 object-2)) | (defgeneric collide (object-1 object-2)) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
जेनेरिक | जेनेरिक फ़ंक्शन से संबंधित मेथड्स क्लासेज़ के बाहर परिभाषित होते हैं। यहाँ हम जेनेरिक फ़ंक्शन ''कोलाइड'' के लिए एक मेथड परिभाषित करते हैं जो एस्टरॉइड (पहले पैरामीटर ऑब्जेक्ट-1) और स्पेसशिप (दूसरे पैरामीटर ऑब्जेक्ट-2) के लिए विशेषित किया गया है। पैरामीटर्स को मेथड बॉडी के भीतर नॉर्मल वेरिएबल मानक के रूप में उपयोग किया जाता है। क्लास स्लॉट्स तक पहुंच वाले कोई विशेष नेमस्पेस नहीं होता है। | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
(defmethod collide ((object-1 asteroid) (object-2 spaceship)) | (defmethod collide ((object-1 asteroid) (object-2 spaceship)) | ||
(format t "asteroid ~a collides with spaceship ~a" object-1 object-2)) | (format t "asteroid ~a collides with spaceship ~a" object-1 object-2)) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
जेनेरिक | जेनेरिक फ़ंक्शन को कॉल करना: | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
? (collide (make-instance 'asteroid) (make-instance 'spaceship)) | ? (collide (make-instance 'asteroid) (make-instance 'spaceship)) | ||
asteroid #<ASTEROID 4020003FD3> collides with spaceship #<SPACESHIP 40200048CB> | asteroid #<ASTEROID 4020003FD3> collides with spaceship #<SPACESHIP 40200048CB> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
कॉमन लिस्प जेनेरिक | कॉमन लिस्प जेनेरिक फ़ंक्शन से विशिष्ट मेथड को भी पुनः प्राप्त कर सकते है। FIND-METHOD जेनेरिक फ़ंक्शन ''कोलाइड'' के लिए ''एस्टरॉइड'' और ''स्पेसशिप'' के लिए विशेषित किया गया मेथड को खोजता है। | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
? (find-method #'collide nil (list (find-class 'asteroid) (find-class 'spaceship))) | ? (find-method #'collide nil (list (find-class 'asteroid) (find-class 'spaceship))) | ||
Line 48: | Line 48: | ||
=== अन्य भाषाओं से तुलना === | === अन्य भाषाओं से तुलना === | ||
जेनेरिक फ़ंक्शन सामान्यतः स्मॉलटॉक की शर्तों के अनुरूप होते हैं, उल्लेखनीय अपवाद के साथ, स्मॉलटॉक में, रिसीवर की क्लास कोड का एकमात्र निर्धारक होती है: आर्ग्यूमेंट्स के मान अमान्य होते हैं ([[एकल प्रेषण|एकल डिस्पैच]])। किसी प्रोग्रामिंग भाषा में जो [[एकाधिक प्रेषण|एकाधिक डिस्पैच]] होते है, जब एक जेनेरिक | जेनेरिक फ़ंक्शन सामान्यतः स्मॉलटॉक की शर्तों के अनुरूप होते हैं, उल्लेखनीय अपवाद के साथ, स्मॉलटॉक में, रिसीवर की क्लास कोड का एकमात्र निर्धारक होती है: आर्ग्यूमेंट्स के मान अमान्य होते हैं ([[एकल प्रेषण|एकल डिस्पैच]])। किसी प्रोग्रामिंग भाषा में जो [[एकाधिक प्रेषण|एकाधिक डिस्पैच]] होते है, जब एक जेनेरिक फ़ंक्शन को कॉल किया जाता है, मेथड डिस्पैच सभी आर्ग्यूमेंट्स के आधार पर होता है, न कि केवल विशेषित आर्ग्यूमेंट के आधार पर। न्यू फ्लेवर्स भी जेनेरिक फ़ंक्शन प्रदान करते थे, लेकिन केवल एकल डिस्पैच। | ||
जावास्क्रिप्ट में, एक जेनेरिक | जावास्क्रिप्ट में, एक जेनेरिक फ़ंक्शन एक ऐसा फ़ंक्शन होता है जो एक विशिष्ट टाइप के बजाय विभिन्न टाइप के मानों के साथ कार्य कर सकता है। यह प्रकार के पैरामीटर्स के उपयोग के माध्यम से या संचालित किए जा रहे मूल्य के प्रकार की डायनामिक रूप से जांच करके प्राप्त किया जाता है। जावास्क्रिप्ट में जेनेरिक फ़ंक्शन के लिए सामान्य उपयोग की स्थिति पुन: प्रयोज्य फ़ंक्शन बनाना है जो विभिन्न डेटा टाइप्स, जैसे कि ऐरे, स्ट्रिंग या ऑब्जेक्ट के साथ कार्य कर सकते हैं। जावास्क्रिप्ट की डयनमिक टाइपिंग सिस्टम इसे जेनेरिक फ़ंक्शनों के निर्माण के लिए विशेष रूप से अनुकूल बनाती है, क्योंकि आवश्यकतानुसार मानों को सरलता से विशिष्ट टाइप्स में परिवर्तित किया जा सकता है। | ||
== संदर्भ == | == संदर्भ == | ||
{{Reflist}} | {{Reflist}} |
Revision as of 16:55, 11 July 2023
कंप्यूटर प्रोग्रामिंग में, जेनेरिक फ़ंक्शन (फंक्शन) ऐसे फ़ंक्शन होता है जो पॉलीमॉरफिस्म (बहुरूपता) के लिए परिभाषित होता है।
स्थैतिक रूप से टाइप की गई भाषाओं में
स्थैतिक रूप से टाइप भाषाओं (जैसे सी++ और जावा) में, जेनेरिक फ़ंक्शन शब्द का उपयोग कॉंपाइल टाइम पॉलीमॉरफिस्म (स्थैतिक डिस्पैच), विशेष रूप से पैरामीट्रिक पॉलीमॉरफिस्म के लिए एक प्रक्रिया (मेकेनिज़्म) को संदर्भित करता है। ये टाइप पैरामीटर्स के साथ परिभाषित फ़ंक्शन होते हैं, जिन्हें कॉंपाइल टाइम टाइप इनफार्मेशन के साथ हल किया जाना चाहिए। कंपाइलर किसी भी फ़ंक्शन ओवरलोडिंग को उचित रूप से हल करते हुए, उपयुक्त संस्करणों को शीघ्र प्रचलित के लिए इन टाइप्स का उपयोग करता है।
सामान्य लिस्प ऑब्जेक्ट सिस्टम में
कुछ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग सिस्टम में, जैसे कि कॉमन लिस्प ऑब्जेक्ट सिस्टम (सीएलओएस)[1] और डायलन, जेनेरिक फ़ंक्शन एंटिटी होता है जिसमें सभी ऐसे नाम वाले मेथड्स सम्मिलित होते हैं। सामान्यतः जेनेरिक फ़ंक्शन एक क्लास का एक उदाहरण होता है जो फ़ंक्शन और स्टैण्डर्ड-ऑब्जेक्ट दोनों से प्राप्त होता है। इस प्रकार, जेनेरिक फ़ंक्शन, फ़ंक्शन (जिन्हें आर्ग्यूमेंट्स के साथ कॉल और लागू किया जा सकता है) और स्टैंडर्ड-ऑब्जेक्ट्स होते हैं। मेटाऑब्जेक्ट प्रोटोकॉल की किताब "द आर्ट ऑफ़ द मेटाओबजेक्ट प्रोटोकॉल" विस्तार से सीएलओएस जेनेरिक फ़ंक्शन के अंतर्गत कार्यान्वयन और उपयोग की व्याख्या करती है।
लिस्प के शुरुआती ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एक्सटेंशन में से एक फ्लेवर्स है। इसमें स्मॉलटॉक से प्रभावित सामान्य मैसेज भेजने की परियोजना का उपयोग किया गया। मैसेज भेजने के लिए फ्लेवर्स सिंटैक्स निम्नलिखित है:
(send object :message)
नए फ्लेवर्स के साथ, यह निर्णय लिया गया कि मैसेज एक वास्तविक फ़ंक्शन होना चाहिए और सामान्य फ़ंक्शन कॉलिंग सिंटैक्स का उपयोग किया जाना चाहिए:
(message object)
मैसेज अब स्वयं में एक जेनेरिक फ़ंक्शन, ऑब्जेक्ट और फ़ंक्शन होता है। मैसेज के भिन्न-भिन्न कार्यान्वयन को मेथड्स कहा जाता है।
कॉमनलूप्स में भी यही विचार लागू किया गया था।[2] कॉमन लिस्प ऑब्जेक्ट सिस्टम के लिए नए फ्लेवर्स और कॉमनलूप्स मुख्य प्रभाव थे।
उदाहरण
सामान्य लिस्प
एक जेनेरिक फ़ंक्शन को दो पैरामीटर ऑब्जेक्ट-1 और ऑब्जेक्ट-2 के साथ परिभाषित करें। जेनेरिक फ़ंक्शन का नाम कोलाइड है।
(defgeneric collide (object-1 object-2))
जेनेरिक फ़ंक्शन से संबंधित मेथड्स क्लासेज़ के बाहर परिभाषित होते हैं। यहाँ हम जेनेरिक फ़ंक्शन कोलाइड के लिए एक मेथड परिभाषित करते हैं जो एस्टरॉइड (पहले पैरामीटर ऑब्जेक्ट-1) और स्पेसशिप (दूसरे पैरामीटर ऑब्जेक्ट-2) के लिए विशेषित किया गया है। पैरामीटर्स को मेथड बॉडी के भीतर नॉर्मल वेरिएबल मानक के रूप में उपयोग किया जाता है। क्लास स्लॉट्स तक पहुंच वाले कोई विशेष नेमस्पेस नहीं होता है।
(defmethod collide ((object-1 asteroid) (object-2 spaceship))
(format t "asteroid ~a collides with spaceship ~a" object-1 object-2))
जेनेरिक फ़ंक्शन को कॉल करना:
? (collide (make-instance 'asteroid) (make-instance 'spaceship))
asteroid #<ASTEROID 4020003FD3> collides with spaceship #<SPACESHIP 40200048CB>
कॉमन लिस्प जेनेरिक फ़ंक्शन से विशिष्ट मेथड को भी पुनः प्राप्त कर सकते है। FIND-METHOD जेनेरिक फ़ंक्शन कोलाइड के लिए एस्टरॉइड और स्पेसशिप के लिए विशेषित किया गया मेथड को खोजता है।
? (find-method #'collide nil (list (find-class 'asteroid) (find-class 'spaceship)))
#<STANDARD-METHOD COLLIDE NIL (ASTEROID SPACESHIP) 4150015E43>
अन्य भाषाओं से तुलना
जेनेरिक फ़ंक्शन सामान्यतः स्मॉलटॉक की शर्तों के अनुरूप होते हैं, उल्लेखनीय अपवाद के साथ, स्मॉलटॉक में, रिसीवर की क्लास कोड का एकमात्र निर्धारक होती है: आर्ग्यूमेंट्स के मान अमान्य होते हैं (एकल डिस्पैच)। किसी प्रोग्रामिंग भाषा में जो एकाधिक डिस्पैच होते है, जब एक जेनेरिक फ़ंक्शन को कॉल किया जाता है, मेथड डिस्पैच सभी आर्ग्यूमेंट्स के आधार पर होता है, न कि केवल विशेषित आर्ग्यूमेंट के आधार पर। न्यू फ्लेवर्स भी जेनेरिक फ़ंक्शन प्रदान करते थे, लेकिन केवल एकल डिस्पैच।
जावास्क्रिप्ट में, एक जेनेरिक फ़ंक्शन एक ऐसा फ़ंक्शन होता है जो एक विशिष्ट टाइप के बजाय विभिन्न टाइप के मानों के साथ कार्य कर सकता है। यह प्रकार के पैरामीटर्स के उपयोग के माध्यम से या संचालित किए जा रहे मूल्य के प्रकार की डायनामिक रूप से जांच करके प्राप्त किया जाता है। जावास्क्रिप्ट में जेनेरिक फ़ंक्शन के लिए सामान्य उपयोग की स्थिति पुन: प्रयोज्य फ़ंक्शन बनाना है जो विभिन्न डेटा टाइप्स, जैसे कि ऐरे, स्ट्रिंग या ऑब्जेक्ट के साथ कार्य कर सकते हैं। जावास्क्रिप्ट की डयनमिक टाइपिंग सिस्टम इसे जेनेरिक फ़ंक्शनों के निर्माण के लिए विशेष रूप से अनुकूल बनाती है, क्योंकि आवश्यकतानुसार मानों को सरलता से विशिष्ट टाइप्स में परिवर्तित किया जा सकता है।
संदर्भ
- ↑ The Common Lisp Object System: An Overview
- ↑ "कॉमनलूप्स, लिस्प और ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग को मर्ज करना" (PDF). Archived from the original (PDF) on 2011-06-04. Retrieved 2009-12-10.