المتابعون للمدونة

السبت، 20 يناير 2018

عشرون عاما من البرمجة 3


عشرون عاما من البرمجة
 (3/4)

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

 
بعد ذلك اشتري لي أبي رحمه الله حاسوبا لما رأى جنوني بالبرمجة، فأخذت أطور البرنامج، وسمحت بكتابة شعر التفعيلة، الذي يمكن أن يطول فيه السطر الواحد عن 4 تفعيلات بكثير.. وهنا كان يجب تغيير خوارزمية الشجرة الرباعية الخاصة بمحمد جلال لأنها كانت تسبب خطأ تجاوز مساحة الذاكرة بعد عدد معين من التفعيلات بسبب زيادة عدد خاناتها بالأس الرباعي مع كل تفعيلة، ويحتاج التعامل مع خمس تفعيلات فقط مصفوفة عدد خاناتها = 4 + 16 + 64 + 256 + 1024 = 1360 خانة، والتفعيلة السادسة ستضيف 4096 خانة على العدد السابق!.. لهذا كتبت خوارزمية خطية عامة، يمكن تسميتها بعناقيد التفعيلات، وهي عكس الخوارزمية الأولى، التي كنا نحدد فيها مقاطع ثابتة أطوالها 4 أو 5 أو 6 أو 7 حروف، ونحصل على كل تباديل وتوافيق هذه المقاطع في النص، وهذا يؤدي ‘لى عدد هائل من المقاطع المحتملة.. بينما في خوارزمية عناقيد التفعيلات كنت أحصل عنقود التفعيلات المحتملة عند كل موضع في النص بغض النظر عن طولها، وتصير المسألة هي البحث عن مسار التفعيلات المستمرة، التي تصل بك إلى آخر حرف في النص بدون فجوات.. مثلا:
1. إذا كنت في الموضع س من النص ولديك تفعيلة طولها ن ، أقفز إلى الموضع س + ن.
2. فإن لم تكن في هذا الموضع تفعيلات فهذا الاحتمال مستبعد، وعد إلى الموضع س وجرب تفعيلة أخرى.
3. وإن كانت هناك تفعيلات تبدأ من هذا الموضع، جرب كلا منها بالترتيب، بنفس الطريقة.
4.   كرر نفس الخطوات السابقة إلى أن تصل إلى نهاية النص.
هذا سيعطي نفس نتائج شجرة الاحتمالات لكن بطريقة أبسط وأكفأ، ويسمح بكتابة شطرات طولها مئات التفعيلات.
كما كتبت مرشحا Filter لتسريع العملية، لاستبعاد أي مسار بمجرد أن تظهر فيه تفعيلتان لا يمكن أن توجدا معا في بحر واحد.
 
وقد خففت قواعد تشكيل الحروف بحيث يتطلب البرنامج وضع السكون والشدة والتنوين فقط على الحروف.. ويستطيع البرنامج تجاهل أي تشكيل يظهر في موضع غير منطقي.. وقد بسطت الكود الذي يحول الكتابة الإملائية إلى كتابة عروضية، لأنه سبب لي صداعا حينما كتبته بجمل شرط عادية، حيث كانت طويلة جدا ومتداخلة، فكتبت ما يشبه التعبيرات النمطية Regular Expressions (التي ظهرت بعد ذلك في دوت نت ولم تكن معروفة في فيجوال بيزيك 6) حيث قمت بتعريف دوال بسيطة تستقبل بعض الصيغ الخاصة بي وتبحث عنها في النص وتحولها إلى صيغ أخرى، وبهذا صار من الممكن أن أكتب:
RepAny(W, ArabicLetters.Shaddah, ArabicLetters.Sokon & "?", "?", "?")
هذا الكود يحول الحرف المشدد إلى حرفين متشابهين أولهما عليه سكون.. المعامل الثاني لهذه الدالة يبحث عن الشدة، والمعامل الرابع يتأكد أن الحرف السابق لها هو الحرف المرسل.. في حالتنا هذه أرسلت علامة استفهام وهذا سيجعل الدالة تقبل أي حرف قبل الشدة، وتضعه في متغير للتعويض عنه بدلا من أي علامة استفهام تظهر في المعاملين الثالث والخامس، اللذين يستقبلان النص البديل المراد وضعه بدلا من المعاملين الثاني والرابع على الترتيب.. إذا فالكود يقول:
اترك الحرف السابق للشدة كما هو، وضع بدلا من الشدة السكون يتبعها هذا الحرف السابق.. لو طبقت هذا على كلمة شدّ فستصير: شدْد
بهذه الصيغ البسيطة تحول كود الكتابة العروضية إلى مجرد سطور قليلة واضحة المعنى.. هذا جعل الكود مختصرا وبسيطا وواضحا وسهل تعديله.
وقد حاولت حينها أن أضيف جزءا يحلل الأبيات المكسورة ليساعد في تحديد مواضع الكسر وإصلاحها.. وأضفت هذا المحلل إلى الإصدار الأول فعلا لكنه لم يعمل بشكل صحيح.

ليست هناك تعليقات:

إرسال تعليق

ملحوظة: يمكن لأعضاء المدونة فقط إرسال تعليق.

صفحة الشاعر