الإصدارة 1.7 من مُفسِّر أُبْدِع

نشره م. وائل حسن -أ… في

تم بحمد الله تعالي بناء الإصدارة 1.7 من مُفسِّر أُبْدِع و رُفِعَتْ علي مواقعها علي الشبكة،

و الجديد في هذه الإصدارة ما يلي:

* بناء خاصيةٍ تجعل رسالة التنبيه لوجود خطأٍ في التعامل مع المُكدِّس stack لا تظهر للمستخدم العادي و تظهر لي أنا فقط لأني أحتاجها أثاء برمجتي للمُفسِّر، و كانت الرسالة قد أصبحت في الإصدارة 1.6 علي الشكل التالي:


STACK ISN'T EMPTY AT THE END OF EXECUTING !
executing completed successfully.

أي أنها تُنبِّه إلي التعامل الخاطيء مع المُكدِّس و لكنها تخبر المستخدم العادي أن برنامجه تم تنفيذه بشكلٍ صحيح.
و قد وعدتُ حينها أنني  سأجعل أُبْدِع يعرض هذه الرسالة فقط حينما أتعامل أنا معه؛ حتي لا يُربِك المستخدم العادي بأمورٍ لا تهمه في قليلٍ أو كثير. و قد فعلتُ في هذه الإصدارة.
   
* إصلاح عِلَّةٍ في بناء قواعد تغطية إجراءٍ لإجراءٍ آخر، و هي الخاصة بأن "الإجراء المُغطِّي يجب أن يكون له مُستوَي وصول مساوٍ لمُستوَي وصول الإجراء المُغطَّي أو أكبر منه". فكان مثلاً في الإصدارات الأقدم يُسمح بتغطية إجراءٍ خاصٍ لإجراءٍ عام !

* بناء القاعدة التي تنص علي أنه "لا يمكن قراءة قيمة كائن لقب لم يُعطَ قيمةً و إلا حصل المبرمج علي خطأ زمن تشغيل".
فمثلاً البرنامج:


يوم الإجازة
لو الإجازة = يوم_جمعة :
    أكتب.نص.سطر("الإجازة = يوم_جمعة")

   
لقب يوم  :
    سبت أحد  اثنين ثلاثاء أربعاء  خميس جمعة
   
   
ينتج عنه خطأٌ عند تنفيذه لأنه يتم فيه قراءة قيمة كائن اللقب (الإجازة)  قبل إعطائه أي قيمة.

* إتاحة إمكانية ترك ما بين أقواس قيمة الجدول فارغاً بما معناه أن قيمة الجدول تساوي لاشيء، أو وضع كلمة لاشيء للحصول علي نفس النتيجة.
مثال1:

رقم{2}  الأرقام = {لاشيء  {} }

فهنا قيمة البُعد الأرقام{1} تساوي لاشيء، و كذا فقيمة الأرقام{2} تساوي لاشيء بدورها.

مثال2:

رقم{2} ثابت أرقام3  = {بعد1 = {}   بعد2 = {}}

و هنا عرَّفنا جدولاً مُلقَّباً خالياً من القيم، بدون الاضطرار لملئه بقيمٍ لا لزوم لها. و هو ما سيحتاجه المبرمجون في بعض الأحيان.

* إصلاح عِلةٍٍ كانت تجعل المُفسِّر يعتبر أن مقارنة مؤشري جدولين باستخدام المُعامِل  #  خطاً نحوي.
مثال:

رقم{2}  الأرقام = {لاشيء  {} }
لو الأرقام{1} # لاشيء :
    أكتب.نص.سطر("الأرقام{1} # لاشيء")
   
* إصلاح علةٍ في تعامل تعبير (بينما) مع الجداول التي لم يتم حجز أماكن لها في الذاكرة، حيث كان في البداية ينتج عن ذلك التعامل خطأ زمن تنفيذ، و لكن الآن يتم معاملة الجدول الذي لم يتم حجز مكانٍ له في الذاكرة في تعبير (بينما) علي أنه جدولٌ فارغ بدون قِيم و بالتالي لا يتم الدخول إلي صلب الحلقة التكرارية و لا تُنفذ الأوامر التي فيها نهائياً.
مثلاً البرنامج التالي:

رقم{1} أرقام1
رقم الرقم

بينما الرقم في أرقام1 :
    أكتب.نص.سطر("الرقم =  " + إلي.نص(الرقم))
   
   
عند تنفيذه لا يكتب أي قِيمٍ علي الشاشة، و في نفس الوقت لا ينتج عنه أخطاء زمن تنفيذ.

* إصلاح عِلَّةٍ كانت تتسبب في خطأٍ في التعامل مع الجداول المُلقَّبة في كائنات الأصناف، فمثلاً لو كتبنا الكود التالي:

 
صنف1  كائن1 = صنف1()
كائن1_أرقام3_بعد1 = {11  22  33}

أكتب.نص.سطر("كائن1_أرقام3_بعد1_طول() = " + إلي.نص(كائن1_أرقام3_بعد1_طول()))
أكتب.نص.سطر("كائن1_أرقام3_بعد1_عدد.الأبعاد() = " + إلي.نص(كائن1_أرقام3_بعد1_عدد.الأبعاد()))

أكتب.نص.سطر("كائن1_أرقام3_طول() = " + إلي.نص(كائن1_أرقام3_طول()))
أكتب.نص.سطر("كائن1_أرقام3_عدد.الأبعاد() = " + إلي.نص(كائن1_أرقام3_عدد.الأبعاد()))
   
أكتب.نص.سطر("كائن1_أرقام3{1}_طول() = " + إلي.نص(كائن1_أرقام3{1}_طول()))
أكتب.نص.سطر("كائن1_أرقام3{1}_عدد.الأبعاد() = " + إلي.نص(كائن1_أرقام3{1}_عدد.الأبعاد()))
   
أكتب.نص.سطر("كائن1_أرقام3_بعد1_طول() = " + إلي.نص(كائن1_أرقام3_بعد1_طول()))
أكتب.نص.سطر("كائن1_أرقام3_بعد1_عدد.الأبعاد() = " + إلي.نص(كائن1_أرقام3_بعد1_عدد.الأبعاد()))

أكتب.نص.سطر("كائن1_أرقام3{1  1} = " + إلي.نص(كائن1_أرقام3{1  1}))
أكتب.نص.سطر("كائن1_أرقام3_بعد1{1} = " + إلي.نص(كائن1_أرقام3_بعد1{1}))


صنف صنف1 :
    رقم{2} عام  ثابت أرقام3  = {بعد1 = {}   بعد2 = {}}
   

كنا سنحصل علي خطأ زمن تنفيذٍ نتيجةً لأن المُفسِّر لم ينفذ الأمر:
كائن1_أرقام3_بعد1 = {11  22  33}
بشكلٍ سليم، و بالتالي بقيت قيمة البُعد (بعد1) تساوي (لاشيء) كما كانت عند تعريفها !
و لكن تم مُعالجة هذا في الإصدارة 1.7 بفضل الله عز و جل، و عند تنفيذ البرنامج السابق علي تلك الإصدارة سيعطينا النتيجة:

كائن1_أرقام3_بعد1_طول() = 3.0
كائن1_أرقام3_بعد1_عدد.الأبعاد() = 1.0
كائن1_أرقام3_طول() = 2.0
كائن1_أرقام3_عدد.الأبعاد() = 2.0
كائن1_أرقام3{1}_طول() = 3.0
كائن1_أرقام3{1}_عدد.الأبعاد() = 1.0
كائن1_أرقام3_بعد1_طول() = 3.0
كائن1_أرقام3_بعد1_عدد.الأبعاد() = 1.0
كائن1_أرقام3{1  1} = 11.0
كائن1_أرقام3_بعد1{1} = 11.0


يمكنكم تحميل مُفسِّر أُبْدِع من خلال الروابط الموجودة في (مركز التحميلات) في صفحته علي الموقع الرسمي:
 http://ebda3lang.blogspot.com/p/blog-page_5.html
و كذا يمكنكم معرفة كل ما يخص المشروع من خلال تحميل الكتاب الرسمي له (رسالة البرمجة بإبداع)، من الروابط الموجودة في صفحته علي الموقع الرسمي:
http://ebda3lang.blogspot.com/p/blog-page.html