في Cargo Shuffle تعرّفت على مكدس البيانات في Factor وعلى كلمات إعادة الترتيب التي تعيد ترتيبه. يبني هذا التمرين على ذلك: ستُعرِّف كلمات تحسب انطلاقًا من مدخلاتها بدلًا من مجرد تحريكها.
تبدأ ! تعليقًا سطريًا، ويتجاهل Factor كل ما يأتي بعدها حتى نهاية السطر. تستخدم الأمثلة أدناه ! لشرح ما يفعله الكود ولبيان ما سيطبعه.
الكلمة هي تسمية Factor للدالة. استدعاء كلمة يسحب بعض القيم من أعلى المكدس ويدفع قيمًا أخرى مكانها. تسحب . القيمة العليا وتطبعها؛ أما كلمات الحساب على الأعداد الصحيحة + و- و* فتسحب عددين وتدفع الناتج:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
وثمة كلمة قريبة منها هي .s، تطبع كامل مكدس البيانات دون أن تستهلك أي قيمة. وهذا مفيد في المستمع (وهو الموجّه التفاعلي في Factor، حيث تكتب الكود وترى النتائج) لمعرفة ما تتركه قطعة الكود خلفها. ولهذا تنتهي بعض الأمثلة لاحقًا بـ .s بدلًا من .: فهي تترك أكثر من قيمة على المكدس، و.s تعرضها كلها.
توجد كلمات الحساب في مفردات math، لذا يحتاج أي ملف يستخدمها إلى math في سطر USING: الخاص به.
كل كلمة تُوثَّق بـ تأثير المكدس الخاص بها على الصيغة ( inputs -- outputs ). وهو عقد الكلمة: فهي تسحب المدخلات من أعلى المكدس وتترك المخرجات مكانها. أما الأسماء داخله فهي موجودة فقط لمساعدتك على قراءته، ولا يستخدمها Factor، فهو يتتبّع فقط ترتيب القيم على المكدس.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
أعلى المكدس هو المدخل الأيمن. لذا في 8 3 - تكون 3 في الأعلى، وتأثير المكدس هو ( x y -- difference )، والناتج هو 8 - 3.
وعلامة الاستفهام ? في نهاية المخرجات هي الاصطلاح الدال على «قيمة منطقية»، لكن تمرين اللازانيا يستخدم الأعداد فقط.
وستظهر أدناه واحدة من كلمات إعادة الترتيب من Cargo Shuffle: swap وهي ( x y -- y x )، وتقلب القيمتين العلويتين عندما يكون ترتيبهما خاطئًا للكلمة التالية.
تبدأ : تعريف الكلمة، ثم يأتي تأثير المكدس، ثم الجسم، ويُختم التعريف بـ ;.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
ويتحقق مصرّف Factor من أن الجسم يطابق فعلًا تأثير المكدس المعلَن: فأي كلمة تدّعي ( x -- y ) لكنها تترك صفرًا أو قيمتين على المكدس فلن تُصرَّف.
تعرّف CONSTANT: اسمًا لقيمة ثابتة. والثابت نفسه كلمة: فاستدعاؤه يدفع القيمة إلى المكدس:
CONSTANT: pi 3
pi pi * . ! => 9
CONSTANT: جزء من الصياغة الأساسية ولا يحتاج إلى سطر USING:. ضع الثوابت في أعلى الملف، قبل أي كلمة تستخدمها.
يمكن لجسم الكلمة أن يستدعي أي كلمة موجودة في النطاق، بما فيها كلمات عرّفتها سابقًا في الملف نفسه:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
وبهذه الطريقة تعيد المهمة الأخيرة في التمرين استخدام مهمة سابقة.
تستخدم الكلمات والثوابت معًا نمط lowercase-kebab-case: حروف صغيرة تصل بينها شُرَط (على سبيل المثال، expected-bake-time وpreparation-time).
في هذا التمرين ستكتب بعض الكود لمساعدتك على طهي لازانيا رائعة من كتاب الطبخ المفضّل لديك.
لديك أربع مهام، وكلها تتعلق بالوقت المستغرق في طهي اللازانيا.
عرّف الثابت expected-bake-time، الذي ينبغي أن يُرجع عدد الدقائق التي تحتاجها اللازانيا لتُخبز في الفرن.
وفقًا لكتاب الطبخ، تحتاج اللازانيا إلى البقاء في الفرن مدة إجمالية قدرها 40 دقيقة.
expected-bake-time .
! => 40
عرّف الكلمة preparation-time. تأخذ عدد الطبقات التي أضفتها إلى اللازانيا من المكدّس، وتترك عدد الدقائق التي استغرقتها في تحضيرها، بافتراض أن تحضير كل طبقة يستغرق دقيقتين.
4 preparation-time .
! => 8
عرّف الكلمة remaining-time. تأخذ عدد الدقائق التي قضتها اللازانيا بالفعل في الفرن، وتترك عدد الدقائق التي ما زال عليها أن تبقى فيها.
25 remaining-time .
! => 15
عرّف الكلمة total-working-time. تأخذ وسيطين من المكدّس (أولًا عدد طبقات اللازانيا، ثم عدد الدقائق التي قضتها اللازانيا بالفعل في الفرن)، وتترك الزمن الإجمالي المستغرق في الطهي حتى الآن: زمن التحضير زائد الزمن الذي قضيته في الفرن بالفعل.
3 20 total-working-time .
! => 26
سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.