when
في Scheme، رغم أن if أنيق ومتعدد الاستخدامات، قد يصبح مربكًا عند استخدامه بدون else صريح. يحدث هذا خصوصًا عندما يكون المقصود تنفيذ فرع واحد فقط عندما يكون الشرط صحيحًا، دون إجراء بديل لحالة false. في مثل هذه السيناريوهات، توفر بنية when بديلًا أوضح وأكثر إيجازًا.
يبدو الشكل الأساسي لـ when كالتالي:
(when test-is-true
do-this
do-that)- إذا قيّم
testإلى true (#t)، تُنفَّذ جميع التعبيرات في نص بنيةwhenبالتسلسل. - إذا قيّم
testإلى false (#f)، لا يحدث شيء ولا تُرجع أي قيم.
مثال
(when (< 0 1)
(lumi-message "Condition is true!")
(lumi-message "Executing additional actions."))مقارنة if وwhen
لفهم الفرق بين if وwhen بشكل أفضل، انظر المثال التالي حيث يُستخدمان معًا:
(if (= 0 1)
(lumi-message "This will not run")
(when (< 0 1)
(lumi-message "The 'when' condition is true!")
(lumi-message "Executing multiple actions within 'when'.")))الشرح:
شرط
if:- يتحقق الاختبار
(= 0 1)مما إذا كان 0 يساوي 1. - بما أن هذا خاطئ (
#f)، يُنفَّذ فرعelseمنif.
- يتحقق الاختبار
بنية
whenفي فرعelse:- يتحقق اختبار
when(< 0 1)مما إذا كان 0 أقل من 1. - بما أن هذا صحيح (
#t)، تُنفَّذ جميع التعبيرات داخل نصwhenبالتسلسل:- أولًا، تطبع
"The 'when' condition is true!". - ثم تطبع
"Executing multiple actions within 'when'.".
- أولًا، تطبع
- يتحقق اختبار
لماذا تستخدم when هنا؟
- استخدام
whenبدلifآخر يبسّط المنطق عندما لا حاجة لفرعelseصريح. - يوضح
whenأن الفرع الصحيح فقط هو المعني، ما يقلّل الارتباك المحتمل.
ملخص
- استخدم
ifعندما تحتاج فرعًا صحيحًا وفرعًا خاطئًا. - استخدم
whenعندما يوجد فرع واحد فقط للحالة الصحيحة، خصوصًا عند تنفيذ إجراءات متعددة. - الجمع بين
ifوwhenيساعد على بناء شروط أكثر تعقيدًا بوضوح وإيجاز.