जेनेरिक फ़ंक्शन: Difference between revisions
m (Deepak moved page सामान्य कार्य to सामान्य फंक्शन without leaving a redirect) |
(Work done) |
||
Line 1: | Line 1: | ||
{{Distinguish|Generalized function}} | {{Distinguish|Generalized function}} | ||
[[कंप्यूटर प्रोग्रामिंग]] में, | [[कंप्यूटर प्रोग्रामिंग]] में, '''जेनेरिक फलन''' (फंक्शन) ऐसे फलन होता है जो [[बहुरूपता (कंप्यूटर विज्ञान)|पॉलीमॉरफिस्म]] (बहुरूपता) के लिए परिभाषित होता है। | ||
== | == स्थैतिक रूप से टाइप की गई भाषाओं में == | ||
स्थैतिक रूप से टाइप भाषाओं (जैसे [[सी++]] और [[जावा (प्रोग्रामिंग भाषा)|जावा]]) में, ''जेनेरिक फलन'' शब्द का उपयोग ''कॉंपाइल टाइम पॉलीमॉरफिस्म'' ([[स्थैतिक प्रेषण|स्थैतिक डिस्पैच]]), विशेष रूप से [[पैरामीट्रिक बहुरूपता|पैरामीट्रिक पॉलीमॉरफिस्म]] के लिए एक प्रक्रिया (मेकेनिज़्म) को संदर्भित करता है। ये [[टाइप पैरामीटर|टाइप पैरामीटर्स]] के साथ परिभाषित फलन होते हैं, जिन्हें [[संकलन समय|कॉंपाइल टाइम]] टाइप इनफार्मेशन के साथ हल किया जाना चाहिए। कंपाइलर किसी भी फलन ओवरलोडिंग को उचित रूप से हल करते हुए, उपयुक्त संस्करणों को शीघ्र प्रचलित के लिए इन टाइप्स का उपयोग करता है। | |||
== | == सामान्य लिस्प ऑब्जेक्ट सिस्टम में == | ||
[[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग ]] | कुछ [[ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग |ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] सिस्टम में, जैसे कि [[सामान्य लिस्प ऑब्जेक्ट सिस्टम|कॉमन लिस्प ऑब्जेक्ट सिस्टम]] (सीएलओएस)<ref>[http://www.dreamsongs.com/Files/ECOOP.pdf The Common Lisp Object System: An Overview]</ref> और [[डायलन (प्रोग्रामिंग भाषा)|डायलन]], जेनेरिक फलन एंटिटी होता है जिसमें सभी ऐसे नाम वाले मेथड्स सम्मिलित होते हैं। सामान्यतः जेनेरिक फलन एक क्लास का एक उदाहरण होता है जो फलन और स्टैण्डर्ड-ऑब्जेक्ट दोनों से प्राप्त होता है। इस प्रकार, ''जेनेरिक फलन'', ''फलन'' (जिन्हें आर्ग्यूमेंट्स के साथ कॉल और लागू किया जा सकता है) और ''स्टैंडर्ड-ऑब्जेक्ट्स'' होते हैं। मेटाऑब्जेक्ट प्रोटोकॉल की किताब "[[मेटाऑब्जेक्ट प्रोटोकॉल की कला|द आर्ट ऑफ़ द मेटाओबजेक्ट प्रोटोकॉल]]" विस्तार से सीएलओएस जेनेरिक फलन के अंतर्गत कार्यान्वयन और उपयोग की व्याख्या करती है। | ||
लिस्प के शुरुआती ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एक्सटेंशन में से एक फ्लेवर्स | लिस्प के शुरुआती ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग एक्सटेंशन में से एक फ्लेवर्स है। इसमें स्मॉलटॉक से प्रभावित सामान्य मैसेज भेजने की परियोजना का उपयोग किया गया। मैसेज भेजने के लिए फ्लेवर्स सिंटैक्स निम्नलिखित है: | ||
<syntaxhighlight lang="lisp"> | <syntaxhighlight lang="lisp"> | ||
(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> कॉमन लिस्प ऑब्जेक्ट सिस्टम के लिए नए फ्लेवर्स और कॉमनलूप्स मुख्य प्रभाव थे। | ||
== उदाहरण == | == उदाहरण == | ||
=== सामान्य लिस्प === | === सामान्य लिस्प === | ||
दो पैरामीटर ऑब्जेक्ट-1 और ऑब्जेक्ट-2 के साथ | एक जेनेरिक फलन को दो पैरामीटर ऑब्जेक्ट-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 49: | Line 48: | ||
=== अन्य भाषाओं से तुलना === | === अन्य भाषाओं से तुलना === | ||
जेनेरिक फ़ंक्शन | जेनेरिक फ़ंक्शन सामान्यतः स्मॉलटॉक की शर्तों के अनुरूप होते हैं, उल्लेखनीय अपवाद के साथ, स्मॉलटॉक में, रिसीवर की क्लास कोड का एकमात्र निर्धारक होती है: आर्ग्यूमेंट्स के मान अमान्य होते हैं ([[एकल प्रेषण|एकल डिस्पैच]])। किसी प्रोग्रामिंग भाषा में जो [[एकाधिक प्रेषण|एकाधिक डिस्पैच]] होते है, जब एक जेनेरिक फलन को कॉल किया जाता है, मेथड डिस्पैच सभी आर्ग्यूमेंट्स के आधार पर होता है, न कि केवल विशेषित आर्ग्यूमेंट के आधार पर। न्यू फ्लेवर्स भी जेनेरिक फलन प्रदान करते थे, लेकिन केवल एकल डिस्पैच। | ||
जावास्क्रिप्ट में, एक जेनेरिक फलन एक ऐसा फलन होता है जो एक विशिष्ट टाइप के बजाय विभिन्न टाइप के मानों के साथ कार्य कर सकता है। यह प्रकार के पैरामीटर्स के उपयोग के माध्यम से या संचालित किए जा रहे मूल्य के प्रकार की डायनामिक रूप से जांच करके प्राप्त किया जाता है। जावास्क्रिप्ट में जेनेरिक फलन के लिए सामान्य उपयोग की स्थिति पुन: प्रयोज्य फलन बनाना है जो विभिन्न डेटा टाइप्स, जैसे कि ऐरे, स्ट्रिंग या ऑब्जेक्ट के साथ कार्य कर सकते हैं। जावास्क्रिप्ट की डयनमिक टाइपिंग सिस्टम इसे जेनेरिक फलनों के निर्माण के लिए विशेष रूप से अनुकूल बनाती है, क्योंकि आवश्यकतानुसार मानों को सरलता से विशिष्ट टाइप्स में परिवर्तित किया जा सकता है। | |||
== संदर्भ == | == संदर्भ == | ||
{{Reflist}} | {{Reflist}} |
Revision as of 21:37, 8 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.