بسم الله الرحمن الرحيم
هذا الدرس الأخير من الفصل الأول في الباب الأول، لا تنس مراجعة الدروس السابقة!
تعريف بالكتاب ومقدمة:
العبارات الشرطية
كل الدروس السابقة ما تحدثنا فيها عن كيف نشترط شروطًا على المدخل الداخل للوظيفة، مثلًا هب أنك تود حساب القيمة المطلقة لأي رقم، والقيمة المطلقة ليست إلا إرجاع العدد موجبًا، ولو كان صِفرًا نرجع العدد نفسه.
تمثيلها رياضيًا:
|س| = س، إذا س > 0
|س| = 0، إذا س = 0
|س| = -س، إذا س < 0
١. القيمة المطلقة للرقم س تساوي الرقم نفسه إذا كان أكبر من الصفر،
٢. القيمة المطلقة للرقم س تساوي الصفر لو كان س يساوي الصفر،
٣. القيمة المطلقة للرقم س تساوي سالب س (-س) لو كان س أصغر من الصفر.
مثلا لو كانت س = ٦، فإن القيمة المطلقة هي الرقم نفسه، ولو كانت س = -٦، فإن القيمة المطلقة هي معكوس الرقم، وما معكوس السالب؟ الموجب، إذن سيعود ٦، بالموجب.
كيف نمثل هذا في لغة scheme؟
بالعبارات الشرطية، حتى نشترط على المدخل ما نريد. تعليمتان تستعملان في لغة scheme للعبارات الشرطية، هما:
- cond
- if
التعليمة الأولى (cond)
التعليمة الأولى اسمها cond، اختصار كلمة conditional، وصيغتها:
(cond (<p1> <e1>)
(<p2> <p2>)
...
(<Pn> <En>))
كلمة cond متبوعة بأقواس، وكل قوس يحوي شرطًا. مثلًا هذا الشرط الأول:
(<p1> <e1>)
وحرف p اختصار كلمة فرض predicate، ترجمته إلى شرط، أما حرف e فاختصار كلمة تعبير expression، سبق شرحه. وضعت ثلاث نقاط … لتفهم أنك لو أحببت وضعت ما تشاء من الشروط، ولو كانت مئة شرط.
المفسر سيبدأ التحقق من الشروط شرطًا شرطًا، فإن كان الشرط ينطبق فإنه سيرجع قيمة صواب true، أي أن الشرط صحيح، وبما أنه صحيح فإن سينفذ التعبير الذي بجانب الشرط، ولو كان الشرط لا ينطبق فإنه سيرجع قيمة خطأ false، أي أن الشرط ما انطبق، ولن ينفذ التعبير الذي يلي الشرط، بل سيذهب ويتحقق من الشرط الذي يليه، وهكذا…
سنكتب وظيفة للقيمة المطلقة باستعمال التعليمة الأولى ونسميها abs، اختصارًا لكلمة Absolute، وهذه الوظيفة تستقبل مدخلًا واحدًا، ثم تختبره متحققةً من ثلاثة شروط:
١. إذا كان المدخل أكبر من الصفر،
٢. إذا كان المدخل يساوي الصفر،
٣. إذا كان المدخل أصغر من الصفر.
(define (abs number)
(cond ((> number 0) number)
((= number 0) 0)
((< number 0) (- number))))
استعملنا علامة المساواة = والأكبر من < والأصغر من >. لماذا بدأنا بوضع الإشارة؟
راجع الدرس الثاني حتى تفهم البادئة البولندية.
عند وضع إشارة – وتمرير قيمة واحدة فإنه سيرجع معكوسها:
(- number)
الشرط الأول:
(> number 0)
فإن كان ينطبق الشرط، أي كان صحيحًا، فإن التعبير الذي يليه سيطبق، والتعبير الذي يليه هو:
number
أي ارجع الرقم نفسه ولا تفعل به شيئًا. اختبر الوظيفة وجربها بتمرير الرقم ٥ لها وانظر ناتجها:
(abs 5)
لو قلتُ لك: أني تحققت من كل الشروط ولم ينطبق أي شرط، وفي هذه الحالة أود طباعة الرقم ٩٩٩٩، مشيرًا به أن كل الشروط لم تطبق، فأي شيء أفعل؟
تستطيع كتابة وظيفة أو أي حل آخر لمساعدتي، ولأني لا أود تعبك فعند اللغة الحل، وهي استعمال كلمة else.
سنعدل وظيفة القيمة المطلقة ونضيف لها كلمة، وكأننا سنقول: إن كان المدخل أصغر من الصفر فارجع معكوسه، وإلا فارجع المدخل نفسه:
(define (abs number)
(cond ((< number 0) (- x))
(else number)))
أضفنا كلمة else داخل أقواس، وثم بعدها التعبير المراد فعله، وفي حالتنا كان إرجاع الرقم نفسه.
التعليمة الثانية (if)
التعليمة الثانية اسمها if، وصيغتها:
(if <predicate> <consequent> <alternative>)
الشرط predicate،
والنتيجة التي ستتحقق إذا الشرط صحيح consequent،
الخيار البديل alternative إن لم يتحقق الشرط.
نعيد كتابة وظيفة القيمة المطلقة باستعمال هذه التعليمة؟
انظر كيف سنكتبها:
(define (abs number)
(if (< number 0)
(- x)
x))
الشرط كان هل الرقم أصغر من الصفر؟
(if (< number 0)
إن تحقق الشرط وكان الرقم حقًّا أصغر من الصفر فإن الذي سينفذ هو هذا الجزء الذي يعيد معكوس الرقم:
(- x)
وإن لم يتحقق الشرط؟
سنطبق هذا الجزء الأخير:
x))
عبارات شرطية معقدة
ماذا لو أني أردت وضع شرطين في شرط واحد، مثلًا أود التحقق لو كان المدخل في نطاق أريده، النطاق محصور بين ٥ و١٠، فماذا نفعل؟
تعطينا اللغة تعطينا ثلاثة أشياء، هي واو العطف (و and) و(أو or) و(النفي not).
نعطف شيئًا على شيء، مثلًا لو أردنا التحقق هل الرقم بين النطاق ٥ و١٠؟
سهلة، سنقول هل المُدخَل أكبر من ٥ وأصغر من ١٠؟
قلنا: (وأصغر)، الواو، حرف العطف.
(define (is_it_in_range number) (and (> number 5) (< number 10)))
بمعنى أن الشرط الأول (5 number <) عليه أن يتحقق، أن يكون صحيحًا، وثم على الشرط الثاني أن يتبع أخاه ويكون صحيحًا، وهكذا…
طيب، ماذا لو أردنا شرطًا واحدًا يتحقق؟
سنستعمل كلمة or:
(or (< number 0) (= number 0))
ولما نستعمل (أو) فإن معناها: إذا كان أحد الشروط على الأقل صحيحًا: هذا أو ذاك. نحن لا نشترط على كل شرط أن يكون صحيحًا مثل حرف العطف (و)، بل نقول إنا نودُّ شرطًا واحدًا على الأقل أن يكون صحيحًا، أما هذا وأما ذاك، ولا ضير لو كانا معًا، لكن الحد الأدنى أن يكون أحدهما صحيحًا.
أما الكلمة الأخيرة (النفي not) فإنها ترجع معكوس القيمة، لو كانت صوابًا true سترجع ضده (أي false)، ولو كانت خطأ سترجع ضده (أي true).
الخاتمة
وهنا نختم الفصل الأول من الباب الأول، الذي بدأ عند صفحة ١ وانتهى عند ٣٩، وكل ما تبقى عليك أن تفتح الكتاب وتحل التمارين التي فيه.
وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق!
وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.