حاول (try)

📄 الأصل: try-statement.nfth

📦 تحميل الملف: ⬇ تحميل

🔗 عرض الملف:

	
		--- SPDX-License-Identifier: Apache-2.0
--- Copyright © The Naftah Project Authors

---*
  هذا البرنامج يستعرض آلية التعامل مع القيم باستخدام تعبيرات `حاول` في لغة نفطه.

  يحتوي على أمثلة لتعامل مع:
  - نجاح العمليات وفشلها (مثل القسمة على صفر)
  - التداخل بين المحاولات
  - تفكيك كائن يحتوي خصائص متعددة (مثل "بلدة")
  - قراءة عناصر من قائمة متداخلة

  يتم استخدام:
  - `نجاح(أ) -> ...` لمعالجة القيم الناجحة
  - `فشل(ب) إفعل ...` لمعالجة الأخطاء
  - `إطبع(...)` لطباعة المخرجات
  - `تعيين` لإسناد القيم
  - `ثابت` و `متغير` لتعريف الثوابت والمتغيرات
*---

---*
محاولة تنفيذ القيمة 1.
هذه القيمة صحيحة وثابتة، لذا سيتم اعتبارها "نجاح".
*---
 حاول(1){
--- عند النجاح، يتم تنفيذ هذا الفرع، ويتم طباعة المتغير "أ" الذي يحمل القيمة 1.
نجاح(أ) -> إطبع(أ)
--- هذا الفرع لن يُنفذ هنا، لأنه لا يوجد فشل.
فشل(ب) إفعل إطبع(ب)
 }

---*
محاولة تنفيذ عملية رياضية: 1 ÷ 0.
هذه العملية ستفشل (قسمة على صفر).
*---
 حاول(1 قسمة 0){
--- لن يتم تنفيذ هذا الفرع لأنه حدث فشل.
نجاح(أ) -> إطبع(أ)
--- سيتم تنفيذ هذا الفرع، وسيتم طباعة الخطأ "ب".
فشل(ب) إفعل إطبع(ب)
 }

--- محاولة أخرى للقسمة على صفر - ستفشل.
  حاول(1 قسمة 0){
--- لن يتم تنفيذه.
 نجاح(أ) -> إطبع(أ)
--- سيتم تنفيذ هذا الفرع عند الفشل.
 فشل(ب) إفعل {
--- طباعة الخطأ "ب".
 إطبع(ب)
--- محاولة جديدة داخلية لتقييم 1.
  حاول(1){
--- سيتم تنفيذ هذا الفرع لأن 1 ناجحة، ويتم طباعة "أ" (1).
 نجاح(أ) -> إطبع(أ)
--- هذا لن يُنفذ لأنه لا يوجد فشل.
 فشل(ب) إفعل إطبع(ب)
  }
 }
  }

  --- تعريف متغير 'بلدة' يحتوي الاسم، مرجع إلى المدينة، وعدد الأحياء
متغير بلدة تعيين {
    متغير الاسم تعيين "نفتة",
    متغير المدينة تعيين مدينة,
    متغير عدد_الأحياء تعيين 5
}

---*
محاولة قراءة الكائن "بلدة" ككل.
ستنجح إذا كانت "بلدة" كائنًا صالحًا.
*---
 حاول(بلدة){
--- عند النجاح، يتم تنفيذ هذا الفرع.
--- "أ" هو المتغير الذي يمثل الكائن "بلدة".
نجاح(أ) -> {
--- استخراج خاصية "الاسم" من الكائن.
ثابت الاسم تعيين أ["الاسم"]
--- استخراج خاصية "المدينة".
ثابت المدينة تعيين أ["المدينة"]
--- استخراج خاصية "عدد_الأحياء".
ثابت عدد_الأحياء تعيين أ["عدد_الأحياء"]
--- طباعة جميع القيم المستخرجة بشكل منسق.
إطبع("الاسم = ${الاسم}، المدينة = ${المدينة}، عدد_الأحياء = ${عدد_الأحياء}")
}
--- إذا فشل الوصول إلى "بلدة"، يتم طباعة الخطأ "ب".
فشل(ب) إفعل إطبع(ب)
 }

--- تعريف قائمة متداخلة
متغير قائمة_1 تعيين [١٠ ، [ ٩  ، [ ٨ ، [ ٧ ، [٦ ، [ ٥ ، [ ٤ ، [٣ ، [٢ ، ١]]]]]]]]]

--- محاولة تحليل القائمة "قائمة_1".
 حاول(قائمة_1){
--- إذا كانت القائمة صالحة، يتم تنفيذ هذا الفرع.
نجاح(أ) -> {
--- استخراج أول عنصر من القائمة: ١٠
ثابت قائمة_1_0 تعيين قائمة_1[0]
--- استخراج العنصر الثاني: وهو قائمة متداخلة.
ثابت قائمة_1_1 تعيين قائمة_1[1]
--- استخراج أول عنصر من القائمة الداخلية: ٩
ثابت قائمة_1_1_0 تعيين قائمة_1[1][0]
--- طباعة القيم الثلاثة المستخرجة.
إطبع("قائمة_1_0 = ${قائمة_1_0}، قائمة_1_1 = ${قائمة_1_1}، قائمة_1_1_0 = ${قائمة_1_1_0}")
}
--- إذا فشل الوصول إلى أي عنصر (مثلاً القائمة غير موجودة أو المؤشرات خاطئة)، يتم طباعة الخطأ "ب".
فشل(ب) إفعل إطبع(ب)
 }

--- محاولة التعامل مع القيمة 1 كخيار (Option). القيمة موجودة، لذا يُنفذ الفرع "بعض".
حاول(1){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "لاشيء" كخيار (Option). القيمة غير موجودة، لذا يُنفذ الفرع "معدوم".
حاول(لاشيء){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "باطل" كخيار (Option). تعتبر قيمة فارغة.
حاول(باطل){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "فارغ" كخيار (Option). تمثل غياب القيمة.
حاول(فارغ){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "ليس_رقم" كخيار. تمثل NaN أو قيمة غير رقمية.
حاول(ليس_رقم){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "قيمة_غير_رقمية" كخيار. تمثل قيمة ليست من النوع العددي.
حاول(قيمة_غير_رقمية){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "رقم_غير_صالح" كخيار. مثل NaN أو قيم مرفوضة.
حاول(رقم_غير_صالح){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "غير_عددي" كخيار. القيمة ليست رقمًا.
حاول(غير_عددي){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}

--- تجربة التعامل مع القيمة "ليس_عددي" كخيار. تستخدم للنفي بأن القيمة ليست عددًا.
حاول(ليس_عددي){
--- إذا كانت القيمة موجودة، يتم طباعتها.
بعض(أ) -> إطبع(أ)
--- إذا لم تكن هناك قيمة، يتم طباعة "لاشيء."
معدوم إفعل إطبع("لاشيء.")
}