Skip to content

Examples

These sample programs live in the examples/ folder of the repository. Examples 1 to 4 run today with dad run or in the playground. Each one is followed by its output. Example 5 needs tables, a server and components, which come in Phases 2 and 3.

1. Hello — functions, default and named arguments

// أول برنامج بلغة ضاد
ثابت اسم = "العالم"
اطبع("مرحبا يا {اسم}!")

دالة حي(اسم: نص، تحية: نص = "أهلاً"): نص {
  أرجع "{تحية} يا {اسم}"
}

اطبع(حي("سارة"))
اطبع(حي(اسم: "علي"، تحية: «صباح الخير»))

Output:

مرحبا يا العالم!
أهلاً يا سارة
صباح الخير يا علي

2. Basics — expressions, ranges, lambdas

// المتغيرات، الشروط، الحلقات، والدوال المختصرة
دالة مربع(س: صحيح) = س * س

دالة وصف(درجة: صحيح) = إذا درجة >= ٩٠ { "ممتاز" } وإلا إذا درجة >= ٥٠ { "ناجح" } وإلا { "راسب" }

متغير مجموع = ٠
لكل ع من ١ إلى ١٠ {
  مجموع += مربع(ع)
}
اطبع("مجموع المربعات: {مجموع}")

لكل ع من ٠ حتى ١٠ بخطوة ٢ { اطبع(ع) }

ثابت درجات = [٩٥، 72، ٤٠]
لكل د في درجات {
  اطبع("{د} => {وصف(د)}")
}

ثابت كبار = درجات.رشح { هو >= ٥٠ }.حول { هو * ٢ }
ثابت متوسط = درجات.اختزل(٠) { أ، ب => أ + ب } ك عشري / ٣٫٠

Output:

مجموع المربعات: ٣٨٥
٠
٢
٤
٦
٨
٩٥ => ممتاز
٧٢ => ناجح
٤٠ => راسب

3. Shapes — value types, enums, exhaustive matching

// أنواع القيم، التعدادات، والمطابقة الشاملة
نوع نقطة(س: عشري، ص: عشري) {
  دالة بعد() = جذر(س * س + ص * ص)
}

تعداد شكل {
  دائرة(قطر: عشري)
  مستطيل(عرض: عشري، طول: عشري)
  مثلث(قاعدة: عشري، ارتفاع: عشري)
}

دالة مساحة(ش: شكل): عشري = طابق ش {
  دائرة(ق) => ٣٫١٤١٦ * ق * ق / ٤
  مستطيل(ع، ط) => ع * ط
  مثلث(ق، ر) => ق * ر / ٢
}

ثابت أشكال = [دائرة(٢)، مستطيل(٣، ٤)، مثلث(قاعدة: ٦، ارتفاع: ٢)]
لكل ش في أشكال {
  اطبع("المساحة = {مساحة(ش)}")
  إذا ش هو دائرة { اطبع("قطرها {ش.قطر}") }
}

ثابت ن = نقطة(س: ٣، ص: ٤)
اطبع(ن.بعد())              // ٥
اطبع(ن == نقطة(٣، ٤))     // صح
ثابت م = ن.نسخة(ص: ٠)

Output:

المساحة = ٣٫١٤١٦
قطرها ٢٫٠
المساحة = ١٢٫٠
المساحة = ٦٫٠
٥٫٠
صح

4. Safety — optionals, errors, contracts, extensions

// الأمان من القيم المفقودة، الأخطاء، العقود والامتدادات
نوع مستخدم(اسم: نص، بريد: نص؟ = عدم)

دالة بريد_العرض(م: مستخدم؟): نص {
  ثابت بريد = م؟.بريد
  إذا بريد != عدم {
    أرجع "{بريد} ({بريد.طول} حرفاً)"     // تحويل ذكي: بريد هنا نص
  }
  أرجع م؟.بريد ؟؟ "لا يوجد بريد"
}

دالة اقسم(أ: صحيح، ب: صحيح): صحيح {
  إذا ب == ٠ { ارفع مشكلة("قسمة على صفر") }
  أرجع أ / ب
}

ثابت ناتج = حاول { اقسم(١٠، ٠) } التقط خ { اطبع(خ.رسالة)؛ ٠ }

عقد قابل_للعرض {
  دالة اعرض(): نص
}

امتداد نص {
  خاص دالة نظيف() = هذا.قص()
  دالة مكرر(مرات: صحيح) = (من ١ إلى مرات).حول { هذا }.ضم("")
}

اطبع("هلا ".مكرر(3))
اطبع(بريد_العرض(مستخدم("هدى"، بريد: "huda@example.com")))
اطبع(بريد_العرض(عدم))

Output:

قسمة على صفر
هلا هلا هلا 
huda@example.com (١٦ حرفاً)
لا يوجد بريد

5. To-do app — data, server and UI in one file

// تطبيق مهام كامل: بيانات + خادم + واجهة في ملف واحد

جدول مهمة {
  عنوان: نص
  منجزة = خطأ
}

خادم دالة المهام() = مهمة.الكل()
خادم دالة أضف(عنوان: نص) = مهمة.أنشئ(عنوان: عنوان)
خادم دالة بدل(م: مهمة) = م.نسخة(منجزة: ليس م.منجزة).احفظ()

// واجهة برمجية عامة للبرامج الأخرى
مسار جلب "/api/مهام" = مهمة.الكل()

مكون قائمة_المهام() {
  حالة مهام = المهام()
  حالة جديدة = ""

  عمود {
    عنوان("مهامي ({مهام.رشح { ليس هو.منجزة }.عدد} متبقية)")
    صف {
      حقل(جديدة، تلميح: "مهمة جديدة…")
      زر("أضف") {
        أضف(جديدة)
        مهام = المهام()
        جديدة = ""
      }
    }
    لكل م في مهام {
      صف {
        مربع_اختيار(م.منجزة) { بدل(م)؛ مهام = المهام() }
        فقرة(م.عنوان)
      }
    }
  }
}