تخطَّ إلى المحتوى

10. الذاكرة للمبتدئ: ثلاث قواعد

أن تعرف ثلاث قواعد للذاكرة في ميم، وأن تقرأ رسالة الكاشف حين تخطئ فيها: أي سطر، وماذا حدث.

لا جامع قمامة في ميم: الذاكرة التي يأخذها برنامجك تعيدها أنت، أو تعود كلها عند خروجه. ثلاث قواعد تكفيك الآن:

  1. احجز: ما تبنيه يأخذ مكاناً في الذاكرة: قائمة [...]، وقاموس {...}، ونص تبنيه بـ + أو نص(...). أما النص المكتوب بين علامتي تنصيص كما هو فلا يُحجز.
  2. حرّر: حين تنتهي من شيء بنيته، أعده بـ حرر(الاسم)، مرة واحدة، ولا تستعمله بعدها.
  3. خاتمه: خاتمه حرر(الاسم) تكتبها بجانب سطر الحجز، فيُحرَّر الشيء وحده عند الخروج من الكتلة (آخر البرنامج، أو آخر كل دورة في حلقة). هكذا لا تنساه.
القواعد الثلاث
# القاعدة 1: ما تبنيه يُحجز: قائمة، ونص بـ +
اسماء = ["ليلى", "عمر"]
تحية = "أهلاً يا " + اسماء[0]
اطبع(تحية)
# القاعدة 2: حرّر ما انتهيت منه، مرة واحدة
حرر(تحية)
# القاعدة 3: خاتمه تحرّر عند الخروج من الكتلة، بجانب سطر الحجز
خاتمه حرر(اسماء)
لكل ع في مدى(0, 3):
سطر = "سطر " + نص(ع)
خاتمه حرر(سطر)
اطبع(سطر)
مخرجات مسجّلة من المجمّعmeem --debug-mem 10ب_قواعد.م · meem 0.10.0+b01b55f
أهلاً يا ليلىسطر 0سطر 1سطر 2

المثال شُغّل بالخيار --debug-mem، وهو يطبع في آخر البرنامج كل ما حُجز ولم يُحرَّر. ولم يطبع شيئاً، فكل ما حُجز عاد.

meem برنامج.م يشغّل برنامجك ومعه كاشف الذاكرة: يراقب ما تحجزه وما تحرّره. فإن خالفت القاعدة الثانية أوقف البرنامج برسالة فيها السطر.

استعمال قائمة بعد تحريرها:

استعمال بعد التحرير
درجات = [90, 75]
حرر(درجات)
اطبع(طول(درجات))
مخرجات مسجّلة من المجمّعmeem 10ب_بعد_حرر.م · meem 0.10.0+b01b55f
[خطأ تشغيل E0428] سطر 3:10 - الحاوية 'درجات' استُعملت بعد تحريرها (قيمتها لاشيء)  اطبع(طول(درجات))

رمز الخروج: 3

في فهرس الأخطاء: E0428

سطر 3:10 يعني السطر الثالث، الحرف العاشر. وE0428 معرّف الخطأ، وشرحه في فهرس الأخطاء.

وإن وصلت إلى القائمة نفسها باسم آخر، فالكاشف يذكر أيضاً أين أُنشئت وأين حُرّرت:

الاسم الآخر يرى القائمة المحرَّرة
درجات = [90, 75]
نسخة = درجات
حرر(درجات)
اطبع(نسخة[0])
مخرجات مسجّلة من المجمّعmeem 10ب_اسم_آخر.م · meem 0.10.0+b01b55f
[خطأ تشغيل E0429] سطر 4:10 - استعمال القائمة أو القاموس بعد التحرير (أُنشئت في السطر 1 وحُرّرت في السطر 3)  اطبع(نسخة[0])

رمز الخروج: 3

في فهرس الأخطاء: E0429

نسخة = درجات لا تنسخ القائمة: الاسمان لقائمة واحدة، فحين حُرّرت في السطر 3 لم يبق لـ نسخة شيء. (E0429)

وإن نسيت التحرير، فلا خطأ: كل شيء يعود عند الخروج. لكن --debug-mem يخبرك بما بقي وسطره:

نسيان التحرير
درجات = [90, 75]
وصف = "عدد الدرجات: " + نص(طول(درجات))
اطبع(وصف)
مخرجات مسجّلة من المجمّعmeem --debug-mem 10ب_نسيان.م · meem 0.10.0+b01b55f
عدد الدرجات: 2
[ذاكرة] معلومة: كتل لم تُحرَّر من الافتراضي: 3 (97 بايت)، تعود للنظام عند الخروج  سطر 1: كتلتان، 56 بايت  سطر 2: كتلة واحدة، 41 بايت  تلميح: الحجز المتكرر في سطر واحد (حلقة في الغالب) يُعاد بـ خاتمه حرر(...) بعد إنشائه، أو بساحة للمرحلة

السطر 1 حجز القائمة (كتلتان: رأسها وبياناتها)، والسطر 2 حجز النص.

أصلح البرنامج «نسيان التحرير» أعلاه بحيث لا يطبع --debug-mem شيئاً، بالقاعدة الثالثة.

اعرض الحل
الحل
درجات = [90, 75]
خاتمه حرر(درجات)
وصف = "عدد الدرجات: " + نص(طول(درجات))
خاتمه حرر(وصف)
اطبع(وصف)
مخرجات مسجّلة من المجمّعmeem --debug-mem 10ب_حل.م · meem 0.10.0+b01b55f
عدد الدرجات: 2
  • استعمال الشيء بعد حرر: خطأ تشغيل E0428 بالاسم نفسه، وE0429 باسم آخر. انقل حرر بعد آخر استعمال، أو استعمل خاتمه حرر.
  • تحرير الشيء نفسه مرتين: بالاسم نفسه E0347 «تحرير حاوية قيمتها لاشيء»، وباسمين «تحرير مزدوج» (E0350 للقائمة والقاموس، وE0431 للنص).
  • ظن أن ب = ا تنسخ القائمة: لنسخة مستقلة استعمل نسخ(ا)، وحرّر كلاً منهما.

الذاكرة في ميم · الذاكرة في الحلقات الطويلة