// std.fmt: a format string with `{}` placeholders and a vector of
// arguments, like Rust's format! and Go's fmt.Sprintf. A spec after `:` sets
// fill and alignment, sign, `#`, zero padding, width, precision and type.
import std.fmt.fmt;
def main(): int {
let name: string = "Sultan";
let r1: result uint, fmt_error = println_fmt("Hello, {}! You have {} messages.", [fmt_arg.text(&name), fmt_arg.int(3)]);
// Positions, escapes and alignment.
let r2: result uint, fmt_error = println_fmt("{1} {0} {1} {{braces}}", [fmt_arg.text(&name), fmt_arg.int(42)]);
let r3: result uint, fmt_error = println_fmt("[{0:<10}] [{0:^10}] [{0:>10}] [{0:*^10}]", [fmt_arg.text(&name)]);
// Numbers: sign, zero padding, bases and the alternate form.
let r4: result uint, fmt_error = println_fmt("{0:+} {0:06} {1:x} {1:#X} {1:#o} {2:#010b}", [fmt_arg.int(-42), fmt_arg.int(255), fmt_arg.u8(5)]);
// Floats: shortest round trip, a fixed precision, exponent form.
let r5: result uint, fmt_error = println_fmt("{1} {0:.2} {0:8.3} {2:e} {2:.1E}", [fmt_arg.f64(3.14159265), fmt_arg.f64(0.1 + 0.2), fmt_arg.f64(1234.5)]);
// Width and precision from arguments, and Debug output.
let r6: result uint, fmt_error = println_fmt("[{0:>1$.2$}]", [fmt_arg.f64(2.71828), fmt_arg.uint(9), fmt_arg.uint(3)]);
let items: vector string = ["tea", "\"coffee\""];
let ints: vector int = [1, 2, 3];
let r7: result uint, fmt_error = println_fmt("{:?} {:?}", [fmt_arg.texts(&items), fmt_arg.ints(&ints)]);
// A literal format string is checked at compile time: "{} {}" with no
// arguments does not compile. One built at run time is checked when it
// is used, and a mistake is an error value, not a crash.
let template: string = "{} {}";
match format(template, []) with
| result.ok(_) -> { return 1; }
| result.err(_) -> { let r8: result uint, fmt_error = println_fmt("the format string needs two arguments", []); };
return 0;
}// المكتبة.تنسيق: قالب تنسيق فيه مواضع `{}` ومتجه وسائط، مثل format! في Rust
// وfmt.Sprintf في Go. والمواصفة بعد `:` تحدد الحشو والمحاذاة والإشارة و`#`
// والحشو بالأصفار والعرض والدقة والنوع.
استورد المكتبة.تنسيق.fmt;
عرف الرئيسية(): عدد {
دع الاسم: نص = «سلطان»;
دع ر1: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«أهلا يا {}! لديك {} رسائل.», [قيمة_تنسيق.نص(&الاسم), قيمة_تنسيق.عدد(3)]);
// المواضع والهروب والمحاذاة.
دع ر2: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{1} {0} {1} {{أقواس}}», [قيمة_تنسيق.نص(&الاسم), قيمة_تنسيق.عدد(42)]);
دع ر3: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«[{0:<10}] [{0:^10}] [{0:>10}] [{0:*^10}]», [قيمة_تنسيق.نص(&الاسم)]);
// الأعداد: الإشارة والحشو بالأصفار والأسس والصيغة البديلة.
دع ر4: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{0:+} {0:06} {1:x} {1:#X} {1:#o} {2:#010b}», [قيمة_تنسيق.عدد(-42), قيمة_تنسيق.عدد(255), قيمة_تنسيق.ط8(5)]);
// العائمة: أقصر نص يعاد تحليله، ودقة ثابتة، والصيغة الأسية.
دع ر5: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{1} {0:.2} {0:8.3} {2:e} {2:.1E}», [قيمة_تنسيق.ع64(3.14159265), قيمة_تنسيق.ع64(0.1 + 0.2), قيمة_تنسيق.ع64(1234.5)]);
// العرض والدقة من الوسائط، وخرج التصحيح.
دع ر6: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«[{0:>1$.2$}]», [قيمة_تنسيق.ع64(2.71828), قيمة_تنسيق.طبيعي(9), قيمة_تنسيق.طبيعي(3)]);
دع العناصر: متجه نص = [«شاي», "\"قهوة\""];
دع الصحاح: متجه عدد = [1, 2, 3];
دع ر7: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«{:?} {:?}», [قيمة_تنسيق.نصوص(&العناصر), قيمة_تنسيق.أعداد(&الصحاح)]);
// قالب التنسيق الحرفي يفحص وقت الترجمة: «{} {}» بلا وسائط لا يترجم.
// والقالب المبني وقت التشغيل يفحص عند استعماله، والخطأ فيه قيمة خطأ لا انهيار.
دع القالب: نص = «{} {}»;
طابق نسق(القالب, []) مع
| نتيجة.نجح(_) -> { أرجع 1; }
| نتيجة.خطأ(_) -> { دع ر8: نتيجة طبيعي, خطأ_تنسيق = اطبع_سطرا_منسقا(«يحتاج قالب التنسيق وسيطين», []); };
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/fmt/formatting.snOr compile it to an executable:
./build/sultanc examples/en/fmt/formatting.sn -o build/example && ./build/example