الماكرو

الماكرو

صعب

التعليمات

الماكرو جزء قوي من عدّة مبرمج Rust، والماكرو بالأمثلة وسيلة بسيطة نسبيًا للاستفادة من هذه القوة. لنكتب واحدًا!

السياق

ما هو الماكرو؟ تصفه ويكيبيديا هكذا:

الماكرو (اختصار لـ "macroinstruction"، من اليونانية μακρός بمعنى "طويل") في علم الحاسوب هو قاعدة أو نمط يحدّد كيف ينبغي ربط تسلسل إدخال معيّن (غالبًا تسلسل من المحارف) بتسلسل إخراج بديل (غالبًا هو أيضًا تسلسل من المحارف) وفق إجراء محدّد. وتُعرف عملية الربط التي تُجسّد (تحوّل) استخدام الماكرو إلى تسلسل بعينه باسم توسيع الماكرو.

واضح ومفيد! لكن لنكن أكثر تحديدًا: الماكرو صياغة خاصة تتيح لك توليد الكود وقت الترجمة. يمكن استخدام الماكرو في الحسابات وقت الترجمة، لكنه غالبًا مجرد أسلوب آخر لتجريد الكود. على سبيل المثال، من المحتمل أنك استخدمت بالفعل println!() وvec![]. كلاهما يستقبل عددًا غير محدد من الوسائط، لذا لا يمكن التعبير عنهما كدوال بسيطة. ومن ناحية أخرى، فإنهما يتوسّعان دائمًا إلى قدر من كود Rust القياسي تمامًا. إن كنت مهتمًا، يمكنك استخدام الأمر الفرعي cargo expand لعرض نتائج توسيع الماكرو في الكود الخاص بك.

لمزيد من المعلومات عن الماكرو في Rust، يحتوي كتاب Rust على فصل جيد عنه.

نص المسألة

يمكنك إنشاء Vec بأي طول مباشرةً باستخدام ماكرو vec![]. لكن Rust لا يوفّر وسيلة لإنشاء HashMap مباشرةً. عالج ذلك بكتابة ماكرو hashmap!().

على سبيل المثال، قد يكتب أحد مستخدمي مكتبتك hashmap!('a' => 3, 'b' => 11, 'z' => 32). وينبغي أن يتوسّع ذلك إلى الكود التالي:

{
   let mut hm = HashMap::new();
   hm.insert('a', 3);
   hm.insert('b', 11);
   hm.insert('z', 32);
   hm
}

لاحظ أن حزمة maplit توفّر ماكرو يحل هذا التمرين حلاً مثاليًا. من فضلك نفّذ حلّك الخاص بدلًا من استخدام هذه الحزمة؛ وحاول بنفسك قبل الاطلاع على الكود المصدري لها.


المصدر

Peter Goodspeed-Niklaus
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Rust Exercism

مستعد لبدء الماكرو؟

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