مشروع: عدّاد أسطر المجلدات
الفكرة: مثل cloc مصغّراً: يمشي في مجلد وما تحته، ويعدّ لكل امتداد عدد الملفات والأسطر والأحرف، ويعدّ الملفات الثنائية والممنوعة.
البيانات
رابط إلى قسم «البيانات»مجلد «وثائق» فيه مجلد فرعي، وملفات نصية بامتدادات مختلفة، وملف بلا امتداد، وملف ثنائي:
بلا امتداد
# دليل سطر أول سطر ثانٍ
ملف ثنائي (5 بايتات): لا يُعرض.
اطبع("مرحبا")
اطبع("وداعا")
اطبع("!")
# ملاحظات فقرة
البرنامج
رابط إلى قسم «البرنامج»# برنامج نظامي صغير: يمشي في شجرة مجلد ويعدّ الملفات والأسطر لكل امتداد (كـ cloc مصغّر)استورد نظاماستورد ملفاتاستورد مساراتاستورد رياضيات
هيكل احصاء: امتداد نص ملفات عدد اسطر عدد بايتات عدد
هيكل حصيلة: مجلدات عدد ثنائية عدد ممنوعة عدد
داله سجّل(جدول قائمة[احصاء], فهرس قاموس[نص, عدد], امتداد نص, اسطر عدد, بايتات عدد) فراغ: اذا !يوجد(فهرس, امتداد): فهرس[امتداد] = طول(جدول) اضف(جدول, احصاء(قص(امتداد, 0), 0, 0, 0)) # نسخة: امتداد عرض على مسار سيُحرَّر م = فهرس[امتداد] ا = جدول[م] ا.ملفات += 1 ا.اسطر += اسطر ا.بايتات += بايتات جدول[م] = ا
داله امش(مسار نص, جدول قائمة[احصاء], فهرس قاموس[نص, عدد], ح مؤشر[حصيلة], عمق عدد) فراغ: اذا عمق > 40: ارجع # لا طريقة لكشف الروابط الرمزية: حد للعمق بدلها اسماء = ملفات.سرد_مجلد(مسار) والا خ: حالات خ: حاله خطأ.ليس_مجلدا: عد_ملف(مسار, جدول, فهرس, ح) حاله خطأ.ممنوع: محتوى(ح).ممنوعة += 1 حاله _: اطبع("تعذّر: ", مسار, " (", خ, ")") ارجع خاتمه حرر(اسماء) محتوى(ح).مجلدات += 1 لكل اسم في اسماء: اذا يبدأ_بـ(اسم, "."): تجاوز كامل = مسارات.ضم(مسار, اسم) امش(كامل, جدول, فهرس, ح, عمق + 1) حرر(كامل)
داله عد_ملف(مسار نص, جدول قائمة[احصاء], فهرس قاموس[نص, عدد], ح مؤشر[حصيلة]) فراغ: محتوى_الملف = ملفات.اقرأ_ملف(مسار) والا خ: حالات خ: حاله خطأ.ليس_نصا: محتوى(ح).ثنائية += 1 حاله خطأ.ممنوع: محتوى(ح).ممنوعة += 1 حاله _: اطبع("تعذّر: ", مسار, " (", خ, ")") ارجع اسطر = 0 لكل ح_ في محتوى_الملف: اذا ح_ == '\n': اسطر += 1 بايتات = طول(محتوى_الملف) # بالأحرف لا بالبايتات: لا دالة لعدد البايتات امتداد = مسارات.الامتداد(مسار) اذا طول(امتداد) == 0: امتداد = "(بلا)" سجّل(جدول, فهرس, امتداد, اسطر, بايتات) حرر(محتوى_الملف)
داله قبل(ا احصاء, ب احصاء) منطقي: ارجع ا.اسطر > ب.اسطر
و = نظام.وسائط()البداية = "."اذا طول(و) > 0: البداية = و[0]جدول قائمة[احصاء] = []فهرس قاموس[نص, عدد] = {}ح = جديد(حصيلة(0, 0, 0))خاتمه حرر(ح)امش(البداية, جدول, فهرس, ح, 0)رتب_ب(جدول, قبل)اطبع("الامتداد الملفات الأسطر الأحرف")مج_ملفات = 0مج_اسطر = 0لكل ا في جدول: اطبع(ا.امتداد, "\t", رياضيات.نسق_عدد(ا.ملفات, 8, خطاء), رياضيات.نسق_عدد(ا.اسطر, 11, خطاء), رياضيات.نسق_عدد(ا.بايتات, 12, خطاء)) مج_ملفات += ا.ملفات مج_اسطر += ا.اسطراطبع("المجموع: ", مج_ملفات, " ملفاً، ", مج_اسطر, " سطراً، ", محتوى(ح).مجلدات, " مجلداً؛ ثنائية: ", محتوى(ح).ثنائية, "، ممنوعة: ", محتوى(ح).ممنوعة)بُني أيضاً بـ meem build عند بناء الموقع: ملف ساكن حجمه 69.9 ك.ب، شُغّل وحده وطابق مخرجه المخرج أعلاه.
خطوة خطوة
رابط إلى قسم «خطوة خطوة»- المشي:
امشتقرأ أسماء المجلد بـملفات.سرد_مجلد. فإن رجعت الخطأليس_مجلدافالمسار ملف، فتعدّهعد_ملف. وحالات ختميّزممنوعمن غيره. - الملف:
ملفات.اقرأ_ملفترفض غير UTF-8 بالخطأليس_نصا، فيُعدّ ثنائياً. والأسطر تُعدّ بالمرور على أحرف الملف. - الامتداد:
مسارات.الامتداد(مسار)ثمسجّلتحفظه في الجدول نسخةً بـقص(امتداد, 0). - الحصيلة: هيكل
حصيلةيُحجز بـجديد، ويُعدَّل عبرمحتوى(ح)في كل الدوال.
ما كان صعباً
رابط إلى قسم «ما كان صعباً»- العرض المعلَّق، أسوأ ما في التقرير:
مسارات.الامتدادترجع عرضاً على المسار. خُزّن العرض في الهيكل أولاً، ثم حُرّر المسار، فطُبع الامتداد فاسداً (ss.بدل.md) برمز خروج 0. ولم يكشفه--debug-memفي 0.9.1، بل أصلح الناتج فأخفى الخطأ. في 0.10.0 يكشفه الكاشف الافتراضي في التشغيل المباشر خطأ E0430 بسطري الإنشاء والتحرير، أما الملف المبني بلا كاشف فيبقى ناتجه غير معرَّف. والبرنامج هنا يحفظ نسخة بـقص، فلا عرض معلَّق فيه. - لا طريقة لمعرفة نوع الملف (لا
stat)، فالمجلد يُميَّز من الملف بخطأسرد_مجلد. - لا كشف للروابط الرمزية، فحُدّد العمق بأربعين.
طوليعدّ الأحرف لا البايتات، ولا دالة لعدد البايتات: العمود «الأحرف» لا «البايتات».
ما تعلّمناه
رابط إلى قسم «ما تعلّمناه»- معالجة الأخطاء بـ
حالات ختجعل «مجلد أم ملف، مسموح أم ممنوع، نص أم ثنائي» فروعاً واضحة. - كل ما ترجعه
مسارات.الامتدادوالمجلدواسم_الملفوجزءوقص_الفراغاتعرض: إن عاش أطول من نصه الأصل فانسخه.