مشروع: أكثر الكلمات تكراراً
الفكرة: تكرار <ملف> [عدد_الأوائل] يعدّ كلمات الملف، ويطبع عددها وعدد المختلف منها، ثم أكثرها تكراراً.
البيانات
رابط إلى قسم «البيانات»ميم لغة برمجة عربية، والبرمجة بالعربية ممتعة. في ميم تكتب البرنامج بالعربية، ثم يبنيه المجمّع ملفاً واحداً. لغة ميم صغيرة: كلمات قليلة، وقواعد واضحة. البرمجة بميم تعلّمك الذاكرة: من يحجز، ومن يحرّر؟ ميم، ميم، ميم!
البرنامج
رابط إلى قسم «البرنامج»# أداة سطر أوامر: أكثر الكلمات تكراراً في ملف نصي# الاستعمال: تكرار <ملف> [عدد_الأوائل]استورد نظاماستورد ملفاتاستورد رياضيات
اخطاء: استعمال_خاطئ
هيكل مدخل: كلمة نص مرات عدد
ثابت علامات = ".،!؟,;:\"()"
داله نظف(كلمة نص) نص: # يحذف علامات الترقيم من آخر الكلمة. جزء يرجع عرضاً بلا نسخ، لكن طول ويحوي عليه يحجزان نسخاً لا تُعاد (0.9.1) ن = كلمة طالما طول(ن) > 0 و يحوي(علامات, جزء(ن, طول(ن) - 1, طول(ن))): ن = جزء(ن, 0, طول(ن) - 1) ارجع ن
داله قبل(ا مدخل, ب مدخل) منطقي: اذا ا.مرات != ب.مرات: ارجع ا.مرات > ب.مرات ارجع ا.كلمة < ب.كلمة
داله اقرأ_الوسائط() !قائمة[نص]: و = نظام.وسائط() اذا طول(و) < 1 او طول(و) > 2: ارجع خطأ.استعمال_خاطئ ارجع و
داله عد_الكلمات(مسار نص, عداد قاموس[نص, عدد]) !عدد: سطور = جرّب ملفات.اقرأ_سطور(مسار) خاتمه حرر(سطور) مجموع = 0 لكل سطر في سطور: قطع = تقسيم(قص_الفراغات(سطر), " ") لكل قطعة في قطع: ك = نظف(قطعة) اذا طول(ك) == 0: تجاوز مجموع += 1 اذا يوجد(عداد, ك): عداد[ك] = عداد[ك] + 1 غير ذلك: عداد[ك] = 1 حرر(قطع) ارجع مجموع
داله رئيسي() !فراغ: و = اقرأ_الوسائط() والا خ: اطبع("الاستعمال: تكرار <ملف> [عدد_الأوائل]") ارجع خ كم = 10 اذا طول(و) == 2: كم = عدد(و[1]) والا خ: اطبع("عدد الأوائل ليس عدداً: ", و[1]) ارجع خ عداد قاموس[نص, عدد] = {} خاتمه حرر(عداد) مجموع = عد_الكلمات(و[0], عداد) والا خ: اطبع("تعذّرت قراءة ", و[0], ": ", خ) ارجع خ مدخلات قائمة[مدخل] = [] خاتمه حرر(مدخلات) لكل ك في مفاتيح(عداد): اضف(مدخلات, مدخل(ك, عداد[ك])) رتب_ب(مدخلات, قبل) اطبع("كلمات: ", مجموع, "، مختلفة: ", طول(عداد)) لكل ع في مدى(0, رياضيات.اصغر_صحيح(كم, طول(مدخلات))): م = مدخلات[ع] اطبع(رياضيات.نسق_عدد(ع + 1, 3, خطاء), " ", رياضيات.نسق_عدد(م.مرات, 8, خطاء), " ", م.كلمة)
رئيسي() والا خ: نظام.انهِ(1)بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 69.1 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.
غيّرنا عن نسخة التقرير شيئين: حذفنا سطر «الزمن الداخلي» لأن ناتجه يتغير في كل تشغيل، وصحّحنا تعليق نظف الذي كان يقول «عرض بلا حجز».
خطوة خطوة
رابط إلى قسم «خطوة خطوة»- الوسائط:
اقرأ_الوسائطترجع!قائمة[نص]، وخطؤهااستعمال_خاطئمن كتلةاخطاء:. ورئيسيتعالجه بـوالا خ:فتطبع طريقة الاستعمال. - القراءة:
جرّب ملفات.اقرأ_سطور(مسار)تقرأ الملف كله سطوراً، وخاتمه حرر(سطور)بجانبها تعيد القائمة عند الخروج. - العدّ: كل سطر يُقسم بـ
تقسيمإلى قطع، ونظفتحذف علامات الترقيم من آخر الكلمة بـجزء، والقاموسعداديعدّ. - الترتيب:
رتب_ب(مدخلات, قبل)بدالة مقارنة: الأكثر تكراراً أولاً، ثم بترتيب الحروف. - الطباعة:
رياضيات.نسق_عدديحاذي الأعمدة بعرض ثابت.
ما كان صعباً
رابط إلى قسم «ما كان صعباً»- الكلفة الخفية (في 0.9.1):
نظفتستعملجزءلأنه «عرض» بلا نسخ. لكن في 0.9.1 كانطول(ن)على العرض داخل الحلقة يحجز نسخة صغيرة في كل مرة، لا تُعاد ولا تُرى في الشيفرة، ولم يظهر ذلك إلا بـ--debug-mem. في 0.10.0 لا تحجز العمليات على العرض شيئاً. - الذاكرة: على ملف 9 م.ب بلغت ذروة الملف المبني 69.6 م.ب، مقابل 10.7 لبرنامج بايثون المماثل: ميم تقرأ الملف كله وسطوره في الذاكرة (لا قراءة سطراً سطراً بعد)، وفوقها النسخ الخفية في 0.9.1. لم يُعَد هذا القياس على 0.10.0.
- الزمن: 0.70 ث مبنياً ساكناً، و0.56 ث مبنياً بـ
--dynamic، وبايثون 0.74 ث.
ما تعلّمناه
رابط إلى قسم «ما تعلّمناه»- الأخطاء قيم: نسيان معالجة
!قائمةخطأ ترجمة، فالبرنامج لا يصل إلى التشغيل وفيه فشل مهمَل. خاتمه حرر(...)بجانب سطر الحجز تكفي في الحالات البسيطة، و--debug-memيقول أي سطر لم يحرّر.- في حلقة طويلة على نصوص من
جزء، احسبطولمرة واحدة واحفظه.