प्रथम श्रेणी फंक्शन
कंप्यूटर विज्ञान में, प्रोग्रामिंग भाषा को प्रथम श्रेणी के कार्यों वाला कहा जाता है यदि यह कार्य को प्रथम श्रेणी के विषय वस्तु के रूप में मानता है। इसका अर्थ यह है कि भाषा अन्य कार्यों के लिए तर्क के रूप में कार्यों को पारित करने, उन्हें अन्य कार्यों से मूल्यों के रूप में वापस करने और उन्हें चर को निर्दिष्ट करने या डेटा संरचनाओं में संग्रहीत करने का समर्थन करती है।[1] कुछ प्रोग्रामिंग भाषा सिद्धांतकारों को, अज्ञात कार्यों के लिए भी समर्थन की आवश्यकता होती है।[2] प्रथम श्रेणी के कार्यों वाली भाषाओं में, कार्यों के पहचानकर्ता (कंप्यूटर विज्ञान) की कोई विशेष स्थिति नहीं है, उन्हें कार्य प्रकार के साथ साधारण चर (कंप्यूटर विज्ञान) की तरह माना जाता है।[3] यह शब्द क्रिस्टोफर स्ट्रेची द्वारा 1960 के दशक के मध्य में प्रथम श्रेणी के विषय वस्तु के रूप में कार्यों के संदर्भ में बनाया गया था।[4]
कार्यात्मक प्रोग्रामिंग शैली के लिए प्रथम श्रेणी के कार्य आवश्यक हैं, जिसमें उच्च-क्रम के कार्यों का उपयोग एक मानक अभ्यास है। उच्च-क्रम वाले कार्य का एक सरल उदाहरण आलेखन कार्य है, जो इसके तर्कों, कार्यों और सूची के रूप में लेता है, और सूची के प्रत्येक सदस्य को कार्य लागू करके बनाई गई सूची देता है। एक भाषा के लिए आलेखन का समर्थन करने के लिए, उसे एक तर्क के रूप में कार्य को पारित करने का समर्थन करना चाहिए।
विशेष रूप से स्थिर कार्य और अनाम कार्य में प्रस्तुत किए गए गैर-स्थानीय चर की उपस्थिति में कार्यों को तर्कों के रूप में पारित करने या उन्हें परिणाम के रूप में वापस करने में कुछ कार्यान्वयन कठिनाइयाँ होती हैं। ऐतिहासिक रूप से, इन्हें फनर्ग की समस्या कहा जाता था, यह नाम कार्य तर्क से आता है।[5] प्रारंभिक अनिवार्य भाषाओं में इन समस्याओं को या तो परिणाम प्रकार (जैसे ऐल्गॉल 60, पारित्कल) के रूप में कार्यों का समर्थन न करने या स्थिर कार्यों और इस प्रकार गैर-स्थानीय चर (जैसे C) को छोड़ कर इन समस्याओं से बचा जा सकता था। शुरुआती कार्यात्मक भाषा लिस्प ने गतिशील कार्यक्षेत्र का दृष्टिकोण अपनाया, जहां गैर-स्थानीय चर उस चर की निकटतम परिभाषा को उस बिंदु पर संदर्भित करते हैं जहां कार्य को निष्पादित किया गया था, बजाय जहां इसे परिभाषित किया गया था। लेक्सिकली स्कोप्ड प्रथम श्रेणी के कार्यों के लिए उचित समर्थन स्कीम (प्रोग्रामिंग भाषा) में प्रस्तुत किया गया था और कार्यों के संदर्भों को अरक्षित कार्य सूचक के बजाय समापन (कंप्यूटर विज्ञान) के रूप में संभालने की आवश्यकता होती है,[4]जो बदले में अपशिष्ट संग्रह को एक आवश्यकता बनाता है।
अवधारणाएं
इस खंड में, हम तुलना करते हैं कि विशेष प्रोग्रामिंग अभिव्यक्ति एक कार्यात्मक भाषा में प्रथम श्रेणी के कार्यों (हास्केल) के साथ एक अनिवार्य भाषा की तुलना में कैसे संभाला जाता है जहां कार्य द्वितीय श्रेणी के विषय वस्तु (C प्रोग्रामिंग भाषा) हैं।
उच्च-क्रम के कार्य: तर्कों के रूप में कार्यों को पारित करना
उन भाषाओं में जहां कार्य प्रथम श्रेणी के विषय वस्तु हैं, कार्यों को अन्य मानों की तरह ही अन्य कार्यों के लिए तर्क के रूप में पारित किया जा सकता है। तर्क के रूप में किसी अन्य कार्य को लेने वाले कार्य को उच्च-क्रम कार्य कहा जाता है। हास्केल प्रोग्रामिंग भाषा में:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
भाषाएं जहां कार्य प्रथम श्रेणी के नहीं होते हैं, फिर भी कार्य सूचक या प्रतिनिधि (सीएलआई) जैसे सुविधाओं के उपयोग के माध्यम से उच्च-क्रम के कार्यों को लिखने की अनुमति देते हैं। सी प्रोग्रामिंग भाषा में:
void map(int (*f)(int), int x[], size_t n) {
for (int i = 0; i < n; i++)
x[i] = f(x[i]);
}
दो दृष्टिकोणों के बीच कई अंतर हैं जो सीधे प्रथम श्रेणी के कार्यों के समर्थन से संबंधित नहीं हैं। हास्केल प्रतिरूप सूची (कंप्यूटिंग) पर काम करता है, जबकि C प्रतिरूप सरणी डेटा संरचना पर काम करता है। दोनों संबंधित भाषाओं में सबसे प्राकृतिक यौगिक डेटा संरचनाएं हैं और C प्रतिरूप को संलग्न सूचियों पर संचालित करने से यह अनावश्यक रूप से जटिल हो जाता है। यह इस तथ्य के लिए भी जिम्मेदार है कि C कार्य को एक अतिरिक्त मापदंड(सरणी का आकार देते हुए) की आवश्यकता होती है। C कार्य सरणी को उसी स्थान पर नवीनतम करता है पर कोई मान नहीं लौटाता है, जबकि हास्केल डेटा संरचनाओं में निरंतर डेटा संरचना होती है जिसमे एक नई सूची वापस लौटा दिया जाता है जबकि पुराना बरकरार रहता है। हास्केल प्रतिरूप सूची को पार करने के लिए प्रत्यावर्तन का उपयोग करता है, जबकि सी प्रतिरूप पुनरावृत्ति का उपयोग करता है। पुनः, यह दोनों भाषाओं में इस कार्य को व्यक्त करने का सबसे स्वाभाविक तरीका है, लेकिन हास्केल प्रतिरूप आसानी से तह (उच्च-क्रम कार्य) और C प्रतिरूप प्रत्यावर्तन के संदर्भ में व्यक्त किया जा सकता था। अंत में, हास्केल कार्य में एक बहुरूपता है, क्योंकि यह C द्वारा समर्थित नहीं है, इसलिए सभी प्रकार के चर को स्थिरांक int
में स्थायी कर दिया गया है।
अनाम और स्थिर कार्य
अधिक जानकारी: अनाम कार्य और स्थिर कार्य
अज्ञात कार्यों का समर्थन करने वाली भाषाओं में, इस तरह के कार्य को उच्च-क्रम कार्य के तर्क के रूप में पारित किया जा सकता है:
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5]
ऐसी भाषा में जो अज्ञात कार्यों का समर्थन नहीं करती है, इसे इसके बजाय नाम से बांधना होगा:
int f(int x) {
return 3 * x + 1;
}
int main() {
int list[] = {1, 2, 3, 4, 5};
map(f, list, 5);
}
गैर-स्थानीय चर और समापन
एक बार जब हमारे पास अनाम या स्थिर कार्य होते हैं, तो उनके लिए अपने समुदाय के बाहर के चरों को संदर्भित करना स्वाभाविक हो जाता है जिन्हें गैर-स्थानीय चर कहा जाता है:
main = let a = 3
b = 1
in map (\x -> a * x + b) [1, 2, 3, 4, 5]
यदि कार्य को अरक्षित कार्य सूचकों के साथ दर्शाया जाता है, तो हम अब यह नहीं जान सकते हैं कि कार्य के समुदाय के बाहर का मान इसे कैसे पारित किया जाना चाहिए, और इसके कारण एक समापन को हस्तचालित रूप से बनाने की आवश्यकता होती है। इसलिए हम यहाँ प्रथम श्रेणी के कार्यों की बात नहीं कर सकते।
typedef struct {
int (*f)(int, int, int);
int *a;
int *b;
} closure_t;
void map(closure_t *closure, int x[], size_t n) {
for (int i = 0; i < n; ++i)
x[i] = (*closure->f)(*closure->a, *closure->b, x[i]);
}
int f(int a, int b, int x) {
return a * x + b;
}
void main() {
int l[] = {1, 2, 3, 4, 5};
int a = 3;
int b = 1;
closure_t closure = {f, &a, &b};
map(&closure, l, 5);
}
यह भी ध्यान दें किआलेखन
अब उनके पर्यावरण के बाहर दो int
से संबंधित कार्यों के लिए विशिष्ट है। इसे अधिक सामान्यतौर पर स्थापित किया जा सकता है, लेकिन इसके लिए अधिक बॉयलरप्लेट कोड की आवश्यकता होती है। अगर f
एक स्थिर कार्य होता तब भी उसी समस्या का सामना करना पड़ता और यही कारण है कि वे C में समर्थित नहीं हैं।[6]
उच्च-क्रम के कार्य: परिणाम के रूप में कार्य लौटाना
किसी कार्य को वापस करते समय, हम वास्तव में उसके समापन को वापस कर रहे हैं। जब हम समापन बनाने वाले कार्य से वापस आ जाएंगे तब C उदाहरण में समापन द्वारा अधिकृत कर लिया गया कोई भी स्थानीय चर लक्ष्य से बाहर हो जाएगा। बाद के बिंदु पर बंद करने के लिए मजबूर करने से अपरिभाषित व्यवहार होगा, संभवतः ढेर को दूषित कर देगा। इसे ऊपर की ओर फनर्ग समस्या के रूप में जाना जाता है।
चरों को कार्य सौंपना
चर(कंप्यूटर साइंस) को कार्य निर्दिष्ट करना और उन्हें (वैश्विक) डेटा संरचनाएं के अंदर संग्रहीत करने से संभावित रूप से रिटर्निंग कार्य के समान कठिनाइयों से पीड़ित होता है।
f :: [[Integer] -> [Integer]]
f = let a = 3
b = 1
in [map (\x -> a * x + b), map (\x -> b * x + a)]
कार्यों की समानता
जैसा कि कोई समानता के लिए अधिकांश शाब्दिक और उपयोगिता का परीक्षण कर सकता है, यह पूछना स्वाभाविक है कि क्या कोई प्रोग्रामिंग भाषा समानता के लिए परीक्षण कार्यों का समर्थन कर सकती है। आगे के निरीक्षण पर, यह प्रश्न अधिक कठिन प्रतीत होता है और व्यक्ति को कई प्रकार की कार्य समानता के बीच अंतर करना पड़ता है।[7]
- विस्तारात्मक समानता
- दो कार्य f और g को व्यापक रूप से समान माना जाता है यदि वे सभी निविष्ट (∀x. f(x) = g(x)) के लिए अपने उत्पादन पर सहमत होते है। उदाहरण के लिए, समानता की इस परिभाषा के अंतर्गत एक स्थिर प्रकार एल्गोरिथ्म के किसी भी दो कार्यान्वयन, जैसे कि सम्मिलन प्रकार और मर्ज प्रकार, को समान माना जाएगा। विस्तृत समानता पर निर्णय लेना सामान्य रूप से अनिर्णीत समस्या है और यहां तक कि परिमित कार्यक्षेत्र वाले कार्यों के लिए भी अक्सर कठिन होता है। इस कारण से कोई प्रोग्रामिंग भाषा कार्य समानता को विस्तारित समानता के रूप में लागू नहीं करती है।
- गहन समानता
- गहन समानता के अंतर्गत, दो फलन f और g को समान माना जाता है यदि उनकी आंतरिक संरचना समान हो। इस तरह की समानता व्याख्या की गई भाषाओं में कार्य निकायों के स्रोत कोड (जैसे व्याख्या किए गए लिस्प 1.5 में) या संकलित भाषाओं में वस्तु कोड की तुलना करके कार्यान्वित की जा सकती है। गहन समानता का तात्पर्य विस्तारात्मक समानता यह मानते हुए कि कार्य नियतात्मक हैं और उनमें कोई छिपा हुआ निविष्ट नहीं है, जैसे कि कार्यक्रम गणक या एक परिवर्तनशील वैश्विक चर से है।
- संदर्भ समानता
- विस्तारात्मक और गहन समानता को लागू करने की अव्यावहारिकता को देखते हुए, समानता के लिए परीक्षण कार्यों का समर्थन करने वाली अधिकांश भाषाएं संदर्भ समानता का उपयोग करती हैं। सभी कार्यों या समापन को एक अद्वितीय पहचानकर्ता (सामान्यतौर पर कार्य रचना या समापन का पता) निर्दिष्ट किया जाता है और पहचानकर्ता की समानता के आधार पर समानता तय की जाती है। दो अलग-अलग परिभाषित, लेकिन अन्यथा समान कार्य परिभाषाओं को असमान माना जाएगा। संदर्भपरक समानता का तात्पर्य गहन और विस्तारात्मक समानता से है। संदर्भात्मक समानता संदर्भित पारदर्शिता को तोड़ती है और इसलिए हास्केल जैसी शुद्ध भाषाओं में समर्थित नहीं है।
प्रकार सिद्धांत
प्रकार सिद्धांत में, प्रकार A के मानों को स्वीकार करने वाले कार्यों के प्रकार और प्रकार B के मान को वापस करने के लिए A → B या B A के रूप में लिखा जा सकता है। करी-हावर्ड पत्राचार में, प्रकार्य प्रकार तार्किक निहितार्थ से संबंधित हैं; लैम्ब्डा एब्स्ट्रैक्शन काल्पनिक मान्यताओं के निर्वहन से मेल खाता है और कार्य अनुप्रयोग मॉडस पोनेंस अनुमान नियम से मेल खाता है। प्रोग्रामिंग कार्य के सामान्य स्तिथियों के अतिरिक्त, टाइप थ्योरी भी सहयोगी सरणियों और समान डेटा संरचनाओं को प्रतिरूप करने के लिए प्रथम श्रेणी के कार्य का उपयोग करती है।
प्रोग्रामिंग के श्रेणी सिद्धांत गणना में, प्रथम श्रेणी के कार्यों की उपलब्धता बंद श्रेणी की धारणा से मेल खाती है। उदाहरण के लिए, केवल टाइप किया गया लैम्ब्डा कैलकुस कार्टेशियन बंद श्रेणी की आंतरिक भाषा के समान होता है।
भाषा समर्थन
कार्यात्मक प्रोग्रामिंग भाषाएं, जैसे एर्लांग, स्कीम, एमएल, हास्केल, एफ# और स्काला सभी में प्रथम श्रेणी के कार्य हैं। जब शुरुआती कार्यात्मक भाषाओं में से एक लिस्प को डिजाइन किया गया था, तब प्रथम श्रेणी के कार्यों के सभी पहलुओं को ठीक से नहीं समझा गया था, जिसके परिणामस्वरूप कार्यों को गतिशील रूप से लक्षित किया गया था। बाद की स्कीम और सामान्य लिस्प उपभाषाओं में प्रथम श्रेणी के कार्यों को शाब्दिक रूप से लक्षित किया गया था।
पर्ल, पायथन, पीएचपी, लुआ (प्रोग्रामिंग भाषा), टीसीएल / टीके, जावास्क्रिप्ट और आईओ सहित कई स्क्रिप्टिंग भाषाओं में प्रथम श्रेणी के कार्य हैं।
अनिवार्य भाषाओं के लिए, अल्गोल और उसके श्रेणियों जैसे पास्कल, पारंपरिक C श्रेणी और आधुनिक अपशिष्ट-संग्रहित रूपांतर के बीच अंतर करना पड़ता है। अल्गोल श्रेणी ने स्थिर कार्य और उच्च-क्रम लेने वाले कार्य को तर्कों के रूप में अनुमति दी है, लेकिन अल्गोल 68 को छोड़कर उच्च-क्रम वाले कार्य को अनुमति नहीं देता है जो परिणाम के रूप में कार्य लौटाते हैं। इसका कारण यह था कि पहले यह ज्ञात नहीं था कि यदि परिणाम के रूप में एक स्थिर कार्य लौटाया जाता है तो गैर-स्थानीय चर से कैसे समझौता करना है और ऐसी स्तिथियों में एल्गोल 68 रनटाइम त्रुटियाँ पैदा करता है।
C श्रेणी ने तर्कों के रूप में पारित होने वाले कार्यों और उन्हें परिणाम के रूप में वापस करने की अनुमति दी थी लेकिन स्थिर कार्यों का समर्थन न करके किसी भी समस्या से बचाव किया गया था। जीसीसी संकलनकर्ता उन्हें एक विस्तार के रूप में अनुमति देता है। चूंकि रिटर्निंग कार्य की उपयोगिता मुख्य रूप से स्थिर कार्य को वापस करने की क्षमता में निहित है, जो शीर्ष-स्तरीय कार्य के बजाय गैर-स्थानीय चर को अधीन कर लिया है, इन भाषाओं को सामान्यतौर पर पहले प्रथम श्रेणी कार्यों में नहीं माना जाता है।
आधुनिक अनिवार्य भाषाएं अक्सर अपशिष्ट-संग्रह का समर्थन करती हैं जिससे प्रथम श्रेणी के कार्यों का कार्यान्वयन संभव हो जाता है। प्रथम श्रेणी के कार्यों को अक्सर भाषा के बाद के संशोधनों में समर्थित किया गया है, जिसमें C# 2.0 और एप्पल के खंड विस्तार से C, C++ और ऑब्जेक्टिव -C सम्मिलित हैं। C++11 ने अनाम कार्यों और भाषा के बंद होने के लिए समर्थन जोड़ा है, लेकिन भाषा की गैर-अपशिष्ट एकत्र प्रकृति के कारण, परिणाम के रूप में लौटाए जाने वाले कार्यों में गैर-स्थानीय चर के लिए विशेष ध्यान रखना पड़ता है (नीचे देखें) );
भाषा | उच्च-क्रम के कार्य | नेस्टेड फ़ंक्शन | गैर-स्थानीय चर | टिप्पणियाँ | ||||
---|---|---|---|---|---|---|---|---|
बहस | परिणाम | नामांकित | अनाम | बंद | आंशिक आवेदन | |||
अल्गोल परिवार | एल्गोल 60 | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | फ़ंक्शन प्रकार हैं । |
एल्गोल 68 | हाँ | हाँ | हाँ | हाँ | नीचे की ओर | नहीं | ||
पास्कल | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | ||
एडीए | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | ||
ओबेरोन | हाँ | केवल गैर-नेस्टेड | हाँ | नहीं | नीचे की ओर | नहीं | ||
डेल्फी | हाँ | हाँ | हाँ | 2009 | 2009 | नहीं | ||
सी परिवार | सी | हाँ | हाँ | हाँ जीएनयू सी में | हाँ क्लैंग में ( ब्लॉक ) | हाँ क्लैंग में ( ब्लॉक ) | नहीं | फ़ंक्शन पॉइंटर्स हैं । |
सी++ | हाँ | हाँ | सी++11 | सी++11 | सी++11 | सी++11 | इसमें फ़ंक्शन पॉइंटर्स, फ़ंक्शन ऑब्जेक्ट हैं । (इसके अलावा, नीचे देखें।)
के साथ स्पष्ट आंशिक अनुप्रयोग संभव है | |
सी# | हाँ | हाँ | 7 | 2.0/3.0 | 2.0 | 3.0 | इसमें डेलीगेट्स (2.0) और लैम्ब्डा एक्सप्रेशन (3.0) हैं। | |
उद्देश्य सी | हाँ | हाँ | अनाम का उपयोग करना | 2.0 + ब्लॉक | 2.0 + ब्लॉक | नहीं | फ़ंक्शन पॉइंटर्स हैं. | |
जावा | हाँ | हाँ | अनाम का उपयोग करना | जावा 8 | जावा 8 | हाँ | अनाम आंतरिक कक्षाएं हैं । | |
जाना | हाँ | हाँ | अनाम का उपयोग करना | हाँ | हाँ | हाँ | ||
लीम्बो | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
न्यूज़वीक | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
जंग | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
कार्यात्मक भाषाएँ | तुतलाना | वाक्य - विन्यास | वाक्य - विन्यास | हाँ | हाँ | सामान्य लिस्प | नहीं | (नीचे देखें) |
योजना | हाँ | हाँ | हाँ | हाँ | हाँ | एसआरएफआई 26 | ||
जूलिया | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
क्लोजर | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
एमएल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
हास्केल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
jq | हाँ | नहीं | हाँ | केवल अभिव्यक्तियाँ | नीचे की ओर | नहीं | ||
स्काला | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
Erlang | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
एफ# | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
ओकैमल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
स्क्रिप्टिंग भाषाएँ | आईओ | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | |
जावास्क्रिप्ट | हाँ | हाँ | हाँ | हाँ | हाँ | ईसीएमएस्क्रिप्ट 5 | ES3 पर उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है | |
लुआ | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
पीएचपी | हाँ | हाँ | अनाम का उपयोग करना | 5.3 | 5.3 | नहीं | उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है। | |
पर्ल | हाँ | हाँ | 6 | हाँ | हाँ | 6 | ||
अजगर | हाँ | हाँ | हाँ | केवल अभिव्यक्तियाँ | हाँ | 2.5 | (नीचे देखें) | |
माणिक | वाक्य - विन्यास | वाक्य - विन्यास | अनस्कोप्ड | हाँ | हाँ | 1.9 | (नीचे देखें) | |
अन्य भाषाएं | फोरट्रान | हाँ | हाँ | हाँ | नहीं | नहीं | नहीं | |
मेपल | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
मेथेमेटिका | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
मतलब | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | नए कार्यों की स्वचालित पीढ़ी द्वारा आंशिक अनुप्रयोग संभव। | |
गपशप | हाँ | हाँ | हाँ | हाँ | हाँ | आंशिक | पुस्तकालय के माध्यम से आंशिक आवेदन संभव। | |
तीव्र | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ |
- सी ++
- सी ++ 11 समापन गैर-स्थानीय चर को प्रतिलिपि निर्माण, संदर्भ द्वारा (उनके जीवनकाल को बढ़ाए बिना), या स्थानांतरित निर्माण द्वारा (वेरिएबल तब तक रहता है जब तक समापन रहता है) अधीन कर सकता है। यदि समापन लौटाया जाता है तो पहला विकल्प सुरक्षित है लेकिन एक प्रतिलिपि की आवश्यकता होती है और इसका उपयोग मूल चर को संशोधित करने के लिए नहीं किया जा सकता है जो समापन कहे जाने के समय उपलब्ध नहीं हो सकता है। दूसरा विकल्प संभावित रूप से एक महंगी प्रतिलिपि से बचता है और मूल चर को संशोधित करने की अनुमति देता है लेकिन बंद होने की स्थिति में असुरक्षित है। तीसरा विकल्प सुरक्षित है अगर समापन लौटाया जाता है और प्रतिलिपि की आवश्यकता नहीं होती है लेकिन मूल चर को संशोधित करने के लिए भी इसका उपयोग नहीं किया जा सकता है।
- जावा
- जावा 8 समापन केवल अंतिम या प्रभावी रूप से अंतिम गैर-स्थानीय चर को अधीन कर सकते हैं। अनाम कार्य संदर्भ से अनुमानित प्रकार लेते हैं और जावा के कार्य प्रकारों को श्रेणियों के रूप में दर्शाया जाता है। विधि संदर्भ सीमित हैं।
- लिस्प
- लेक्सिकली लक्षित लिस्प रूपांतर समापन का समर्थन करता है। गतिशील रूप से लक्षित किए गए रूपांतर समापन का समर्थन नहीं करते हैं या समापन बनाने के लिए एक विशेष निर्माण की आवश्यकता होती है।[8]
- सामान्य लिस्प में, कार्य नेमस्पेस में कार्य के पहचानकर्ता को प्रथम श्रेणी के मान के संदर्भ के रूप में उपयोग नहीं किया जा सकता है।
function
कार्य को मान के रूप में पुनर्प्राप्त करने के लिए विशेष संचालिका का उपयोग किया जाना चाहिए:(function foo)
एक कार्य वस्तु का मूल्यांकन करता है।#'foo
आशुलिपि संकेतन के रूप में उपलब्ध है। इस तरह के कार्य वस्तु को लागू करने के लिए,funcall
कार्य(funcall #'foo bar baz)
का उपयोग करना चाहिए। - पाइथन
functools.partial
संस्करण 2.5 से औरoperator.methodcaller
संस्करण 2.6 से स्पष्ट आंशिक अनुप्रयोग।- रूबी
- रूबी (जो वास्तव में एक विधि है) में नियमित कार्य के पहचानकर्ता को मान के रूप में उपयोग या पारित नहीं किया जा सकता है। प्रथम श्रेणी डेटा के रूप में उपयोग करने के लिए इसे पहले किसी
Method
याProc
वस्तु में पुनर्प्राप्त किया जाना चाहिए। स्पष्ट रूप से स्थिर विधि परिभाषाएँ वास्तव में लक्ष्य को स्थिर नहीं करती हैं, ऐसे कार्य वस्तु को कॉल करने की संरचना अन्य नियमित तरीकों को कॉल करने से भिन्न होती है।[1]
.
यह भी देखें
- निष्क्रियता
- eval
- प्रथम श्रेणी का संदेश
- कप्पा कलन - एक औपचारिकता जो प्रथम श्रेणी के कार्यों को बाहर करती है
- आदमी या लड़का परीक्षण
- आंशिक आवेदन
टिप्पणियाँ
- ↑ Abelson, Harold; Sussman, Gerald Jay (1984). कंप्यूटर प्रोग्राम की संरचना और व्याख्या. MIT Press. Formulating Abstractions with Higher-Order Procedures. ISBN 0-262-01077-1.
- ↑ Programming language pragmatics, by Michael Lee Scott, section 11.2 "Functional Programming".
- ↑ Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes (2005). "The Implementation of Lua 5.0". Journal of Universal Computer Science. 11 (7): 1159–1176. doi:10.3217/jucs-011-07-1159.
- ↑ 4.0 4.1 Burstall, Rod; Strachey, Christopher (2000). "प्रोग्रामिंग भाषाओं को समझना" (PDF). Higher-Order and Symbolic Computation. 13 (52): 11–49. doi:10.1023/A:1010052305354. S2CID 1989590. Archived from the original on February 16, 2010.
{{cite journal}}
: CS1 maint: bot: original URL status unknown (link) (also on 2010-02-16 - ↑ Joel Moses. "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem". MIT AI Memo 199, 1970.
- ↑ "If you try to call the nested function through its address after the containing function has exited, all hell will break loose." (GNU Compiler Collection: Nested Functions)
- ↑ Andrew W. Appel (1995). "Intensional Equality ;=) for Continuations".
- ↑ Closures in ZetaLisp Archived 2012-03-19 at the Wayback Machine
संदर्भ
- Leonidas Fegaras. "Functional Languages and Higher-Order Functions". CSE5317/CSE4305: Design and Construction of Compilers. University of Texas at Arlington.