// العرض والتصحيح لأنواعك: قيمة_تنسيق مخصصة تحمل دالة مغلقة تكتب في المنسق
// (impl Display وimpl Debug في Rust). وتستطيع قراءة مواصفة الموضع، واحترام
// العرض بـ احش_نصا، وكتابة صيغة التصحيح المنسقة لـ {:#?}. والدوال المغلقة
// تلتقط القيم البسيطة (الأعداد والمنطقيات والتعدادات والسجلات منها).
استورد المكتبة.تنسيق.fmt;
نوع عملة = | ريال | دولار;
نوع مبلغ = { الهللات: عدد, العملة: عملة };
عرف اعرض_مبلغا(م: &مبلغ, ن: &متغير منسق): نتيجة طبيعي, خطأ_تنسيق {
دع الرمز: متغير نص = «ر.س»;
طابق (*م).العملة مع
| عملة.دولار -> { الرمز := «دولار»; }
| عملة.ريال -> { };
إذا (المنسق_للتصحيح(ن)) {
إذا (المنسق_بديل(ن)) {
أرجع نسق_في(ن, "مبلغ {{\n الهللات: {},\n العملة: {},\n}}", [قيمة_تنسيق.عدد((*م).الهللات), قيمة_تنسيق.نص(&الرمز)]);
};
أرجع نسق_في(ن, «مبلغ {{ الهللات: {}, العملة: {} }}», [قيمة_تنسيق.عدد((*م).الهللات), قيمة_تنسيق.نص(&الرمز)]);
};
// العرض: ينسق المبلغ ثم يحشى إلى العرض المطلوب.
طابق نسق(«{}.{:02} {}», [قيمة_تنسيق.عدد((*م).الهللات / 100), قيمة_تنسيق.عدد((*م).الهللات % 100), قيمة_تنسيق.نص(&الرمز)]) مع
| نتيجة.نجح(النص) -> { أرجع احش_نصا(ن, &النص); }
| نتيجة.خطأ(خ) -> { أرجع نتيجة.خطأ(خ); };
}
عرف مبلغا(م: مبلغ): قيمة_تنسيق {
أرجع قيمة_تنسيق.مخصص(دالة(ن: &متغير منسق): نتيجة طبيعي, خطأ_تنسيق -> اعرض_مبلغا(&م, ن));
}
عرف الرئيسية(): عدد {
دع السعر: مبلغ = { الهللات: 1250, العملة: عملة.ريال() };
دع الإكرامية: مبلغ = { الهللات: 305, العملة: عملة.دولار() };
دع ر1: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«السعر: {}», [مبلغا(السعر)]);
دع ر2: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«[{0:>12}] [{0:<12}]», [مبلغا(السعر)]);
دع ر3: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{:?}», [مبلغا(السعر)]);
دع كلاهما: متجه قيمة_تنسيق = [مبلغا(السعر), مبلغا(الإكرامية)];
دع ر4: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{:#?}», [قيمة_تنسيق.قائمة(&كلاهما)]);
أرجع 0;
}// Display and Debug for your own types: a custom fmt_arg holds a closure
// that writes into the formatter (Rust's impl Display / impl Debug). It can
// read the placeholder's spec, honour width with pad, and write the
// pretty Debug form for {:#?}. Closures capture plain values (numbers,
// booleans, enums and records of them).
import std.fmt.fmt;
type Currency = | Riyal | Dollar;
type Money = { cents: int, currency: Currency };
def show_money(m: &Money, f: &mutable formatter): result uint, fmt_error {
let code: mutable string = "SAR";
match (*m).currency with
| Currency.Dollar -> { code := "USD"; }
| Currency.Riyal -> { };
if (formatter_debug(f)) {
if (formatter_alternate(f)) {
return format_into(f, "Money {{\n cents: {},\n currency: {},\n}}", [fmt_arg.int((*m).cents), fmt_arg.text(&code)]);
};
return format_into(f, "Money {{ cents: {}, currency: {} }}", [fmt_arg.int((*m).cents), fmt_arg.text(&code)]);
};
// Display: format the amount, then pad it to the requested width.
match format("{}.{:02} {}", [fmt_arg.int((*m).cents / 100), fmt_arg.int((*m).cents % 100), fmt_arg.text(&code)]) with
| result.ok(text) -> { return pad(f, &text); }
| result.err(e) -> { return result.err(e); };
}
def money(m: Money): fmt_arg {
return fmt_arg.custom(fn(f: &mutable formatter): result uint, fmt_error -> show_money(&m, f));
}
def main(): int {
let price: Money = { cents: 1250, currency: Currency.Riyal() };
let tip: Money = { cents: 305, currency: Currency.Dollar() };
let r1: result uint, fmt_error = println_fmt("price: {}", [money(price)]);
let r2: result uint, fmt_error = println_fmt("[{0:>12}] [{0:<12}]", [money(price)]);
let r3: result uint, fmt_error = println_fmt("{:?}", [money(price)]);
let both: vector fmt_arg = [money(price), money(tip)];
let r4: result uint, fmt_error = println_fmt("{:#?}", [fmt_arg.list(&both)]);
return 0;
}
التشغيل
بالمفسر، دون ترجمة:
./build/sultanc run examples/ar/fmt/display.snأو ترجمه إلى ملف تنفيذي:
./build/sultanc examples/ar/fmt/display.sn -o build/example && ./build/example