المسارات
/
Factor
Factor
/
التمارين
/
خلط الحمولة
خلط الحمولة

خلط الحمولة

تمرين تعلّمي

مقدمة

مرحبًا بك في Factor! إنّ Factor لغة تسلسلية: فبدلًا من استدعاء الدوال مثل square(add(2, 3))، تكتب صفًا من الكلمات من اليسار إلى اليمين (2 3 + square)، وهي تمرّر القيم إلى بعضها بعضًا عبر مكدس بيانات مشترك. تخيّل مكدّسًا من صناديق الشحن على رصيف، وأحدثها في الأعلى.

التعليقات

تبدأ علامة ! تعليقًا سطريًا، فيتجاهل Factor كل ما يلي ! حتى نهاية السطر. وتستخدم الأمثلة أدناه ! لبيان ما يفعله الكود.

مكدس البيانات

كتابة قيمة حرفية تدفعها إلى أعلى المكدس. ويُقرأ الكود من اليسار إلى اليمين.

1 2 3    ! stack (bottom → top): 1 2 3

كل كلمة تقرأ مدخلاتها من أعلى المكدس وتكتب مخرجاتها هناك مرة أخرى. وتسحب . القيمة العليا وتطبعها؛ أما .s فتطبع المكدس كاملًا دون أن تستهلك شيئًا، وهذا مفيد لرؤية ما تركه مقطع من الكود خلفه.

تأثيرات المكدس

تُوثَّق كل كلمة بـتأثير مكدس على الصيغة ( inputs -- outputs ). وهو عقد الكلمة: تسحب الكلمة المدخلات من أعلى المكدس وتترك المخرجات في مكانها. والأسماء داخله توثيق موجّه للبشر، فالمكدس نفسه يعتمد على الموضع لا على الأسماء. وأعلى المكدس هو الاسم الأيمن.

تعريف كلمة

تبدأ : تعريف كلمة، ثم يأتي تأثير المكدس، ثم الجسم، ثم تنهيه ;. ويتحقق مُصرِّف Factor من أن الجسم يترك فعلًا ما يصرّح به تأثير المكدس.

: restow ( a b -- b a ) swap ;

كلمات إعادة الترتيب

تعيد كلمات kernel هذه ترتيب أعلى المكدس دون إجراء أي حسابات، فهي تكتفي بتحريك الصناديق هنا وهناك:

dup  ( x   -- x x   )    ! copy the top crate
drop ( x   --       )    ! remove the top crate
swap ( x y -- y x   )    ! flip the top two
over ( x y -- x y x )    ! copy the second crate onto the top
nip  ( x y -- y     )    ! remove the second crate
rot  ( x y z -- y z x )  ! roll the third crate up to the top

استخدم dup عندما يجب أن يغذّي صندوق واحد كلمتين، وdrop للتخلّص من صندوق، وswap عندما يكون الصندوقان العلويان في ترتيب خاطئ، وover أو nip للعمل مع الصندوق الذي تحته، وrot لجلب صندوق مدفون إلى الأعلى.

وتتبع العائلة الأوسع (-rot، dupd، swapd، 2dup، …) الفكرة نفسها، وستصادف تلك الكلمات لاحقًا.

كيف تتآلف الكلمات

الكلمات المكتوبة في صف تعمل من اليسار إلى اليمين: كل كلمة تعمل على المكدس الذي تركته الكلمة التي قبلها. إليك ما تفعله swap nip بالمكدس 1 2 (من الأسفل → الأعلى)، كلمة تلو الأخرى:

1 2     ! 1 2     the starting crates
swap    ! 2 1     swap flipped the top two
nip     ! 1       nip dropped the 2nd-from-top crate (the 2)

وهنا dup rot على الصناديق الابتدائية نفسها، مرة أخرى كلمة تلو الأخرى:

1 2     ! 1 2     the starting crates
dup     ! 1 2 2   dup copied the top crate
rot     ! 2 2 1   rot rolled the 3rd-from-top crate up to the top

اصطلاحات التسمية

تستخدم الكلمات lowercase-kebab-case: حروف صغيرة تربطها شرطات.

جولة: إعادة ترتيب المكدس

التعليمات

أنت بحّار على الرصيف تعيد رصّ صناديق الشحن. كل مهمة هي كلمة واحدة لا يستخدم جسمها إلا كلمات إعادة ترتيب المكدس، دون أي حساب.

1. بادل بين الصندوقين العلويين

عرّف الكلمة swap-crates. تأخذ صندوقين من المكدس وتتركهما خلفها بترتيب معاكس.

1 2 swap-crates .s
! 2
! 1

2. أزل الصندوق المنسكب

عرّف الكلمة clear-spill. تأخذ ثلاثة صناديق من المكدس وتترك الصندوقين السفليين خلفها، وتتخلص من الصندوق العلوي.

1 2 3 clear-spill .s
! 1
! 2

3. احتفظ بنسخة من الصندوق الأسفل

عرّف الكلمة peek-under. تأخذ صندوقين من المكدس وتتركهما خلفها مع نسخة من الصندوق الأدنى موضوعة في الأعلى.

1 2 peek-under .s
! 1
! 2
! 1

4. رتّب السطح

عرّف الكلمة tidy-deck. تأخذ ثلاثة صناديق من المكدس، بالترتيب x y z، وتترك خلفها z z y: أزل الصندوق السفلي، ثم اترك نسختين من الصندوق العلوي تحت الصندوق الأوسط.

1 2 3 tidy-deck .s
! 3
! 3
! 2
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Factor Exercism

مستعد لبدء خلط الحمولة؟

سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.