السلطان
  1. الرئيسية
  2. التوثيق
  3. الدليل

جولة في اللغة

صفحات التوثيق

جولة في اللغة

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

واجهتان ولغة واحدة

العربية والإنجليزية واجهتان متكافئتان للشيفرة المصدرية. للكلمة المفتاحية أو اسم النوع أو دالة المكتبة القياسية معنى واحد وكتابتان، ويحل المترجم الكتابتين إلى الصورة المعتمدة نفسها قبل أن تراهما أي مرحلة لاحقة. ويمكن أن يجمع الملف الواحد بينهما. والأسماء التي تصرّح بها يجوز أن تُكتب بأي من الخطين.

دالة الدخول اسمها main بالإنجليزية والرئيسية بالعربية، وقيمة عدد التي ترجعها هي حالة خروج العملية. وتعرض النسخة الإنجليزية من هذه الجولة البرامج نفسها بالإنجليزية. والمفردات الكاملة موجودة في المصطلحات العربية.

القيم والأنواع

يربط دع اسما بقيمة. الربط غير قابل للتغيير ما لم يُغلَّف نوعه بـ متغير، ويُستخدم := للإسناد. يُكتب النوع بعد الاسم. ودع في المستوى الأعلى من الملف ثابتٌ للوحدة يُقيَّم في وقت الترجمة.

الأنواع المدمجة هي عدد، وطبيعي، ومنطقي، وحرف، ونص، وفراغ، والأعداد الصحيحة ذات العرض الثابت ص8…ص64 وط8…ط64، وأعداد الفاصلة العائمة ع32 وع64. التحويل بين الأنواع البسيطة صريح ويستخدم مثل.

دع الحد: عدد = 100;

عرف الرئيسية(): عدد {
    دع البايت: ط8 = 255;
    دع النسبة: ع64 = 0.75;
    دع الحرف: حرف = 'س';
    دع الاسم: نص = "سلطان";
    دع العداد: متغير عدد = 0;
    العداد := العداد + 1;
    دع موسع: ص64 = (البايت مثل ص64) - 250;
    أرجع العداد + الحد + (موسع مثل عدد);
}

انظر نظام الأنواع لمعرفة نموذج الأنواع وقواعد التحويل الدقيقة.

الدوال

تصرّح الدالة بأنواع معاملاتها وبنوع نتيجتها. الدوال المجهولة تلتقط القيم المحيطة بها، وتُكتب أنواع الدوال على الصورة دالة(عدد): عدد. وتأخذ الدالة معاملات النوع بين قوسين زاويين.

عرف أنشئ_جامعا(المقدار: عدد): دالة(عدد): عدد {
    أرجع دالة(القيمة: عدد): عدد -> القيمة + المقدار;
}

عرف هوية<T>(القيمة: T): T {
    أرجع القيمة;
}

عرف الرئيسية(): عدد {
    دع أضف_عشرة: دالة(عدد): عدد = أنشئ_جامعا(10);
    أرجع أضف_عشرة(هوية(5));
}

التحكم في التدفق

يأخذ إذا شرطا بين قوسين وكتلا بين معقوفين، وتنتهي الجملة بفاصلة منقوطة. يختبر طالما شرطا قبل كل دورة. ولـ لكل صورة لغة C: تهيئة وشرط وخطوة. ويعمل تابع_حلقة واخرج_من_حلقة في الحلقتين.

استورد المكتبة.دخ.println;
استورد المكتبة.نصوص.number;

عرف الرئيسية(): عدد {
    دع المجموع: متغير عدد = 0;
    دع ف: متغير عدد = 1;
    طالما (ف <= 5) {
        المجموع := المجموع + ف;
        ف := ف + 1;
    }
    لكل (دع ك: متغير عدد = 0; ك < 10; ك := ك + 1) {
        إذا (ك % 2 == 0) { تابع_حلقة; };
        إذا (ك > 6) { اخرج_من_حلقة; };
        المجموع := المجموع + ك;
    }
    إذا (المجموع > 20) {
        اطبع_سطر("كبير");
    } وإلا {
        اطبع_سطر("صغير");
    };
    اطبع_سطر(عدد_إلى_نص(المجموع));
    أرجع 0;
}

السجلات والتعدادات ومطابقة الأنماط

نوع السجل يسمّي مجموعة من الحقول. تُكتب قيمته قيمةً حرفيةً بين معقوفين، ويُقرأ الحقل بنقطة. ويسمّي نوع أيضا نوعا موجودا، كما في نوع مئوي = عدد;. والتعداد يسرد منشئاته، ويمكن أن يحمل كل منها حمولة بـ بنوع. يختار طابق فرعا بحسب النمط. ويتحقق المترجم من أن الفروع تغطي كل الحالات. تفكك الأنماط الحمولات والسجلات، وتطابق القيم الحرفية للأعداد الصحيحة والحروف والنصوص، والبدائل المفصولة بـ |، والمجالات.

نوع نقطة = { س: عدد, ص: عدد };

نوع شكل =
    | دائرة بنوع عدد
    | مستطيل بنوع نقطة
    | نقطة_فقط
;

عرف المساحة(الشكل: شكل): عدد {
    طابق الشكل مع
    | شكل.دائرة(نق) -> { أرجع 3 * نق * نق; }
    | شكل.مستطيل({ س: العرض, ص: الارتفاع }) -> { أرجع العرض * الارتفاع; }
    | شكل.نقطة_فقط -> { أرجع 0; };
}

عرف الرئيسية(): عدد {
    دع الحجم: نقطة = { س: 3, ص: 4 };
    أرجع المساحة(شكل.دائرة(2)) + المساحة(شكل.مستطيل(الحجم)) + الحجم.س;
}

المنشئ الذي لا حمولة له يُكتب بلا أقواس في النمط، وبأقواس عند بناء القيمة، كما في شكل.نقطة_فقط() أسفل النوع.

ويعلن نوع قاعدة_بيانات = معتم; نوعا معتما: اسما بلا حقول ولا حجم، لبيانات لا تعرف تخطيطها إلا شيفرة أخرى (مكتبة سي). ولا يحمل قيمة إلا المؤشر إليه، *قاعدة_بيانات؛ انظر الأنواع المعتمة.

المتجهات

متجه T تسلسل قابل للنمو يملك عناصره. تُكتب قيمته الحرفية بين قوسين مربعين. تستخدم الفهرسة [ ]، ويعطي الطول عدد العناصر، ويضيف ألحق عنصرا إلى متجه متغير. وتمرير &القيم يعير المتجه دون التخلي عنه.

عرف الرئيسية(): عدد {
    دع القيم: متغير متجه عدد = [10, 20];
    ألحق(القيم, 12);
    أرجع القيم[0] + القيم[2] + الطول(القيم);
}

الملكية والاستعارة

لكل قيمة مالك واحد. استخدام قيمة مالكة، مثل نص أو متجه أو سجل يحتوي على أحدهما، ينقلها: فلا يعود الاسم القديم صالحا للاستخدام. أما القيم البسيطة مثل الأعداد فتُنسخ. المرجع &T يستعير قيمة للقراءة، و&متغير T يستعيرها للكتابة. ويُوصل إلى القيمة التي يشير إليها المرجع بـ *. وينشئ استنسخ نسخة عميقة مستقلة. يتحقق المترجم من كل ذلك قبل توليد الشيفرة، ويحرر القيمة المملوكة عندما يخرج مالكها من نطاقه.

استورد المكتبة.دخ.println;
استورد المكتبة.نصوص.number;

نوع حساب = { المالك: نص, الرصيد: عدد };

عرف أودع(الحساب: &متغير حساب, المقدار: عدد): فراغ {
    (*الحساب).الرصيد := (*الحساب).الرصيد + المقدار;
}

عرف أغلق(الحساب: حساب): نص {
    أرجع استنسخ(&الحساب.المالك);
}

عرف الرئيسية(): عدد {
    دع الحساب: متغير حساب = { المالك: "ليلى", الرصيد: 100 };
    أودع(&متغير الحساب, 50);
    اطبع_سطر(عدد_إلى_نص(الحساب.الرصيد));
    اطبع_سطر(أغلق(الحساب));
    أرجع 0;
}

تأخذ أغلق الحساب من النوع حساب بالقيمة، فيُنقل الحساب عند الاستدعاء. واستخدام الحساب بعد ذلك يُرفض بالخطأ SULTANC-OWNERSHIP-USE-AFTER-MOVE، الذي يشير إلى المالك الأصلي وإلى موضع النقل معا. ولا يمكن أن تجتمع استعارة للكتابة مع استعارة أخرى للقيمة نفسها (SULTANC-BORROW-CONFLICT)، ولا يمكن نقل قيمة مملوكة من تخزين مستعار (SULTANC-OWNERSHIP-MOVE-OUT-OF-REFERENCE). القواعد ونموذج الإسقاط واستنسخ موجودة في الملكية والإتلاف.

الأخطاء

الإخفاق قيمة. تحمل نتيجة T, E إما نتيجة.نجح(القيمة) أو نتيجة.خطأ(الخطأ). وتحمل اختياري T إما اختياري.موجود(القيمة) أو اختياري.لا_شيء. ويفكك طابق أيا منهما. أما ؟ اللاحق فيعيد الخطأ أو الغياب إلى المستدعي، وإلا فإنه يعطي القيمة، كما في دع ق: عدد = اقسم(أ, ب)؟;. ويجب أن يكون نوع الخطأ واحدا على طرفي الاستدعاء.

استورد المكتبة.دخ.println;
استورد المكتبة.نصوص.number;

عرف اقسم(أ: عدد, ب: عدد): نتيجة عدد, نص {
    إذا (ب == 0) { أرجع نتيجة.خطأ("القسمة على صفر"); };
    أرجع نتيجة.نجح(أ / ب);
}

عرف نصف_الناتج(أ: عدد, ب: عدد): نتيجة عدد, نص {
    دع ق: عدد = اقسم(أ, ب)؟;
    أرجع نتيجة.نجح(ق / 2);
}

عرف اطبع_النتيجة(ن: نتيجة عدد, نص): فراغ {
    طابق ن مع
    | نتيجة.نجح(ق) -> { اطبع_سطر(عدد_إلى_نص(ق)); }
    | نتيجة.خطأ(رسالة) -> { اطبع_سطر(رسالة); };
}

عرف الرئيسية(): عدد {
    اطبع_النتيجة(نصف_الناتج(84, 2));
    اطبع_النتيجة(نصف_الناتج(1, 0));
    أرجع 0;
}

يوقف إنهيار البرنامج برسالة، ويُستخدم للحالات التي لا ينبغي أن تحدث أبدا. ويجوز أن ترجع الرئيسية نفسها قيمة نتيجة، وفي هذه الحالة يُطبع الخطأ وتخرج العملية بالحالة 1. قيمة الخطأ في المكتبة القياسية، ودوالها المساعدة، والدلالة الدقيقة لـ ؟ موجودة في الأخطاء.

الوحدات والاستيراد

كل ملف .sn وحدة. يكشف عام التصريح لمن يستورد الوحدة، ويبقى كل ما عداه خاصا. للاستيراد ثلاث صيغ: مسار بين علامتي تنصيص نسبةً إلى الملف المستورِد، ومسار وحدة منقط، واستيراد انتقائي لأسماء من مجلد. ويعطي مثل الوحدة اسما محليا يُستخدم مؤهِّلا.

استورد "geometry_ar.sn";
استورد المكتبة.نصوص.number مثل الأعداد;
من المكتبة.دخ استورد اطبع_سطر;

عرف الرئيسية(): عدد {
    دع الغرفة: مستطيل = { العرض: 5, الارتفاع: 4 };
    اطبع_سطر(الأعداد.عدد_إلى_نص(المساحة(&الغرفة)));
    أرجع 0;
}

الوحدة التي يستوردانها:

عام نوع مستطيل = { العرض: عدد, الارتفاع: عدد };

عام عرف المساحة(الشكل: &مستطيل): عدد {
    أرجع (*الشكل).العرض * (*الشكل).الارتفاع;
}

يُدخل استورد المكتبة.نصوص.number; كل اسم عام في وحدة المكتبة القياسية تلك إلى النطاق، أما استورد المكتبة.نصوص.number مثل الأعداد; فيجعلها متاحة فقط على الصورة الأعداد.الاسم. والمكتبة القياسية std تُكتب بالعربية المكتبة، ولمجلداتها الفرعية أسماء عربية أيضا (std.text.number هي المكتبة.نصوص.number). وتحدد صفحة الوحدات والاستيراد طريقة الحل.

استخدام المكتبة القياسية

يكتب std.io.println سطرا على الخرج القياسي، ويحول std.text.number الأعداد إلى نص والعكس، وينسق std.fmt النص بعناصر نائبة على طريقة Rust. يُغلَّف كل وسيط لدالة التنسيق في قيمة تحمل نوعه، وتُفحص سلسلة التنسيق الحرفية في وقت الترجمة.

استورد المكتبة.تنسيق.fmt;

عرف الرئيسية(): عدد {
    دع الاسم: نص = "سلطان";
    دع ر1: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا("أهلا يا {}! لديك {} رسائل.", [قيمة_تنسيق.نص(&الاسم), قيمة_تنسيق.عدد(3)]);
    دع ر2: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا("[{0:>8}] {1:#x} {2:.2}", [قيمة_تنسيق.نص(&الاسم), قيمة_تنسيق.عدد(255), قيمة_تنسيق.ع64(3.14159)]);
    أرجع 0;
}
أهلا يا سلطان! لديك 3 رسائل.
[   سلطان] 0xff 3.14

قواعد صياغة مواصفات التنسيق، والمنسقات المخصصة، وقواعد المحاذاة موجودة في التنسيق. وتسرد صفحة تغطية المكتبة القياسية ما تقدمه المكتبة.

انظر أيضا