फ़ंक्शन के नाम को निर्दिष्ट करके किस भाषा में रिटर्न वैल्यू सेट है?
इस स्टैक ओवरफ्लो प्रश्न में मूल कोड ने फ़ंक्शन नाम को एक चर के रूप में उपयोग करने की गलती की, और इसे वापसी मूल्य सौंपा। एक टिप्पणीकार ने उल्लेख किया कि उसने एक बार एक भाषा का उपयोग किया था, जहां यह वह तरीका था जिससे आपने फ़ंक्शन से मान लौटाया था। टिप्पणी में लिखा है, "मुझे पता है कि मैंने एक बार एक भाषा का इस्तेमाल किया था, जहां फ़ंक्शन के रिटर्न मान को फ़ंक्शन के नाम को सौंपा जाना चाहिए। यह इतना प्राचीन और अप्रचलित है कि मुझे यह भी याद नहीं है कि यह किस भाषा में था।"
यह मेरे लिए भी परिचित है, लेकिन मुझे यह भी याद नहीं है कि यह किस भाषा में थी।
क्या किसी के पास हमसे बेहतर स्मृति है और वह हमें बता सकता है कि यह कौन सी भाषा है?
जवाब
पास्कल ऐसा करता है, मुझे दूसरों का पता नहीं है। पता नहीं कि अभ्यास अन्य Wirth भाषाओं के साथ आगे बढ़ता है या नहीं।
विज़ुअल बेसिक परिवार की भाषाएँ ठीक यही करती हैं। इसमें VBScript, VBA, Visual Basic और पहले शामिल हैं। मेरा मानना है कि ये QBASIC की "विशेषता" हैं। उदाहरण के लिए
Public Function AddTwo(something as Integer)
AddTwo = something + 2
End Function
फोरट्रान, निश्चित रूप से:
PROGRAM TRIANG
WRITE(UNIT=*,FMT=*)'Enter lengths of three sides:'
READ(UNIT=*,FMT=*) SIDEA, SIDEB, SIDEC
WRITE(UNIT=*,FMT=*)'Area is ', AREA3(SIDEA,SIDEB,SIDEC)
END
FUNCTION AREA3(A, B, C)
*Computes the area of a triangle from lengths of sides
S = (A + B + C)/2.0
AREA3 = SQRT(S * (S-A) * (S-B) * (S-C))
END
(क्लाइव जी। पेज के पेशेवर प्रोग्रामर गाइड फोरट्रान77 से )।
यह फोरट्रान ANSI X 3.9 1966 फोरट्रान 66 मानक में भी इस तरह से परिभाषित किया गया है ।
सबसे पहले ऐसी भाषाएँ जो मुझे मिल सकती हैं वे हैं फोरट्रान II और ALGOL 58, दोनों एक ही वर्ष 1958 में प्रकाशित हुईं; हालांकि मूल फोरट्रान (1956) यकीनन शामिल किया जा सकता है।
FORTRAN के लिए, मैनुअल अध्याय को कवर करने वाले कार्यों के पहले पृष्ठ में यह उदाहरण है (पृष्ठ 27):
FUNCTION AVRG (ALIST, N)
DIMENSION ALIST (500)
SUM = ALIST (1)
DO 10 I=2, N
SUM = SUM + ALIST (I)
AVRG = SUM / FLOATF (N)
RETURN
END (2, 2, 2, 2, 2)
FORTRAN II में एक अन्य फ़ंक्शन सिंटैक्स (पृष्ठ 10), एकल-पंक्ति फ़ंक्शन परिभाषा, इसके पूर्ववर्ती से विरासत में मिला है:
FIRSTF(X) = A*X + B
यह देखना मुश्किल नहीं है कि पूर्व का वाक्य-विन्यास गणितीय उपयोग से आने वाले उत्तरार्द्ध का स्वाभाविक विस्तार है।
ALGOL 58 , फोरट्रान के समान, दोनों एकल-पंक्ति 'कार्यों' को परिभाषित करता है:
एक फ़ंक्शन घोषणा एक निश्चित अभिव्यक्ति को अपने चर के कुछ फ़ंक्शन के रूप में घोषित करती है। जिससे, जब भी यह फ़ंक्शन एक अभिव्यक्ति में प्रकट होता है, तो फ़ंक्शन (कुछ साधारण कार्यों के लिए) डिक्लेरेशन नियम (cf. फ़ंक्शन ) को मान प्रदान करने के लिए कंप्यूटिंग नियम देता है।
प्रपत्र:, ~ I n (I, I, ~, I): = E जहां मैं पहचानकर्ता हूं और E एक अभिव्यक्ति है, जिसके घटकों के बीच, कोष्ठक में दिखने वाले पहचानकर्ताओं द्वारा नामित सरल चर शामिल हो सकते हैं।
और 'प्रक्रियाएं', फ़ंक्शन की आज की परिभाषा के समान (अनिवार्य / प्रक्रियात्मक प्रोग्रामिंग भाषाओं में, कम से कम)। वापसी मान निम्नानुसार है (पृष्ठ 19):
शीर्षक में सूचीबद्ध प्रत्येक एकल आउटपुट प्रक्रिया I (P i ) के लिए, असाइनमेंट स्टेटमेंट "I: = E" द्वारा प्रक्रिया के भीतर एक मान निर्दिष्ट किया जाना चाहिए, जहां मैं उस प्रक्रिया का नामकरण करने वाला पहचानकर्ता हूं।
इन सिंटैक्स को बाद में BASIC की कुछ बोलियों ( DEF FN
बाद में और बाद में FUNCTION
) और ALGOL के वंशज पास्कल द्वारा लिया गया : बोरलैंड के पास्कल संकलक में, Result
डेल्फी 1.0 में वैरिएबल की शुरूआत से पहले फ़ंक्शन नाम को असाइन करना एकमात्र समर्थित सिंटैक्स था ।
यह शायद पास्कल है कि उल्लिखित टिप्पणीकार को याद किया गया; कुछ विश्वविद्यालय अभी भी इसमें प्रोग्रामिंग सिखाते हैं, और आमतौर पर ऑब्जेक्ट पास्कल जैसी आधुनिक विस्तारित बोलियों के बजाय मूल, मानक विविधता से चिपके रहते हैं। (यह वास्तव में सवाल का हिस्सा नहीं है, लेकिन मुझे लगता है कि StackOverflow पूछने वाले की गलतफहमी उसी से आई है।)
TL; DR:
मैं कहता हूँ, सबसे अधिक संभावना है कि यह आपको याद है, क्योंकि यह 80 के दशक की शुरुआत में लोकप्रिय था, विश्वविद्यालय के पाठ्यक्रमों में 90 के दशक में सभी 80 के दशक के रास्ते में इस्तेमाल किया गया था और अभी भी कुछ फैलोशिप के बाद, सबसे विशेष रूप से डेल्फी था।
कुछ इतिहास
मूल विचार यह है कि फ़ंक्शन नाम न केवल पहले से ही आरक्षित है, इसलिए अलग से कुछ भी आने की आवश्यकता नहीं है, और इसका उपयोग करना एक स्पष्ट कथन है कि यह परिणाम है। यह कंपाइलर डिज़ाइन को भी सरल बनाता है, क्योंकि कॉलिंग कन्वेंशन के भीतर एक समर्पित डेटा आइटम आवंटित किया जा सकता है।
विरासत, फोरट्रान और ALGOL की अनिवार्य रूप से दो लाइनें हैं।
दोनों के लिए उनके कुछ वंशजों ने इसे रखा, जैसे
- FORTRAN और से कुछ बुनियादी संस्करण
- ALGOL से पास्कल और मोडुला।
दूसरों ने इसे गिरा दिया, जैसे ALGOL फॉलो अप
- BCPL, जिसने
return()
वाक्य रचना पेश की ,
जो आज काफी सामान्य है क्योंकि C ने इसे BCPL से लिया था।
भाषा विचार मेजबान के बीच कूदते हुए जीन की तरह हैं। उदाहरण के लिए, एडीए, कई मायनों में एक ALGOL / PASCAL पोता, एक return
तत्व का उपयोग करने के लिए भी बदल गया ।
ग्रैंडडैडी फोरट्रान ने पिछले कुछ वर्षों में जिस तरह से फ़ंक्शन परिणाम लौटाए हैं, वह विविध है।
- मूल रूप से एक फ़ंक्शन का परिणाम फ़ंक्शन के पहचानकर्ता को सौंपा गया था
- फोरट्रान 90 के साथ फ़ंक्शन हेड में रिटर्न नाम की स्पष्ट परिभाषा पेश की गई थी।
जबकि यह अनिवार्य रूप से केवल वाक्यात्मक चीनी है, यह शैली में बदलाव की सुविधा देता है। लागू किया गया तर्क यह था कि पुनरावृत्ति के साथ निर्माण जैसे Foo = Foo(x-1)
अजीब लगेंगे। लेकिन मुझे लगता है कि व्याख्या तक है।
यहां दिलचस्प बात यह है कि 1958 के फोरट्रान II ने RETURN
प्रक्रियात्मक प्रोग्रामिंग को जोड़ने के लिए अपने प्रयास में एक बयान दिया था, लेकिन इसका उपयोग बस एक कॉलर को निष्पादन वापस करने के लिए किया गया था, वापसी मूल्य को अलग सेट करना पड़ा।
फोरट्रान ने इस सिंटैक्स का उपयोग किया है, शुरुआती संस्करण से, जिसके पास फ़ोर्टन 2008 और उसके बाद के सभी कार्य हैं।
हालाँकि, फोरट्रान 2008 में एक (और भी भ्रमित करने वाला?) विकल्प है जहाँ आप एक भिन्न चर नाम की घोषणा कर सकते हैं जिसका उपयोग फ़ंक्शन मान लौटाने के लिए किया जाता है! उदाहरण के लिए
function xyz(argument) result(answer)
...
answer = 42
...
end function xyz
पुरानी शैली के बजाय
...
xyz = 42
...
एक के लिए अल्गोल 60।
यहाँ एल्गोरिथम भाषा अल्गोल 60 पर संशोधित रिपोर्ट से प्रासंगिक शब्द दिए गए हैं ।
5.4.4। फ़ंक्शन डिज़ाइनर का मान।
एक प्रक्रिया डिज़ाइनर के मूल्य को परिभाषित करने के लिए एक प्रक्रिया घोषणा के लिए, प्रक्रिया घोषणा शरीर के भीतर, बाएं हिस्से में प्रक्रिया पहचानकर्ता के साथ एक या अधिक स्पष्ट असाइनमेंट स्टेटमेंट होने चाहिए; इनमें से कम से कम एक को निष्पादित किया जाना चाहिए, और प्रक्रिया पहचानकर्ता के साथ जुड़े प्रकार को घोषणा के बहुत पहले प्रतीक के रूप में एक प्रकार की घोषणाकर्ता के रूप में घोषित किया जाना चाहिए। असाइन किए गए अंतिम मान का उपयोग उस अभिव्यक्ति के मूल्यांकन को जारी रखने के लिए किया जाता है जिसमें फ़ंक्शन डिज़ाइनर होता है।
एक असाइनमेंट स्टेटमेंट में बाएं हिस्से के अलावा प्रक्रिया के शरीर के भीतर प्रक्रिया पहचानकर्ता की कोई भी घटना प्रक्रिया की सक्रियता को दर्शाती है।
अंतिम वाक्य महत्वपूर्ण है - यह दर्शाता है कि प्रकार प्रक्रिया (फ़ंक्शन) के नाम को प्रक्रिया (फ़ंक्शन) शरीर के भीतर एक चर की तरह 'व्यवहार' नहीं किया जाता है; बल्कि, यह केवल असाइनमेंट है जो विशेष आवरण है।
अल्गोल 60 में, एक फ़ंक्शन को कॉल करता है जो कोई तर्क नहीं लेता है, खाली कोष्ठक द्वारा पीछा नहीं किया जाता है: इस प्रकार के n := read
बजाय n := read()
।
अंतिम वाक्य उस वाक्य के रूप में भी प्रसिद्ध है जिसे भाषा में पुनरावर्ती प्रक्रियाएं मिलीं। लेकिन इस जवाब के लिए जर्मन नहीं है।
BASIC फ़ंक्शंस के साथ एक अन्य भाषा है, जहां कुछ बोलियों ने रिटर्न नाम प्रदान करने के लिए फ़ंक्शन नाम को असाइनमेंट का उपयोग किया है। शुरुआती बोलियाँ फोरट्रान सिंगल-लाइन फ़ंक्शन के समान थीं:
DEF FND(x) = x*x
लेकिन बाद में बोलियों ने फोरट्रान मल्टी-लाइन फ़ंक्शन के समान अधिक जटिल वेरिएंट की अनुमति दी :
DEF FNPeekWord& (A&)
FNPeekWord& = PEEK(A&) + 256& * PEEK(A& + 1)
END DEF
MATLAB / ऑक्टेव भी ऐसा करता है।
यह 1984 से है; तो दूसरों के रूप में के रूप में पुरानी नहीं है।
यह संभवतः फोरट्रान की नकल कर रहा था, क्योंकि यह एक उच्च-स्तरीय उपकरण के रूप में समरूप रूप से छुपा हुआ था। लिनपैक और आईपैक जैसी फोरट्रान पुस्तकालयों के शीर्ष पर।
मुझे विश्वास है कि SNOBOL4 ने ऐसा किया। http://berstis.com/greenbook.pdf
निम्नलिखित संख्याओं के भाज्य की गणना करने के लिए फ़ंक्शन की परिभाषा और उपयोग का एक उदाहरण है:
DEFINE('FACT(N)') :(SKIPFCN) * Set value to 1 FACT FACT = 1 * Return 1 if N<2 * Return N*((N-1)!) with recursive call FACT = GT(N,1) FACT(N - 1) * N :(RETURN) SKIPFCN OUTPUT = '5 factorial is ' FACT(5)
http://berstis.com/s4ref/prim3e.htm
Verilog (1995/2001) भी निहित चर को असाइनमेंट द्वारा लौटाता है। SystemVerilog ने "वापसी" कथन जोड़ा, लेकिन क्लासिक असाइनमेंट अभी भी उपलब्ध है।
हास्केल (1990 से) यह भी करता है:
doubleMe x = x + x
doubleMe
एक पैरामीटर के एक फंक्शन को परिभाषित x
करता है और फ़ंक्शन बॉडी x+x
को इसे असाइन करता है, ग्रेट लुक यू ए हास्केल फॉर ग्रेट गुड देखें
पास्कल वह है जिसका मैंने व्यक्तिगत रूप से उपयोग किया है। सामान्य लिस्प थोड़े-सॉर्टा-लेकिन-नहीं-वास्तव में यह करता है, उस रिटर्न मान में लगभग हमेशा निहित होता है (यानी हर बयान में एक मूल्य होता है, और एक ब्लॉक में अंतिम मान ब्लॉक का रिटर्न मान होता है), इसलिए आप बहुत कम ही देखते हैं एक स्पष्ट रिटर्न स्टेटमेंट, लेकिन जब आपको एक मूल्य वापस करने की आवश्यकता होती है और निहित तरीके का उपयोग नहीं कर सकता है, तो ऐसा करने का तरीका RETURN-FROM
[*] स्टेटमेंट का उपयोग करके है , जैसे (return-from function-name value)
:।
[*] इसमें एक RETURN
कथन भी है , लेकिन यह एक शॉर्टहैंड है (return-from nil value)
, और उस फ़ंक्शन के मूल्य को बनाने का प्रभाव नहीं होगा VALUE
जिसमें इसे निष्पादित किया गया था। यह सी और उसके वंशजों से आने वाले न्यूबॉक्स् के लिए एक बड़ा नुकसान है।