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

14. الذاكرة في الحلقات الطويلة

أن تطبّق القواعد الثلاث في الحلقات الطويلة: ما يُبنى في كل دورة يُحرَّر في آخرها.

كل نص تبنيه، وكل قائمة وقاموس، يأخذ مكاناً في الذاكرة من مخصص، وهو ما تُحجز منه الذاكرة وتُعاد إليه. وفي الحلقات:

  1. ما تبنيه (نص بـ+ أو نص(...)، قائمة، قاموس) يبقى حتى نهاية البرنامج إن لم تحرره، ثم يعود كله عند الخروج. وفي برنامج قصير لا ضرر في ذلك.
  2. نص تبنيه وتسنده إلى متغير داخل حلقة طويلة حرّره بـخاتمه حرر(الاسم) بعد إنشائه، فيعود في آخر كل دورة. (حرر(س) تعيد المكان فوراً، وخاتمه جملة تؤجّل الجملة إلى الخروج من الكتلة.)
  3. نص تبنيه ولا تسنده إلى متغير، بل تمرّره مباشرة إلى اطبع أو طول أو مقارنة، يعود وحده بعد استعماله (منذ 0.8.0): اطبع("سطر " + نص(ع)) لا يحتاج حرر.

لترى ما بقي، شغّل البرنامج بالخيار --debug-mem: يطبع في آخره كل سطر حجز ولم يُحرَّر، بعدد كتله وحجمها، الأكبر أولاً. هذا البرنامج يبني ألف نص في حلقة بلا حرر:

ا = "س"
لكل ع في مدى(0, 1000):
ن = "سطر " + نص(ع)

وما يطبعه meem برنامج.م --debug-mem في آخره (من الكتاب المرجعي):

[ذاكرة] معلومة: كتل لم تُحرَّر من الافتراضي: 1000 (26890 بايت)، تعود للنظام عند الخروج
سطر 3: 1000 كتلة، 26890 بايت
تلميح: الحجز المتكرر في سطر واحد (حلقة في الغالب) يُعاد بـ خاتمه حرر(...) بعد إنشائه، أو بساحة للمرحلة
مثال
لكل ع في مدى(0, 3):
ن = "سطر " + نص(ع)
خاتمه حرر(ن)
اطبع(ن)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
سطر 0سطر 1سطر 2

جرّب هذا المثال في الملعب

نسيان التحرير في حلقة طويلة يرفع ذروة استهلاك الذاكرة، ويكشفها الخيار --debug-mem بالسطر. واستعمال نص بعد تحريره يكشفه الكاشف (يعمل افتراضياً حين تشغّل meem برنامج.م) خطأ تشغيل بسطره. وتحرير القيمة نفسها مرتين خطأ:

يسبب الخطأ
م = جديد(1)
حرر(م)
حرر(م)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
[خطأ تشغيل E0349] سطر 3:1 - تحرير مؤشر قيمته لاشيء (هل حُرّر من قبل؟)  حرر(م)

رمز الخروج: 3

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

جرّب هذا المثال في الملعب

يصلحه
م = جديد(1)
حرر(م)
اطبع(م == لاشيء)
المخرج المسجَّل في الكتاب المرجعيmeem برنامج.م · 0.10.0
صواب

جرّب هذا المثال في الملعب

ابنِ ألف نص في حلقة («سطر» ورقمه) واجمع أطوالها، وحرّر كل نص في آخر دورته بـ خاتمه حرر. شغّله بـ --debug-mem: إن لم يطبع تقرير ذاكرة فلا شيء باقٍ.

اعرض الحل
الحل
مجموع = 0
لكل ع في مدى(0, 1000):
ن = "سطر " + نص(ع)
خاتمه حرر(ن)
مجموع += طول(ن)
اطبع("مجموع الأحرف: ", مجموع)
مخرجات مسجّلة من المجمّعmeem --debug-mem 13_حل.م · meem 0.10.0+b01b55f
مجموع الأحرف: 6890

الدرس 10: ثلاث قواعد · الذاكرة اليدوية · مرجع الذاكرة