प्रथम श्रेणी के कार्य


11

मैंने इस सप्ताह के अंत में लिस्प पर गंभीरता से विचार करना शुरू कर दिया (जिसका अर्थ है कि मैं केवल लिस्प सीख रहा हूं और सी # में परियोजनाओं पर वापस नहीं लौट रहा हूं) और यह कहना चाहिए कि मैं इसे प्यार करता हूं। मैंने अन्य कार्यात्मक भाषाओं (F #, Haskell, Erlang) के साथ डब किया है, लेकिन मुझे लगता है कि लिस्प ने मुझे जो ड्रॉ दिया है, उसे महसूस नहीं किया है।

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

[संपादित करें] मैं अब तक की प्रतिक्रियाओं की सराहना करता हूं। चूंकि मुझे दिखाया गया है कि कई भाषाएं अब प्रथम श्रेणी के कार्यों का समर्थन करती हैं, इसलिए मैं इस प्रश्न को फिर से उद्धृत करूंगा कि भाषाओं को लागू करने में इतना समय क्यों लगेगा? [/ संपादित करें]


3
मैं असहमत हूं कि C # "समान चीजों" को कर सकता है। मैं कहूंगा कि इसमें सभी इरादों और उद्देश्यों के लिए प्रथम श्रेणी के कार्य हैं (जो आपके आधार को बर्बाद करते हैं)। यह फ़ंक्शन शाब्दिकों के लिए एक वाक्यविन्यास है, आप फ़ंक्शन को चर में सामान कर सकते हैं, आदि
लोगान कैपल्डो

@ लोगन - मैं इस बात पर बहस कर रहा था कि क्या सी # उदाहरण सहित लेकिन इस विकिपीडिया प्रविष्टि के आधार पर निर्णय लिया गया । प्रविष्टि के अनुसार, "तब से सत्य-प्रथम श्रेणी के कार्य नहीं होते हैं, क्योंकि जो वस्तुएं फ़ंक्शन की गतिशील स्थिति को रखती हैं उन्हें मैन्युअल रूप से निर्मित किया जाना चाहिए"। हालाँकि, अगर यह गलत कथन है, तो मुझे यह जानकर अच्छा लगेगा! (आखिरकार, मैं सीखने के लिए यहां हूं और मेरे तरीकों से नहीं फंसना चाहता!)
जेटी

2
विकिपीडिया प्रविष्टि पुरानी है। एक आधुनिक सी # एक उचित मेमने प्रदान करता है।
एसके-तर्क

मुझे लगता है कि पैराग्राफ खराब लिखा गया है। ऐसा लगता है कि C ++ फंक्शनलर्स प्रथम श्रेणी के नहीं हैं, और न ही C # डेलीगेट्स हैं? हालांकि मैं फंक्शंस के लिए तर्क से सहमत हो सकता हूं, मुझे यकीन नहीं है कि मैं सी # प्रतिनिधियों के लिए हूं। यह भी कहता है "(लैम्ब्डा लिफ्टिंग देखें)", जो इन भाषाओं के बारे में एक बयान है जो "मूल्यों" के बजाय लेक्सिकल क्लोजर का समर्थन करता है। आपके पास एक के बिना दूसरा हो सकता है। यहां तक ​​कि अगर यह मामला है, तो यह सी # के लिए सच नहीं है, इसमें लेक्सिकल क्लोजर हैं। समस्या का हिस्सा "प्रथम श्रेणी का कार्य" एक अस्पष्ट शब्द हो सकता है।
लोगान कैपल्डो

1
@ लोगन और एसके-लॉजिक - मैं आपकी प्रतिक्रिया और रचनात्मक रहने की सराहना करता हूं। मैं अभी भी सीख रहा हूं और यह बहुत अच्छा नहीं है कि मुझे लौटाया न जाए, इसलिए मैं इसकी सराहना करता हूं। टिप्पणी और जवाब के लिए बहुत बहुत धन्यवाद!
जेटी

जवाबों:


5

C #, VB.NET, पायथन, जावास्क्रिप्ट, अब भी C ++ 0x प्रथम श्रेणी के कार्य प्रदान करता है।

अपडेट करें:

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

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

ऐसी सभी अवधारणाओं को उद्योग द्वारा पचाने में समय लगता है।


मैंने प्रतिक्रियाओं के आधार पर मूल प्रश्न को संपादित किया है।
जेटी

प्रथम श्रेणी के कार्य! = बंद (और जीसी बाद के लिए बहुत अधिक आवश्यक है)। हालांकि, हां, वे निकटता से संबंधित हैं और आप शायद ही कभी, अगर कभी, उन्हें अलग-थलग देखें।

@ डेलीयन, कम से कम कुछ प्रकार के लेक्सिकल क्लोजर फ़ंक्शंस कंपोज़ेबल नहीं हैं और रन-टाइम में कंस्ट्रक्टेबल नहीं हैं, जो प्रथम श्रेणी के फ़ंक्शंस की परिभाषा के लिए अनिवार्य है।
तर्क

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

1
@ एसके-लॉजिक: C ++ 0x सामान्य चाल के साथ कचरा संग्रह के बिना क्लोजर प्रदान करता है -> यदि चर दायरे से बाहर हो जाता है और आप अभी भी संदर्भ से चिपके हुए हैं, तो संदर्भ का उपयोग अपरिभाषित व्यवहार है। तो यह संभव है ... यह सिर्फ डेवलपर पर मान डालता है।
मैथ्यू एम।

5

प्रथम श्रेणी के कार्य बंद किए बिना बहुत कम दिलचस्प हैं।

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

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

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

अधिकांश भाग के लिए काम करने के लिए भाषाएँ केवल do-hickeys से भरे टूल-सेट नहीं हैं। वे प्रतिमान हैं। विचारों, रणनीतियों और विचारों के बंडल जो एक तरह से जुड़े हुए हैं (या जुड़े हुए लगते हैं) के सभी प्रकार। बहुत सारे मामलों में संज्ञा और क्रिया के रूप में कार्य वास्तव में सिर्फ प्रतिमान को फिट नहीं करते हैं या सबसे अच्छे रूप में अपूर्ण हैं।

उस ने कहा, मुझे लगता है कि जब मैं उनके बिना कोड के लिए मजबूर किया गया तो मुझे एक हाथ याद आ रहा है।


आप या तो सभी तरीकों को सील कर सकते हैं या केवल उन लोगों को सील कर सकते हैं जिनकी आप सबसे अधिक देखभाल करते हैं, और आप ठीक हो जाएंगे।
अलेक्सई एवरचेंको

@AlexeiAverchenko मुझे यह कहते हुए खुशी हो रही है कि मैं 100% निश्चित नहीं हूं कि आप इसका क्या मतलब है। क्षमा करें, मुझे आपकी टिप्पणी याद आ गई। Googling "सील तरीके।"
एरिक रिपेन

4

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

यह भाषा के अन्य लक्ष्यों को प्राप्त करने के लिए कठिन बना सकता है:

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

एक ही नस में, कोई भी पूछ सकता है कि किसी भी प्रोग्रामिंग भाषा L1 में बहुत अलग भाषा L2 की सुविधा F क्यों नहीं है।


1

मुझे लगता है कि पहली समस्या एक गलतफहमी है कि ऑब्जेक्ट-ओरिएंटेड और फंक्शनल को मिश्रित नहीं किया जा सकता है। कम से कम विकिपीडिया द्वारा वर्णित भाषाओं की एक त्वरित सूची, दोनों के रूप में: जावास्क्रिप्ट , एक्शनस्क्रिप्ट , पायथन , सी # , एफ #

दूसरी समस्या प्रथम श्रेणी के कार्यों की परिभाषा प्रतीत होती है - आप उन्हें उदाहरण के लिए C # क्यों नहीं मानते हैं?

मैं एक कार्यात्मक भाषा विशेषज्ञ नहीं हूं, इसलिए यदि मैं गलत हूं, तो कृपया मुझे टिप्पणियों में सही करें, लेकिन मेरी समझ यह है कि प्रथम श्रेणी के कार्यों का समावेश कम या ज्यादा परिभाषित करता है कि क्या भाषा एक कार्यात्मक प्रतिमान का समर्थन करती है

असली सवाल क्या है?

तो, समझ है कि वस्तु उन्मुख भाषाओं कर सकते हैं भी चालू हो, और इन भाषाओं प्रथम श्रेणी के कार्य शामिल है, यह सवाल आप के लिए है देख रहे हैं की तरह लगता है कि क्यों कुछ वस्तु उन्मुख भाषाओं प्रथम श्रेणी के कार्य शामिल नहीं है?

कार्य अतिभार

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

public int dispatchEvent(Event event);
public int dispatchEvent(String event, Object data);

dispatchEventएक चर किस फ़ंक्शन का उल्लेख करेगा?

कक्षा-आधारित प्रोग्रामिंग

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

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

जब आप (गैर-गतिशील) कक्षाएं जोड़ते हैं, तो आपके पास ऐसे कार्य होते हैं जो स्वाभाविक रूप से एक उदाहरण के लिए बाध्य होते हैं , न कि केवल कक्षा के लिए। यह कुछ झुर्रियों को फेंकता है Function.applyकि मैं ईमानदारी से यह पता लगाने के लिए खोदा नहीं हूं कि उन्होंने कैसे निपटा है।


3
"प्रथम श्रेणी के कार्यों का समावेश कमोबेश भाषा को कार्यात्मक बनाता है।" - गलत। यह एक अच्छा है, हाँ। लेकिन इसके अलावा भी बहुत कुछ है, जैसे (केवल तीन का नाम लेना) परस्पर स्थिति से बचने के लिए, अनुक्रमिक बयानों के बजाय अभिव्यक्तियों और फ़ंक्शन अनुप्रयोग पर ध्यान केंद्रित करना और संदर्भात्मक पारदर्शिता पर जोर देना।

@delnan आपको सही विकिपीडिया पर जाना चाहिए ... जब तक कि "कार्यात्मक भाषा" और "कार्यात्मक प्रतिमान का समर्थन करने वाली भाषा" दो अलग-अलग चीजें नहीं हैं।
निकोल

1
@ रेंसिस: वे अलग-अलग चीजें हैं। आप C में ऑब्जेक्ट (जैसे vtables सहित) कुछ भी बना सकते हैं, लेकिन यह सुंदर नहीं है। "प्रथम श्रेणी के फ़ंक्शंस" से "फ़ंक्शनल लैंगज़ॉफ़" जाना काफी बुरा नहीं है, लेकिन फिर भी यह एक अंतर है। इसके अलावा, विकी (सही ढंग से) आपके द्वारा "इन सुविधाओं को कार्यात्मक प्रोग्रामिंग शैली […] के लिए एक आवश्यकता है से जुड़े पेज पर बताता है । (अर्थात: "डिफाइनिंग फीचर" नहीं) और एफपी पर पेज पर कई अन्य विशेषताओं को सूचीबद्ध करता है।

@delnan, ठीक है, मैंने अपने शब्दों को सही किया। मेरा मतलब सिर्फ एक भाषा के लिए एक कार्यात्मक प्रतिमान का समर्थन करने के रूप में माना जाना चाहिए - जैसा कि मैंने उन भाषाओं में से प्रत्येक के लिए विकिपीडिया पृष्ठ को बताया है। मेरे कहने का मतलब यह नहीं था कि यह सब कार्यात्मक प्रोग्रामिंग शैली का एक हिस्सा है ।
निकोल

0

मैंने खुद भी यही सोचा है। एक बार जब मैं लैम्बदास के साथ एक भाषा में होता हूं तो मैं उनका उपयोग करता हूं। यहां तक ​​कि PHP बेहतर हो जाता है जब आपको पता चलता है कि आप php 5.3 से बंद कर सकते हैं (यह लिस्प के रूप में अच्छा नहीं है, लेकिन फिर भी बेहतर है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.