संख्यात्मक फ़ंक्शन नाम की अनुमति क्यों नहीं है?


10

निम्नलिखित को धयान मे रखते हुए:

$ ksh -c '1(){ echo hi;};1'
ksh: 1: invalid function name
$ dash -c '1(){ echo hi;};1'
dash: 1: Syntax error: Bad function name
$ bash -c '1(){ echo hi;};1'
bash: `1': not a valid identifier
bash: 1: command not found
$ mksh -c '1(){ echo hi;};1'
hi

असल में, मैं कार्यों की घोषणा करने के कोशिश कर रहा था 1और 0जिसके लिए shorthands होगा trueऔर false, लेकिन जैसा कि आप देख सकते हैं मैं कार्यों में संख्यात्मक नामों का उपयोग कर के साथ समस्या हुई थी। उपनाम और दो अंकों के नामों के साथ समान व्यवहार होता है।

प्रश्न "क्यों" है? क्या यह POSIX द्वारा अनिवार्य है? या सिर्फ बोर्न-जैसा गोले का एक क्विक?

इससे संबंधित प्रश्न भी देखें ।


1
पॉज़िक्स द्वारा अनिवार्य होने वाली चीजें ज्यादातर बॉर्न जैसे गोले के कुछ समय की होती हैं। : पी
मुरु

आपने वहां क्या किया वह मैने देखा । । । > :) लोल
सेर्गेई कोलोडियाज़नी

4
@fkraiem कृपया meta.askubuntu.com/q/13807/295286 गोले / शेल स्क्रिप्टिंग देखें और हमेशा पूछो Ubuntu पर विषय पर रहे हैं :) यह किसी भी उबंटू प्रणाली के उचित प्रणाली प्रशासन के लिए एक आवश्यक विषय है
सर्गी कोलोडियाज़नी

4
यह है कि ध्यान देने योग्य 0है trueशेल पटकथा लेखन में और 1है false(वास्तव में, किसी भी गैर शून्य गलत माना जाता है) के मामले किसी को भी पढ़ने के लिए इस अनजान है में,। यह अधिकांश अन्य प्रोग्रामिंग भाषाओं से पीछे की ओर है।
एथन कमिंसकी

2
@EtKK विटामिन्सकी हाँ, जहाँ तक कमांडों के बाहर निकलने की स्थिति है , यह बिल्कुल सच है। 0 का रिटर्न मान trueशेल में है। हालाँकि, अंकगणितीय विस्तार में $((...))रिटर्न स्टेटस फ़्लिप किया जाता है - 1 है trueऔर 0 falseसी-भाषा सिंटैक्स के साथ संगति के लिए है। उदाहरण के लिए प्रयास करें bash -c 'echo $((1==1));echo $((1==2))' कि मैं इस प्रश्न के बाहर क्या करने की कोशिश कर रहा था वास्तव में व्यवहार "उल्टा" था। मेरे उत्तर पर अंतिम उदाहरण यहां देखें कि वास्तव में मैं क्या करने की कोशिश कर रहा था। मूर्खतापूर्ण विचार, लेकिन फिर भी काम करता है
सर्जियो कोलोडियाज़नी

जवाबों:


14

POSIX कहता है:

2.9.5 फंक्शन डेफिनिशन कमांड

एक फ़ंक्शन एक उपयोगकर्ता-परिभाषित नाम है जिसका उपयोग एक साधारण कमांड के रूप में नए स्थितीय मापदंडों के साथ एक कंपाउंड कमांड को कॉल करने के लिए किया जाता है। एक फ़ंक्शन को "फ़ंक्शन डेफिनिशन कमांड" के साथ परिभाषित किया गया है।

एक फंक्शन डेफिनिशन कमांड का प्रारूप इस प्रकार है:

 fname ( ) compound-command [io-redirect ...]

फ़ंक्शन का नाम fname है ; आवेदन यह सुनिश्चित करेगा कि यह एक नाम है (XBD नाम देखें ) और यह एक विशेष अंतर्निहित उपयोगिता का नाम नहीं है। एक कार्यान्वयन एक फ़ंक्शन नाम में अन्य वर्णों को विस्तार के रूप में अनुमति दे सकता है। कार्यान्वयन कार्यों और चर के लिए अलग-अलग नाम स्थान बनाए रखेगा।

तथा:

३.२३५ नाम

शेल कमांड लैंग्वेज में, एक ऐसा शब्द, जिसमें पोर्टेबल चरित्र सेट से केवल अंडरस्कोर, अंक और वर्णमाला होते हैं। नाम का पहला वर्ण कोई अंक नहीं है।

नोट: पोर्टेबल कैरेक्टर सेट को पोर्टेबल कैरेक्टर सेट में विस्तार से परिभाषित किया गया है।

इसलिए अंक के साथ शुरू होने वाला शब्द एक फ़ंक्शन नाम नहीं हो सकता है।


अभी भी POSIX काफी क्यों नहीं कहता है, लेकिन मैं इसे "क्योंकि मानकों" के उत्तर के रूप में लूंगा। धन्यवाद
सर्गी Kolodyazhnyy

4
@SergiyKolodyazhnyy मैं कहूँगा कि यह एक विरासत में मिली चीज़ है। नामों के लिए यह मानक अन्य चीजों में भी काफी सामान्य है (IIRC C नाम भी उसी मानक का पालन करते हैं), इसलिए शायद यह एक यूनीसेक्स है। इसके अलावा, सी में, यह आसान बनाता है पार्स करने के लिए
muru

3
अगर यह अनुमति दी गई थी तो @ एमयू सी में यह कुछ अस्पष्टता लाएगा। जैसे क्या 1Lमतलब होगा ? एक समारोह का नाम? या एक long intशाब्दिक?
रुस्लान

2
ऊपर जोड़ना, यह ध्यान देने योग्य है कि सी में, एक नंगे फ़ंक्शन नाम उस फ़ंक्शन के लिए एक सूचक के रूप में कार्य कर सकता है। यह आपको फ़ंक्शन के मापदंडों के रूप में कार्य करने की अनुमति देता है, चर में उनके संदर्भ स्टोर करता है, आदि अक्सर कॉलबैक के लिए उपयोग किया जाता है। इसके बाद फ़ंक्शन के नाम के विपरीत (), संभवतः अंदर के तर्कों के साथ, जो प्रश्न में फ़ंक्शन के लिए एक कॉल को दर्शाता है (और उस मूल्य पर ले जाता है जिसे फ़ंक्शन द्वारा कॉल किया जाता है)। इसलिए यदि आपके पास int f() { return 42; }C में एक फ़ंक्शन है, fतो एक पॉइंटर संदर्भ f()में मान्य है , और एक नॉन-पॉइंटर, पूर्णांक संदर्भ में मान्य है।
बजे एक CVn

13

गणितीय संचालन और चर या कार्यों या विधियों के बीच भ्रम को रोकने के लिए कई भाषाओं में यह एक मानक है।

विचार करें:

var 1 = 100

print 1*10 //should return 10 but would instead return 1000

var x = 5
x += 1
print x //returns 105, not 6    

def 100(num)
  return num * 1000
end

var y = 10 + 100(10)
print y // returns 100010 instead of 1010

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

संक्षेप में, यही कारण है कि अधिकांश भाषाएं आपको एक संख्या का उपयोग करने की अनुमति नहीं देती हैं जैसे कि एक चर या फ़ंक्शन या विधि या आदि।


मैं टिप्पणी करने जा रहा था "लेकिन शेल में चरों को $विस्तारित किए जाने के लिए पहले से तैयार होने की आवश्यकता होती है " लेकिन फिर अगर शेल अन्य भाषाओं से प्रेरित होता है, तो ठीक है, मुझे लगता है कि अंकगणितीय विस्तार ((चर में अग्रणी होने की आवश्यकता नहीं है $। ठीक है, मैं समझ सकता हूँ कि
सर्जियो कोलोडियाज़नी

3
हां, यह एक कन्वेंशन है क्योंकि यह लगभग हर भाषा में अप्रत्याशित परिणाम देगा, लेकिन, यहां तक ​​कि ऐसी स्थिति में जहां यह काम करेगा, यह आपके लिए कोड के बाद काम करना बहुत मुश्किल बना सकता है, जिन्हें आपके कोड पर काम करना होगा।
जोश

2
@SergiyKolodyazhnyy अंकगणित विस्तार बिना चर नामों को संदर्भित करने की अनुमति देता है $, इसलिए ऐसा है। लेकिन यह शायद "सिर्फ आम सम्मेलन के बाद" के अन्य कारण के लिए द्वितीयक है
हॉबस

@ होब्स हां, बिल्कुल इस बात से सहमत हैं
सर्जियो कोलोडियाज़नी

1
यह "अधिकांश भाषा" स्पष्टीकरण गोले के लिए बहुत कम समझ में आता है। सभी बॉर्न शैली गोले मापदंडों जिसका नाम है की तरह लग रहे सांख्यिक शाब्दिक या ऑपरेटरों: 0खोल या स्क्रिप्ट नाम के लिए, 1, 2, ..., स्थितीय मापदंडों के लिए, *उनके लिए शामिल हो गए, -सक्षम विकल्प के लिए, ?पिछले बाहर निकलने की स्थिति के लिए, और !के लिए सबसे हाल ही में अतुल्यकालिक नौकरी के पीआईडी। (इस प्रकार, यहां तक ​​कि $(( )), $अक्सर इसकी आवश्यकता होती है।) सुझाए गए तर्क को प्रदर्शित करने के लिए यहां दिखाया गया कोड किसी बॉर्न-शैली के शेल के लिए एक स्क्रिप्ट नहीं है, क्योंकि इसे प्रदर्शित करने का कोई तरीका नहीं है, क्योंकि यह लागू नहीं होता है उन्हें।
एलियाह कगान

10

सी में, एक अभिव्यक्ति पर विचार करें:

1000l + 2.0f;

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

और आप शेल भाषा में सी प्रभाव के प्रभाव को देख सकते हैं, इसलिए यह आश्चर्य की बात नहीं है कि बॉर्न शेल (या सी शेल) और इसलिए, पॉसिक्स ने अनुमत नामों के वर्ग को सी के समान ही सीमित कर दिया है।


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

@ एलिया निश्चित रूप से संख्या की बात भी सी में सफलता और असफलता के लिए निकास की स्थिति का एक सीधा परिणाम है, इसलिए मैं शेल परीक्षण लिखते समय सच्चे और झूठे के बजाय सफलता और असफलता के बारे में सोचना चाहता हूं। आप सही हैं कि बहुत सारे शेल सिंटैक्स सी की तरह कुछ भी नहीं हैं, लेकिन उदाहरणों में ब्रेसिज़, अर्धविराम, लघु-चक्कर &&और ||, तार में ASCII
नल के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.