دوالك الخاصة
عندما تكرر الصيغة نفسها مع أعداد مختلفة، حوّلها إلى دالة. تعطي الصيغة ومدخلاتها أسماء مرة واحدة، ثم تستدعيها حيث تحتاج إلى نتيجة: لحساب بقشيش، أو مؤشر كتلة الجسم، أو توقع المدخرات، أو إعداد فاتورة.
تشرح هذه الصفحة تعريف الدوال واستدعاءها، وكيفية استخدامها للأسماء الأخرى في ملاحظتك، والشروط والاستدعاء الذاتي، والحدود المطبقة. للدوال المرفقة مع Varlig مثل sqrt وround، راجع مرجع الدوال المدمجة.
تعريف دالة واستدعاؤها
اكتب اسم الدالة، ثم معاملاتها بين قوسين، ثم علامة المساواة والصيغة. وبعد ذلك استدعها بقيم بالترتيب نفسه:
tip(bill, pct) = bill * pcttip($48, 15%) الناتج $7.20tip($120, 12.5%) الناتج $15.00tip($36 + $12, 15%) الناتج $7.20لا يعرض سطر التعريف نتيجة. يضع كل استدعاء قيمك مكان bill وpct ويحسب الصيغة. يمكن أن يكون الوسيط عملية حسابية كاملة، مثل $36 + $12 أعلاه.
الوسائط قيم كاملة وليست مجرد أعداد، لذلك تنتقل الوحدات والعملات عبر الصيغة:
bmi(weight, height) = weight / height^2bmi(81 kg, 1.8 m) الناتج 25 kg/m²تُحفَظ الوحدات كما أدخلتها، لذا تعطي bmi(81 kg, 180 cm) نتيجة بوحدة kg/cm². للحصول على الوحدة نفسها مهما كانت المدخلات، أجرِ التحويل داخل الدالة:
bmi(weight, height) = (weight / height^2) in kg/m^2bmi(81 kg, 180 cm) الناتج 25 kg/m²bmi(80 kg, 5.9 ft) الناتج 24.7375131668 kg/m²يمكن أيضًا تعريف دالة بلا معاملات. اكتب قوسين فارغين عند تعريفها وعند استدعائها:
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²؛ انظر الأسماء. - يمكنك استخدام الأسماء الشائعة في جداول البيانات
avgوtotalوstdev. إذا عرّفتtotal(order)بنفسك، يكون تعريفك هو المستخدم. - يمكن للدالة والمتغير أن يشتركا في اسم. تقرأ
rateالمتغير وتستدعيrate(5)الدالة. - استدعِ الدالة دائمًا باستخدام الأقواس. اسم الدالة وحده لا يعرض شيئًا إذا لم يوجد متغير بالاسم نفسه. الاستثناءات هي
sumوtotalوsubtotalوgrand totalوaverageوmaxوmin، التي تحسب القيمة المطلوبة للأسطر السابقة؛ راجع جمع الأسطر السابقة.
الفواصل بين الوسائط
تفصل الفاصلة المتبوعة بمسافة بين الوسائط، بينما تُستخدم الفاصلة التي تتبعها ثلاثة أرقام بالضبط لفصل الآلاف، لتكتب المبالغ بالطريقة المعتادة:
tip(bill, pct) = bill * pcttip($1,200, 15%) الناتج $180.00tip($1200,15%) الناتج $180.00إذا احتاجت الدالة إلى قيم أكثر مما يحدده الفصل بالمسافات، تُعامَل كل فاصلة كفاصل بين الوسائط، كما في الاستدعاء الثاني. استخدم النقطة للأجزاء العشرية، مثل tip($48, 12.5%).
استخدام أسماء أخرى في ملاحظتك
يمكن للدالة استخدام متغيرات من ملاحظتك. تقرأ قيمها الحالية في كل مرة تستدعيها:
vat = 20%with_vat(price) = price * (1 + vat)with_vat(£50) الناتج £60.00vat = 5%with_vat(£50) الناتج £52.50يجب أن يكون المتغير موجودًا بالفعل عند تعريف الدالة، لذا ضع vat = 20% فوق with_vat. إذا لم يكن موجودًا بعد، فإن سطر التعريف يعرض خطأً.
معاملات الدالة محلية داخلها. المعامل المسمى price لا يقرأ متغيرًا باسم price في موضع آخر من الملاحظة ولا يغيّره:
price = £10double(price) = price * 2double(£3) الناتج £6.00price الناتج £10.00كما هو الحال مع المتغيرات، يمكنك استخدام دالة عرّفتها في كتلة حسابية داخل الكتل اللاحقة من الملاحظة نفسها. يعالج Varlig الملاحظة من الأعلى إلى الأسفل، لذا عرّف الدالة قبل أول سطر يستدعيها. لا يعرض الاستدعاء السابق للتعريف أي نتيجة.
دوال تستدعي دوال أخرى
يمكن للدوال الصغيرة أن تعتمد على بعضها:
day_rate = £400fee(days) = days * day_rateinvoice(days) = fee(days) * 1.2invoice(5) الناتج £2,400.00تتذكر الدالة نسخة الدالة المساعدة التي كانت موجودة عند تعريفها. إذا أعدت تعريف الدالة المساعدة نفسها في سطر لاحق، تظل الدوال المعرّفة سابقًا تستخدم النسخة القديمة:
shipping(order) = £4.95total(order) = order + shipping(order)shipping(order) = £2.95total(£30) الناتج £34.95shipping(£30) الناتج £2.95لاستخدام النسخة الجديدة من shipping، أعد تعريف total في سطر أسفلها. لا يحدث ذلك عند تعديل التعريف الأصلي في مكانه؛ إذ يعيد Varlig حساب الملاحظة من الأعلى، فتستخدم الأسطر اللاحقة كلها النسخة المعدلة.
يمكن للدالة أيضًا استدعاء دالة مساعدة تعرّفها في سطر لاحق. عندئذ تستخدم النسخة المتاحة من الدالة المساعدة وقت الاستدعاء، لذلك يجب أن تكون المساعدة معرّفة قبل استدعاء الدالة الخارجية:
checkout(order) = order + delivery(order)delivery(order) = if order >= £40 then £0 else £3.50checkout(£25) الناتج £28.50checkout(£60) الناتج £60.00شروط
استخدم if … then … else … لاختيار بين النتائج. أضف if أخرى بعد else لحالات أكثر من اثنتين:
postage(weight) = if weight <= 100 g then £0.85 else if weight <= 750 g then £1.55 else £3.20postage(90 g) الناتج £0.85postage(500 g) الناتج £1.55postage(1.2 kg) الناتج £3.20يُحسب الفرع الذي ينطبق شرطه فقط. يتيح ذلك تجنّب عمليات قد تفشل لولا هذا الشرط، مثل القسمة على صفر:
per_person(total, people) = if people > 0 then total / people else £0per_person(£90, 3) الناتج £30.00per_person(£90, 0) الناتج £0.00الاستدعاء الذاتي
يمكن للدالة استدعاء نفسها، بشرط وجود شرط يوقف ذلك في النهاية. تحسب هذه الدالة عدد المصافحات عندما يصافح كل شخص في المجموعة كل شخص آخر مرة واحدة:
handshakes(people) = if people <= 1 then 0 else (people - 1) + handshakes(people - 1)handshakes(6) الناتج 15handshakes(10) الناتج 45يضيف كل استدعاء مستوى من التداخل، والحد الأقصى هو 12 استدعاءً متداخلًا. تعمل handshakes(12)، لكن handshakes(13) تعرض Error: calculation limit. يُقبَل تعريف دالة لا تصل أبدًا إلى حالة التوقف، لكنها تصطدم بالحد نفسه عند استدعائها. ويمكن لدالتين استدعاء بعضهما ضمن الحد نفسه.
لعمليات العد المعتادة، تكون الدوال المدمجة أسرع ولا تخضع لهذا الحد. تعطي combination(10, 2) أيضًا 45، وتؤدي factorial(n) أوn! وظيفة المثال التقليدي للاستدعاء الذاتي.
القوائم والمصفوفات والمزيد
يمكن أن تكون الوسائط قوائم أو مصفوفات أو أعدادًا مركّبة، ويمكن لجسم الدالة استخدام أي دالة مدمجة:
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 في oats يُعامَل كسعر لكل kg، وأن كتابة £0.95/kg توضح المقصود صراحة. تؤدي كتابة السعر لكل وحدة في التعريف إلى إزالة التنبيه. - سطر واحد، صيغة واحدة. يتكون التعريف من تعبير واحد على سطر واحد. للحسابات متعددة الخطوات، عرّف دالة صغيرة لكل خطوة ثم اجمعها.
- إعادة التعريف غير الصحيحة تُبقي النسخة القديمة. إذا احتوى تعريف جديد لـ
tipعلى خطأ، يعرض السطر الخطأ وتظل النسخة السابقة الصحيحة منtipمتاحة. - قد تتغير النتائج عند إعادة حساب الملاحظة. تُحسب الاستدعاءات من جديد كل مرة، لذلك قد تعطي دالة تستخدم
randomأو تاريخ اليوم نتيجة جديدة. - تظهر أخطاء الحساب في الاستدعاء. إذا تسبب وسيط في فشل الصيغة، مثل القسمة على صفر، يعرض الاستدعاء ذلك الخطأ.
الحدود
| العنصر | الحد |
|---|---|
| عدد المعاملات لكل دالة | 32 |
| الاستدعاءات المتداخلة، حيث تستدعي دالة نفسها أو دالة أخرى | 12 |
| عدد الاستدعاءات أثناء حساب استدعاء واحد في المستوى الأعلى | 16,384 |
| الدوال المعرّفة في ملاحظة | 1,024 |
عند بلوغ أحد الحدود، تظهر Error: calculation limit. تستمر بقية الملاحظة في العمل. راجع الأخطاء والتشخيصات والحدود لمعرفة جميع الحدود.
مثال يجمع هذه العمليات
إليك فاتورة لعمل مستقل. يوجد الأجر وضريبة القيمة المضافة في الأعلى كقيم مسمّاة، وتتولى ثلاث دوال صغيرة الحساب:
# March invoiceday_rate = £450vat = 20%fee(days) = days * day_ratewith_vat(amount) = amount * (1 + vat)late_fee(amount, days_late) = if days_late > 30 then amount * 2% else £0design = fee(8) الناتج £3,600.00build = fee(4.5) الناتج £2,025.00subtotal = design + build الناتج £5,625.00with_vat(subtotal) الناتج £6,750.00late_fee(with_vat(subtotal), 45) الناتج £135.00غيّر day_rate أوvat فتتحدث جميع الأسطر التالية. وعندما يتأخر العميل في السداد، يضيف استدعاء واحد رسم التأخير.