مرحبًا بك في 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: حروف صغيرة تربطها شرطات.
أنت بحّار على الرصيف تعيد رصّ صناديق الشحن. كل مهمة هي كلمة واحدة لا يستخدم جسمها إلا كلمات إعادة ترتيب المكدس، دون أي حساب.
عرّف الكلمة swap-crates. تأخذ صندوقين من المكدس وتتركهما خلفها بترتيب معاكس.
1 2 swap-crates .s
! 2
! 1
عرّف الكلمة clear-spill. تأخذ ثلاثة صناديق من المكدس وتترك الصندوقين السفليين خلفها، وتتخلص من الصندوق العلوي.
1 2 3 clear-spill .s
! 1
! 2
عرّف الكلمة peek-under. تأخذ صندوقين من المكدس وتتركهما خلفها مع نسخة من الصندوق الأدنى موضوعة في الأعلى.
1 2 peek-under .s
! 1
! 2
! 1
عرّف الكلمة tidy-deck. تأخذ ثلاثة صناديق من المكدس، بالترتيب x y z، وتترك خلفها z z y: أزل الصندوق السفلي، ثم اترك نسختين من الصندوق العلوي تحت الصندوق الأوسط.
1 2 3 tidy-deck .s
! 3
! 3
! 2
سجّل في Exercism لتتعلّم وتتقن Factor عبر 47 مفهومًا163 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.