تخطي إلى المحتوى
دليل 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²؛ انظر الأسماء.
  • يمكنك استخدام الأسماء الشائعة في جداول البيانات 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

يجب أن يكون المتغير موجودًا بالفعل عند تعريف الدالة، لذا ضع vat = 20% فوق with_vat. إذا لم يكن موجودًا بعد، فإن سطر التعريف يعرض خطأً.

معاملات الدالة محلية داخلها. المعامل المسمى price لا يقرأ متغيرًا باسم price في موضع آخر من الملاحظة ولا يغيّره:

calc
price = £10
double(price) = price * 2
double(£3) الناتج £6.00
price الناتج £10.00

كما هو الحال مع المتغيرات، يمكنك استخدام دالة عرّفتها في كتلة حسابية داخل الكتل اللاحقة من الملاحظة نفسها. يعالج 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 … لاختيار بين النتائج. أضف if أخرى بعد else لحالات أكثر من اثنتين:

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 في oats يُعامَل كسعر لكل kg، وأن كتابة £0.95/kg توضح المقصود صراحة. تؤدي كتابة السعر لكل وحدة في التعريف إلى إزالة التنبيه.
  • سطر واحد، صيغة واحدة. يتكون التعريف من تعبير واحد على سطر واحد. للحسابات متعددة الخطوات، عرّف دالة صغيرة لكل خطوة ثم اجمعها.
  • إعادة التعريف غير الصحيحة تُبقي النسخة القديمة. إذا احتوى تعريف جديد لـtip على خطأ، يعرض السطر الخطأ وتظل النسخة السابقة الصحيحة من tip متاحة.
  • قد تتغير النتائج عند إعادة حساب الملاحظة. تُحسب الاستدعاءات من جديد كل مرة، لذلك قد تعطي دالة تستخدم random أو تاريخ اليوم نتيجة جديدة.
  • تظهر أخطاء الحساب في الاستدعاء. إذا تسبب وسيط في فشل الصيغة، مثل القسمة على صفر، يعرض الاستدعاء ذلك الخطأ.

الحدود

العنصر الحد
عدد المعاملات لكل دالة 32
الاستدعاءات المتداخلة، حيث تستدعي دالة نفسها أو دالة أخرى 12
عدد الاستدعاءات أثناء حساب استدعاء واحد في المستوى الأعلى 16,384
الدوال المعرّفة في ملاحظة 1,024

عند بلوغ أحد الحدود، تظهر Error: calculation limit. تستمر بقية الملاحظة في العمل. راجع الأخطاء والتشخيصات والحدود لمعرفة جميع الحدود.

مثال يجمع هذه العمليات

إليك فاتورة لعمل مستقل. يوجد الأجر وضريبة القيمة المضافة في الأعلى كقيم مسمّاة، وتتولى ثلاث دوال صغيرة الحساب:

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 فتتحدث جميع الأسطر التالية. وعندما يتأخر العميل في السداد، يضيف استدعاء واحد رسم التأخير.