सामग्री पर जाएँ
Varlig गाइड
Varlig का मुख्य पृष्ठ

अपने फ़ंक्शन

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

यह पेज फ़ंक्शन परिभाषित करना और चलाना, नोट के दूसरे नामों का उनमें उपयोग, शर्तें, पुनरावर्ती कॉल और लागू सीमाएँ समझाता है। Varlig के साथ आने वाले sqrt और round जैसे फ़ंक्शन के लिए बिल्ट-इन फ़ंक्शन संदर्भ देखें।

एक फ़ंक्शन को परिभाषित करना और कॉल करना

फ़ंक्शन का नाम, कोष्ठक में इसके पैरामीटर, एक बराबर चिह्न और सूत्र लिखें। फिर इसे उसी क्रम में मानों के साथ कॉल करेंः

calc
tip(bill, pct) = bill * pct
tip($48, 15%) परिणाम $7.20
tip($120, 12.5%) परिणाम $15.00
tip($36 + $12, 15%) परिणाम $7.20

परिभाषा वाली पंक्ति कोई उत्तर नहीं दिखाती। हर कॉल आपके दिए मान bill और pct की जगह रखकर सूत्र हल करता है। आर्ग्युमेंट पूरी गणना भी हो सकता है, जैसे ऊपर $36 + $12।

आर्ग्युमेंट केवल साधारण संख्या नहीं, पूरा मान होता है। इसलिए सूत्र में इकाइयाँ और मुद्राएँ भी बनी रहती हैं:

calc
bmi(weight, height) = weight / height^2
bmi(81 kg, 1.8 m) परिणाम 25 kg/m²

इकाइयों को वैसे ही रखा जाता है जैसे आप उन्हें देते हैं, इसलिए bmi(81 kg, 180 cm) kg/cm² में उत्तर देता है। वही इकाई प्राप्त करने के लिए जो भी आप पास करते हैं, फ़ंक्शन के अंदर कनवर्ट करें:

calc
bmi(weight, height) = (weight / height^2) in kg/m^2
bmi(81 kg, 180 cm) परिणाम 25 kg/m²
bmi(80 kg, 5.9 ft) परिणाम 24.7375131668 kg/m²

एक फ़ंक्शन में कोई पैरामीटर भी नहीं हो सकता है। ख़ाली कोष्ठक लिखें जब आप इसे परिभाषित करते हैं और जब आप इसे कॉल करते हैं:

calc
standard_vat() = 20%
£120 * standard_vat() परिणाम £24.00

एक सादा चर, जैसे कि standard_vat = 20%, आमतौर पर कम टाइपिंग के साथ एक ही काम करता है।

नाम और पैरामीटर

  • फ़ंक्शन और पैरामीटर नाम एकल शब्द हैं। अक्षरों, अंकों और अंडरस्कोर का उपयोग करें, जैसे कि net_pay या bmi2, बिना रिक्त स्थान के। यदि आप लिखते हैं area of circle(r) = pi * r^2, तो पंक्ति इसके बजाय उपयोग करने के लिए नाम का सुझाव देती है: area_of_circle।
  • फ़ंक्शन के नाम में बड़े-छोटे अक्षरों का फर्क नहीं पड़ता: Tip(bill, pct) परिभाषित करने के बाद tip($48, 15%) से चला सकते हैं।
  • प्रत्येक पैरामीटर को अपने स्वयं के नाम की आवश्यकता होती है। f(a, a) = a एक त्रुटि है।
  • एक फ़ंक्शन में 32 पैरामीटर तक हो सकते हैं।
  • आप एक अंतर्निहित फ़ंक्शन के नाम का पुन: उपयोग नहीं कर सकते। round(x) = … या sqrt(x) = … इसे बदलने के बजाय एक त्रुटि दिखाता है। एक साधारण चर अभी भी उन नामों में से एक का उपयोग कर सकता है, जैसे floor = 12 m²; देखें Names।
  • स्प्रेडशीट में प्रचलित avg, total और stdev नाम अपने फ़ंक्शन के लिए इस्तेमाल कर सकते हैं। अपना total(order) परिभाषित करें तो वही संस्करण चलेगा।
  • एक फ़ंक्शन और एक चर एक नाम साझा कर सकते हैं। rate चर को पढ़ता है और rate(5) फ़ंक्शन को कॉल करता है।
  • फ़ंक्शन हमेशा कोष्ठकों के साथ चलाएँ। अकेला फ़ंक्शन नाम कुछ नहीं दिखाता, जब तक उसी नाम का चर भी न हो। अपवाद sum, total, subtotal, grand total, average, max और min हैं; ये अपने ऊपर की पंक्तियों से संबंधित आँकड़ा निकालते हैं। ऊपर की पंक्तियों को जोड़ना देखें।

आर्ग्युमेंट में अल्पविराम

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

calc
tip(bill, pct) = bill * pct
tip($1,200, 15%) परिणाम $180.00
tip($1200,15%) परिणाम $180.00

स्पेस से अलग किए गए हिस्सों की तुलना में फ़ंक्शन को अधिक मान चाहिए हों, तो हर अल्पविराम आर्ग्युमेंट अलग करता है, जैसा दूसरे कॉल में है। भिन्नात्मक मान के लिए दशमलव बिंदु इस्तेमाल करें, जैसे tip($48, 12.5%)।

अपने नोट में अन्य नामों का उपयोग करना

एक फ़ंक्शन आपके नोट से चर का उपयोग कर सकता है। हर बार जब आप इसे कॉल करते हैं तो यह उनका वर्तमान मूल्य पढ़ता हैः

calc
vat = 20%
with_vat(price) = price * (1 + vat)
with_vat(£50) परिणाम £60.00
vat = 5%
with_vat(£50) परिणाम £52.50

जब आप फ़ंक्शन को परिभाषित करते हैं तो चर पहले से मौजूद होना चाहिए, इसलिए with_vat से ऊपर vat = 20% डालें। यदि यह अभी तक मौजूद नहीं है, तो परिभाषा रेखा एक त्रुटि दिखाती है।

पैरामीटर फ़ंक्शन के लिए स्थानीय हैं। price नामक एक पैरामीटर नोट में कहीं और price नामक चर को नहीं पढ़ता या बदलता है:

calc
price = £10
double(price) = price * 2
double(£3) परिणाम £6.00
price परिणाम £10.00

चरों की तरह, एक Calc ब्लॉक में परिभाषित फ़ंक्शन को उसी नोट में बाद के Calc ब्लॉक में उपयोग किया जा सकता है। Varlig नोट को ऊपर से नीचे तक प्रोसेस करता है, इसलिए उस फ़ंक्शन को कॉल करने वाले पहले पंक्ति के ऊपर एक फ़ंक्शन परिभाषित करें। परिभाषा के ऊपर कॉल करने पर कोई उत्तर नहीं दिखाई देता।

अन्य फ़ंक्शन को कॉल करने वाले फ़ंक्शन

छोटे फ़ंक्शन एक-दूसरे का उपयोग कर सकते हैं:

calc
day_rate = £400
fee(days) = days * day_rate
invoice(days) = fee(days) * 1.2
invoice(5) परिणाम £2,400.00

फ़ंक्शन परिभाषित होते समय जिस सहायक फ़ंक्शन का संस्करण मौजूद था, उसे याद रखता है। नीचे उसी सहायक को फिर परिभाषित करें तो पहले बने फ़ंक्शन पुराने संस्करण का उपयोग करते रहते हैं:

calc
shipping(order) = £4.95
total(order) = order + shipping(order)
shipping(order) = £2.95
total(£30) परिणाम £34.95
shipping(£30) परिणाम £2.95

नया shipping इस्तेमाल करने के लिए उसके नीचे total फिर परिभाषित करें। मौजूदा परिभाषा को उसी जगह संपादित करने पर यह समस्या नहीं होती। Varlig नोट को ऊपर से फिर गणना करता है, इसलिए नीचे सभी कॉल संपादित संस्करण इस्तेमाल करते हैं।

फ़ंक्शन उस सहायक फ़ंक्शन को भी बुला सकता है जो नीचे परिभाषित हो। इस स्थिति में कॉल के समय मौजूद सहायक का संस्करण इस्तेमाल होता है। इसलिए बाहरी फ़ंक्शन चलाने तक सहायक परिभाषित हो जाना चाहिए:

calc
checkout(order) = order + delivery(order)
delivery(order) = if order >= £40 then £0 else £3.50
checkout(£25) परिणाम £28.50
checkout(£60) परिणाम £60.00

शर्तें

परिणामों के बीच चयन करने के लिए if … then … else … का उपयोग करें। दो से अधिक मामलों के लिए else के बाद एक और if चेन करें:

calc
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20
postage(90 g) परिणाम £0.85
postage(500 g) परिणाम £1.55
postage(1.2 kg) परिणाम £3.20

केवल लागू होने वाली शाखा पर काम किया जाता है। यह आपको एक गणना से बचाव करने देता है जो अन्यथा विफल हो जाएगा, जैसे कि शून्य से विभाजित करना:

calc
per_person(total, people) = if people > 0 then total / people else £0
per_person(£90, 3) परिणाम £30.00
per_person(£90, 0) परिणाम £0.00

रिकर्शन

फ़ंक्शन खुद को बुला सकता है, बशर्ते कोई शर्त अंततः उसे रोक दे। यह उदाहरण समूह में हर व्यक्ति के हर दूसरे व्यक्ति से एक बार हाथ मिलाने की कुल संख्या निकालता है:

calc
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)
handshakes(6) परिणाम 15
handshakes(10) परिणाम 45

हर कॉल एक स्तर और भीतर जाती है। अधिकतम 12 स्तर की कॉल अनुमत हैं। handshakes(12) काम करता है, लेकिन handshakes(13) पर Error: calculation limit आता है। ऐसा फ़ंक्शन जो कभी रुकने की शर्त तक नहीं पहुँचता, परिभाषित तो हो सकता है, पर चलाने पर इसी सीमा से रुकता है। दो फ़ंक्शन भी इसी सीमा के भीतर एक-दूसरे को बुला सकते हैं।

सामान्य गिनती के लिए बिल्ट-इन फ़ंक्शन तेज़ हैं और उन पर यह सीमा लागू नहीं होती। combination(10, 2) भी 45 देता है। factorial(n) या n! से पुनरावर्ती गणना वाला परिचित फ़ैक्टोरियल उदाहरण हल होता है।

सूचियां, मैट्रिक्स और बहुत कुछ

आर्ग्युमेंट सूचियाँ, आव्यूह या सम्मिश्र संख्याएँ हो सकते हैं। फ़ंक्शन की अभिव्यक्ति में कोई भी बिल्ट-इन फ़ंक्शन इस्तेमाल कर सकते हैं:

calc
spread(scores) = max(scores) - min(scores)
spread([12, 18, 9, 21]) परिणाम 12

फ़ंक्शन की अभिव्यक्ति में अपने स्थानीय चर वाला योग या समीकरण हल करने वाला फ़ंक्शन भी हो सकता है। सूचियाँ और सांख्यिकी तथा योग, समीकरण हल करना और कलन देखें।

आम गलतियाँ

  • ^ का उपयोग करके घात लिखें। x² फ़ंक्शन के अंदर स्वीकार नहीं किया जाता है। इससे भी बदतर, एक छोटा पैरामीटर नाम एक इकाई से मेल खा सकता है: w / h² में, h² का अर्थ वर्ग घंटे है, पैरामीटर h नहीं। w / h^2 लिखें।
  • पैरामीटरों की संख्या जांचें। जब फ़ंक्शन दो मानों की अपेक्षा करता है, तो tip($48) को कॉल करने पर त्रुटि दिखाई देती है।
  • अकेली रकम को प्रति इकाई कीमत माना जाता है। oats(amount) = amount / 1 kg * £0.95 में £0.95 प्रति किलोग्राम कीमत है। हर कॉल इसकी सूचना देती है। पॉइंटर रखने पर “£0.95 in oats treated as a price per kg. Write £0.95/kg there to make it explicit.” दिखता है। परिभाषा में दर स्पष्ट लिख देने पर यह सूचना हट जाती है।
  • एक पंक्ति, एक सूत्र। एक परिभाषा एक ही पंक्ति में एक ही अभिव्यक्ति होती है। कई चरणों वाली गणना के लिए, प्रत्येक चरण के लिए एक छोटा फ़ंक्शन परिभाषित करें और उन्हें मिलाएं।
  • गलत नई परिभाषा होने पर पुराना संस्करण बना रहता है। tip की नई परिभाषा में गलती हो तो पंक्ति त्रुटि दिखाती है और पहले वाला सही tip उपलब्ध रहता है।
  • नोट रीकैल्कुल होने पर उत्तर बदल सकते हैं। प्रत्येक बार कॉल की गणना फिर से की जाती है, इसलिए एक फ़ंक्शन जो random या आज की तिथि का उपयोग करता है, एक नया उत्तर दे सकता है।
  • त्रुटियाँ आगे भी दिखाई जाती हैं। कोई आर्ग्युमेंट सूत्र में त्रुटि पैदा करे, जैसे शून्य से भाग, तो कॉल वही त्रुटि दिखाती है।

सीमाएं

क्या सीमा
पैरामीटर प्रति फ़ंक्शन 32
नेस्टेड कॉल (एक फ़ंक्शन खुद को या किसी अन्य को कॉल करता है) 12
एक शीर्ष-स्तरीय कॉल पर काम करते समय किए गए कॉल 16,384
एक नोट में परिभाषित फ़ंक्शन 1,024

सीमा को छूने पर Error: calculation limit दिखाई देता है। नोट का बाकी हिस्सा काम करता रहता है। प्रत्येक सीमा के लिए Errors, diagnostics and limits देखें।

इसे एक साथ रखना

यह फ्रीलांस काम का इनवॉइस है। ऊपर दर और VAT नाम वाले मान हैं; तीन छोटे फ़ंक्शन हिसाब करते हैं:

calc
# March invoice
day_rate = £450
vat = 20%
fee(days) = days * day_rate
with_vat(amount) = amount * (1 + vat)
late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0
design = fee(8) परिणाम £3,600.00
build = fee(4.5) परिणाम £2,025.00
subtotal = design + build परिणाम £5,625.00
with_vat(subtotal) परिणाम £6,750.00
late_fee(with_vat(subtotal), 45) परिणाम £135.00

day_rate या vat बदलते ही नीचे की सभी पंक्तियाँ अपडेट हो जाती हैं। ग्राहक देर से भुगतान करे तो एक कॉल से शुल्क जोड़ सकते हैं।