क्या सिगल्स स्रोत कोड को पढ़ने में आसान बनाते हैं?


13

अधिकांश प्रोग्रामिंग भाषाओं में, वैरिएबल के पास वर्णों की पहचान नहीं होती है जैसे वे PHP में करते हैं। PHP में आपको $वर्ण के साथ एक चर उपसर्ग करना चाहिए ।

उदाहरण;

 var $foo = "something";
 echo $foo;

मैं एक व्यावसायिक अनुप्रयोग के लिए एक नई स्क्रिप्टिंग भाषा विकसित कर रहा हूं, और मेरे लक्षित उपयोगकर्ताओं के पास प्रोग्रामिंग पृष्ठभूमि नहीं है। क्या इन वर्णों को पढ़ना और उपयोग करना आसान है?

PHP का उपयोग करने $का एक कारण है क्योंकि इसके बिना PHP यह नहीं बता सकती है कि कोई नाम एक फ़ंक्शन संदर्भ या चर संदर्भ है। ऐसा इसलिए है क्योंकि भाषा कार्यों के लिए अजीब संदर्भों की अनुमति देती है। तो $प्रतीक पार्सर को नामस्थान को अलग करने में मदद करता है।

मुझे अपने पार्सर में यह समस्या नहीं है। इसलिए मेरा प्रश्न विशुद्ध रूप से पठनीयता और उपयोग में आसानी पर है। मैंने PHP में इतने सालों तक कोडित किया है कि जब मैं देखता हूं कि मेरे लिए $fooइसे एक चर के रूप में पहचानना आसान है। क्या मैं इस पहचानकर्ता को पूर्वाग्रह दे रहा हूं?


19
IMO, सिगल्स के बिना कोड अधिक पठनीय है
जॉन ड्वोरक

6
@JanDvorak +1 मुझे दिन का नया शब्द देने के लिए। मैं sigilsआज बातचीत में तीन बार उपयोग करने का प्रयास करूंगा ।
21 अक्टूबर को रिएक्टगुलर

6
IMO यह निर्भर करता है कि आपके संपादक में सिंटैक्स हाइलाइटिंग है या नहीं।
कोडबर्ड

5
यदि आप उपयोग करते हैं var $x = ...या type $x = ...फिर मुझे लगता है कि $ ओवरकिल है। अगर आपके पास बस होता $x = ...तो यह करने लायक हो सकता है। खासकर यदि आप आम संपादकों में हाइलाइटिंग सिंटैक्स का समर्थन नहीं करना चाहते हैं। हालांकि, एक प्राथमिकता के रूप में, मुझे पसंद नहीं हैsigils
कोडबर्ड

5
सिगल्स एक लागू किए गए
शाफ़्ट फ्रीक

जवाबों:


13

वास्तविक तकनीकी possibilites और सीमाएँ इस थ्रेड में सुझाए गए अनुसार कुछ भी नहीं हैं। चलिए पहले उन को साफ करते हैं।

यहां बताया गया है कि PHP में $ क्या संभव है:

  • चर चर
  • कीवर्ड नाम वाले वेरिएबल्स जैसे $returnकि वैरिएबल के लिए एक ही नाम का उपयोग किया जा सकता है या एक प्रकारांतर / स्थिर जैसे$__FILE__

$ उपसर्ग से संबंधित सीमाएँ या सुविधाएँ:

  • कार्यान्वयन अन्यथा कार्यों और चर के बीच अंतर बताने में असमर्थ है
  • PHP स्ट्रिंग प्रक्षेप या टेम्पलेट सिंटैक्स
  • आवश्यक चर घोषणा

इसका मतलब है कि कोई तकनीकी कारण नहीं है जो आपके पास नहीं हो सकता है

foo = "something";
echo foo;

या

foo = "something";
echo "foo = $foo";
//would print
//foo = something 

हालाँकि आपके पास नहीं हो सकता (मान returnलेना एक खोजशब्द है)

return = "something";

गंभीर जटिलताओं के बिना। यदि आप उपसर्ग का उपयोग करते हैं $, तो यह कोई समस्या नहीं होगी।

यह एक राय है लेकिन मेरा मानना ​​है कि यह एक गैर-प्रोग्रामर के लिए एक सतर्कता के लायक होगा क्योंकि यह उन्हें खोजशब्दों को चर नामों के रूप में उपयोग करने में सक्षम बनाता है, उनके लिए यह अन्यथा मनमाना सीमा की तरह दिखेगा: P


के बारे में return = "something";, C # में "प्रासंगिक कीवर्ड" हैं, जो भाषाओं को डिज़ाइन करते समय जांचने लायक भी एक विकल्प है।
ल्यूसुबबल

1
@luiscubal ने लिखा है कि C # गैर-आश्चर्यजनक रूप से एक सतर्कता की आवश्यकता है, इसलिए यदि आप चाहते हैं कि कोड संकलित किया जाए, तो आपको लिखना होगा @return = "something;"। प्रासंगिक कीवर्ड की कुछ राशि है, हां, लेकिन उन सभी को प्रासंगिक बनाने का मतलब होगा अधिक जटिल कार्यान्वयन।
एस्लेइजा

7

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

अंत उपयोगकर्ता लक्षित भाषा में, जिस पर मैं काम कर रहा हूं, मैं और भी आगे बढ़ता हूं, जिससे पहचानकर्ता मामला असंवेदनशील हो जाता है और रिक्त स्थान और एपोस्ट्रोफिस की अनुमति देता है। इससे मुझे परिवर्तनशील नाम मिलते हैं Karl's heightजो प्राकृतिक भाषाओं के बहुत करीब हैं।


1
चरों में रिक्त स्थान के लिए +1, लेकिन मुझे नहीं पता कि इसे कैसे लागू किया जाए। मुझे यकीन नहीं है कि मुझे या तो पढ़ने में आसानी होगी। मैं सिर्फ इसका उपयोग नहीं कर रहा हूं।
रिएक्टगुलर

1
मुझे यह विचार पसंद आया। लेकिन मुझे पहचानकर्ता में अंतरिक्ष के साथ एक भाषा के लिए पार्सर लिखने से नफरत होगी। :-)At Karl's for the night = true;
मार्टिन यॉर्क

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

2
केस असंवेदनशीलता में अंतर्राष्ट्रीयकरण की समस्या है, हालांकि। यदि आप कई भाषाओं के पात्रों की अनुमति देते हैं, तो आप उन नामों में चल सकते हैं जो कुछ स्थानों में "समान" हैं, लेकिन अन्य में नहीं।
ल्यूसुबल

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

7

वर्षों पहले, मैंने अप्लेसॉफ्ट बेसिक सीखा। स्ट्रिंग को हमेशा $प्रत्यय दिया गया था और सरणियों का प्रत्यय था %। भाषा कैसे काम करती है। तुमने कुछ देखा, तुम्हें पता था कि यह क्या था। मैंने कभी यह समझने के लिए दुभाषिया में बहुत ज्यादा देरी नहीं की कि यह मामला या डिजाइन के फैसले क्यों थे।


Php में sigil अपने perl प्रभाव (जो इससे प्रभावित था awkऔर sh) से आता है। Perl में sigil बहुत अधिक है जितना $कि यह कई अलग-अलग प्रकारों की पहचान कर सकता है:

  • $ अदिश
  • @ सूची
  • % हैश
  • & codeblock
  • * typeglob

सर्जन यह पहचानता है कि आप जिस प्रतीक तालिका संरचना को देख रहे हैं उसका क्या हिस्सा है। पर्दे के पीछे, फ़ू के लिए प्रतीक तालिका प्रविष्टि ( *fooटाइपग्लोब के माध्यम से पहुँचा ) में वह सब कुछ है जो एक फ़ू हो सकता है। नहीं है $foo, @foo, %foo, प्रारूप foo , &foo, filehandle foo, आदि ...

यह एक दूसरे के लिए एक चर का उपनाम बनाने की भी अनुमति देता है:

#!/usr/bin/perl

$foo = "foo";
@qux = (1,2);
*bar = \$foo;
*bar = \@qux;

print "$bar @bar\n";

यह प्रिंट foo 1 2- पर्ल में, यह वही है जो सिगल्स वास्तव में हैं, न कि आपको ऐसा करना चाहिए बल्कि यह है कि पर्दे के पीछे यह है कि वे करते हैं।

सिगिल्स पठनीयता के लिए बहुत अधिक नहीं हैं, बल्कि इसलिए कि कोई व्यक्ति नाम स्थान में टकराव के बिना $fooऔर @fooबिना किसी दूसरे से टकराए (अन्य भाषाओं की तुलना में जहां दोनों नहीं हो सकता है int foo; int[] foo;)


पठनीयता के लिए सिगल्स एक ऐसी चीज है जिसे किसी भी भाषा के भाग के रूप में सीखा जाता है - वाक्य रचना को पढ़ना। आप पहचानकर्ता का हिस्सा बनने के लिए, काल्पनिक रूप से, स्वयं प्रकार को लागू कर सकते हैं।

की तर्ज पर lex में कुछ:

typeChar  [is]
capLetter [A-Z]
letter    [a-z]
digit     [0-9]
%%
{typeChar}{capLetter}(letter}|{digit})* { prientif("iddentifier");}
%%

और तब आपके पास जैसे कोड हो सकता है

iFoo = 42;
sFoo = "a string";
iBar = iFoo * 2;

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

हालांकि, इस तरह से परिभाषित भाषा के साथ काम करने के बाद, मैं शायद इसे बिना परेशानी के पढ़ सकता था।

कुछ लोग उन्हें पसंद करते हैं, कुछ लोग नहीं। इस पर बहस करने वाले विभिन्न मंचों में महान पवित्र युद्ध होते हैं और यह सच में उबलता है कि आपने उनका कितना उपयोग किया है।

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

यह वास्तव में कोई फर्क नहीं पड़ता। इससे कोई फर्क नहीं पड़ता कि कैसे आप भाषा का उपयोग करते हैं या नहीं तो सिगिल कैसे फिट होगा। क्या आप करने में सक्षम होना चाहते हैं "123 $foo 456"या आपको करना चाहिए "123 " + foo + " 456"? यहीं पर निर्णय होना चाहिए।


1
स्ट्रिंग प्रक्षेप जैसे "123 $foo 456"कि सर्जन उपसर्ग द्वारा सक्षम नहीं है और इसके लिए पूरी तरह से ऑर्थोगोनल है।
एस्लेइजा

1
चर के प्रक्षेप का इसका हिस्सा है और इस बात पर निर्भर करता है कि कोई स्ट्रिंग कैसे पार्स करता है। सिगिल्स को आसान बना सकते हैं (यह अन्य तरीके से किया जा सकता है जैसा कि जावास्क्रिप्ट में वेरिएबल इंटरपोलेशन करने के लिए सबसे अच्छा तरीका है; लेकिन यह मुख्य भाषा का हिस्सा नहीं है। सिगिल, यकीनन, इसे लिखना और समझना बहुत आसान है।

1
@MichaelT नहीं, यह तथ्य कि चर में उपसर्ग हैं, स्ट्रिंग प्रक्षेप को लागू करना आसान या कठिन नहीं बनाते हैं। वे सिर्फ 2 पूरी तरह से असंबंधित चीजें हैं। एक मानव पाठक के लिए, यह $asdस्ट्रिंग इंटरपोलेशन सिंटैक्स में उपयोग करने के लिए अच्छा विकल्प हो सकता है यदि $पहले से ही चर उपसर्गों के लिए उपयोग किया गया था, लेकिन इसका पहले स्थान पर स्ट्रिंग प्रक्षेप को लागू करने की वास्तविक possiblity के साथ कोई लेना-देना नहीं था।
एस्लेइजा

2
@Esailija आप बता सकते हैं कि वे कैसे असंबंधित हैं? एक तरफ के रूप में, en.wikipedia.org/wiki/Variable_interpolation से - "वैरिएबल इंटरपोलेशन को सपोर्ट करने वाली भाषाओं में पर्ल, पीएचपी, रूबी, टीसीएल, ग्रूवी और ज्यादातर यूनिक्स गोले शामिल हैं। इन भाषाओं में, वेरिएबल इंटरपोलेशन केवल तब होता है जब स्ट्रिंग शाब्दिक होता है। दोहरा-उद्धृत, लेकिन तब नहीं जब इसे एकल-उद्धृत किया जाता है। चर पहचाने जाते हैं क्योंकि चर इन भाषाओं में एक सतर्क (आमतौर पर "$") से शुरू होते हैं। "

@MichaelT चर उपसर्गों और स्ट्रिंग प्रक्षेप में उपयोग किया जा रहा डॉलर का प्रतीक पूरी तरह से सतही पसंद है (जिसमें केवल पठनीय तर्क हैं, लागू करने के लिए कुछ भी नहीं है, यह #उदाहरण के लिए कॉफ़ी में उपयोग किया जा सकता है और कॉफ़ीस्क्रिप्ट उपसर्ग नहीं करता है। वैरिएबल #- वास्तव में यह सब पर वैरिएबल उपसर्ग नहीं करता है)
Esailija

3

मैं इस बात से सहमत नहीं हूं कि PHP funcs से भिन्न vars के लिए $ का उपयोग करता है। कम से कम क्योंकि PHP में C- जैसा सिंटैक्स होता है, और फ़न () में नाम के बाद Parens होते हैं।

PHP में $ क्यों है के बारे में स्टैक ओवरफ्लो पर इस पोस्ट को पढ़ें ।

कई लोकप्रिय भाषाएँ, जैसे C, C ++, C #, Java $ का उपयोग नहीं करती हैं और हम फ़ंक्शन से आसान संस्करण को अलग कर सकते हैं।

PHP $ में मदद करता है, उदाहरण के लिए, जब आप लिखते हैं: गूंज "var = $ var"

बिना $ ऐसी चाल असंभव हो जाएगी।


+1 आह जो अधिक समझ में आता है। धन्यवाद।
रिएक्टगुलर

3
Sigils वाली भाषा का इससे कोई लेना-देना नहीं है क्योंकि आपके उदाहरण के अनुसार इसमें स्ट्रिंग इंटरपोलेशन हैecho "var = $var"

4
-1। PHP सिंटैक्स quirks कुछ वास्तविक सीमा के कारण नहीं हैं, लेकिन क्योंकि व्याकरण के नियम बेहद खराब तरीके से डिज़ाइन किए गए हैं, अगर सभी पर डिज़ाइन किए गए हैं। यही कारण है कि उन्हें यह सुनिश्चित करने के लिए हैक की आवश्यकता होती है कि fn()[]समझदार व्याकरण के साथ जहां बॉक्स के बारे में सोचकर भी काम नहीं किया होगा।
एस्लेइजा

@svidgen हाँ। स्ट्रिंग के किसी हिस्से को मैप करने के लिए क्या संकेत मिलता है, यह इंगित करने के लिए आप बिना किसी तरह से स्ट्रिंग इंटरपोलेशन को सुरक्षित रूप से नहीं कर सकते। अन्य भाषाएं मुझे परेशान करती हैं जो मुझे परेशान करने वाली / अनावश्यक क्रियाशीलता लगती हैं, जैसे कि पायथन का स्ट्रिंग प्रारूपण। हालांकि, पीएचपी में अन्य फायदे भी हैं: रुस्लानज़सुखिन यह कहने में गलत है कि कार्यों को हमेशा परेंस के साथ इंगित किया जाएगा, क्योंकि उन्हें संदर्भ के रूप में भी पास किया जा सकता है।
इज़काता

@Izkata जिस तरह से आप किसी भाषा में चरों का उपयोग करते हैं, उसका स्ट्रिंग इंटरपोलेशन सिंटैक्स से कोई लेना-देना नहीं है। लेकिन इस जवाब में निहित था, इसलिए -1 ...
एसेलीजा

3

इन सभी जवाबों के बाद, मैं मैथ्यू फोसकारिनी को कुछ और अंक देना चाहता हूं।

  • आप समस्या को अब "भाषा निर्माता" मानते हैं। आप यह समझने की कोशिश करें कि किसी अन्य भाषा में यह या यह सुविधा क्यों है कि वह अपनी भाषा में कुछ का उपयोग कर सकता है। मैं कई वर्षों से एक ही स्थिति में हूं, क्योंकि हमारे वेलेंटीना डेटाबेस के लिए एसक्यूएल पार्सर विकसित करना।
  • मेरी सलाह है कि आप antlr.org पर एक नज़र डालें और यहां तक ​​कि टेरेंस की किताब भी पढ़ें। यह भाषा डेवलपर्स के लिए बहुत अच्छी चीजें हैं।
  • मैं अभी भी अन्य कारणों से उजागर "कारणों" से सहमत नहीं हूं। वे मानते हैं कि सिर में पीएचपी लेखक ने आरक्षित खोजशब्दों का उपयोग करने में सक्षम होने के लिए $ का उपयोग करने का निर्णय लिया है और गैर-चर से बेहतर चर को अलग करता है। मुझे ऐसा नहीं लगता ... हालाँकि यह साबित हो सकता है कि केवल उनकी ही कहानी हो।
  • शायद यह कि वे केवल और अधिक शुरुआती भाषाओं का अनुसरण करते हैं। टेरेंस को रेखांकित करते हुए, अधिकांश भाषाएं समान हैं, विशेष रूप से लेक्सर भाग में। और आम तौर पर एक नई भाषा का निर्माण करने वाला सिर्फ यह चुन सकता है कि वह किस तरह की भाषा विकसित करने जा रहा है और फिर उस भाषा के व्याकरण के बारे में जानकारी ले। और यही आपको अब करना चाहिए। खरोंच से आविष्कार की आवश्यकता नहीं है। और मैंने शर्त लगाई कि PHP लेखकों ने भी ऐसा ही किया।
  • बाकी सभी लोग जो उल्लेख करते हैं:
    • वैरिएबल को नॉन-वैरिएबल से अलग करें
    • चर नामों के रूप में पुनर्जीवन शब्द
    • स्ट्रिंग के अंदर चर रखने की क्षमता
    • और हो सकता है (मैं PHP में बड़ा विशेषज्ञ नहीं हूं)

कर रहे हैं यह lexer के साइड इफेक्ट है, क्योंकि यह एक टोकन पहचान करने में सक्षम है।

उदाहरण के रूप में लें: SQL में हम "" का उपयोग आरक्षित शब्दों के साथ पहचानकर्ताओं का उपयोग करने में सक्षम हैं और यहां तक ​​कि "प्रथम नाम", "समूह का नाम" वाले रिक्त स्थान के साथ पहचानकर्ता भी। ग्रुप एक कीवर्ड है। समस्या थी - विशेष समाधान था।

PS माइकलटी की बहुत अच्छी टिप्पणी।


महान लिंक के लिए +1 धन्यवाद। मैंने इसे एक का उपयोग करके समाप्त कर दिया है, लेकिन आपका लिंक बहुत बेहतर दिखता है। Goldparser.org
रिएक्टगुलर

आपके लिंक के लिए भी धन्यवाद। मैंने पहले इस सोने के पार्सर को नहीं देखा है। दिलचस्प भी लगता है।
रुस्लान ज़सुखिन

@RuslanZasukhin यदि आप मेरे उत्तर का संदर्भ बना रहे हैं, तो मैंने कभी नहीं कहा कि यह कीवर्ड को सक्षम करने के लिए डेवलपर का इरादा था। मैंने केवल यह कहा था कि चर नाम के रूप में खोजशब्दों का उपयोग करना तकनीकी रूप से संभव हो जाता है जब चर प्रतीक जैसे उपसर्ग के साथ उपसर्ग करते हैं $। इसके अलावा "स्ट्रिंग के अंदर वेरिएबल को रखने की क्षमता" ऐसा नहीं है क्योंकि वेरिएबल्स जैसे प्रतीक के साथ उपसर्ग किए जाते हैं $। यानी, "123 $foo 456"अगर वेरिएबल सिंटैक्स जैसा है foo = 3या हो तो भी काम करेगा @foo = 3। वे एक-दूसरे से संबंधित नहीं हैं।
एस्लेइजा

3

... एक सतर्क करने की अनुमति देता है:

  • गैर-चर से बेहतर अंतर । जो लोग अभी भी बुनियादी अवधारणाओं को सीख रहे हैं उन्हें यह पता लगाने में परेशानी हो सकती है कि कौन से शब्द चर हैं और कौन से नहीं। वे अक्सर उदाहरणों या अन्य लोगों के कोड को बिना पर्याप्त पृष्ठभूमि के पढ़ना शुरू करते हैं।

  • चर नामों के रूप में आरक्षित कीवर्ड या फ़ंक्शन नामों का उपयोग करें । कई बार मैंने उन नामों में से कुछ को एक चर के लिए सही पाया (यानी जब कोई फ़ंक्शन परिभाषित था) और मुझे उनका उपयोग करने की अनुमति देने के लिए धन्यवाद दिया। $countcount()

इसके अलावा, मैं उस फंक्शन का नाम बार-बार पुन: उपयोग करने के लिए होता हूं , जो फंक्शन का परिणाम फेंकने योग्य चर में रखता है, जैसे:

$isdir=isdir($dir);

if(/* complex condition implying $isdir */) {
/* etc */
}


1
ZHR, बेहतर क्या मतलब है? C ++ में हम अपने सभी वेरिएबल्स को बिना $ के लिखते हैं और हम पूरी तरह से और आसान उन्हें अलग करते हैं। उदाहरण: {int z = 0; z = 55; जेड (जेड); } और C ++ में हम फ़ंक्शन नाम का उपयोग कर सकते हैं यदि असाइन करने की आवश्यकता है, उदाहरण के लिए फ़ंक्शन को पॉइंटर करने के लिए।
रुस्लान ज़सुखिन

@RuslanZasukhin, कंप्यूटर निरक्षर, क्या आप कुछ जानते हैं? उन्हें C ++ सिखाने की कोशिश करें, आप चकित हो जाएंगे।
ZJR

भी: मुझे नहीं लगता कि एक सतर्क हमेशा एक $संकेत होना चाहिए । मुझे याद है कि डॉलर का संकेत मुझे भ्रमित कर रहा था जब मैं अपने अंतर्निहित पैसे के संघ के कारण एक बच्चा था। %एक संभव विकल्प हो सकता है।
ZJR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.