// نوع جبري تحمل بدائله سجلات تُفكك داخل `طابق`.
استورد std.io.println;
استورد std.text.number;
نوع نقطة = { س: عدد, ص: عدد };
نوع شكل =
| مربع بنوع عدد
| مستطيل بنوع نقطة
| مثلث بنوع نقطة
;
عرف المساحة(الشكل: شكل): عدد {
طابق الشكل مع
| شكل.مربع(الضلع) -> { أرجع الضلع * الضلع; }
| شكل.مستطيل({ س: العرض_الجزئي, ص: الارتفاع_الجزئي }) -> { أرجع العرض_الجزئي * الارتفاع_الجزئي; }
| شكل.مثلث({ س: القاعدة, ص: الارتفاع_الجزئي }) -> { أرجع (القاعدة * الارتفاع_الجزئي) / 2; };
}
عرف الرئيسية(): عدد {
دع الأضلاع: نقطة = { س: 4, ص: 5 };
دع الزاوية: نقطة = { س: 6, ص: 3 };
اطبع_سطر(عدد_إلى_نص(المساحة(شكل.مربع(3))));
اطبع_سطر(عدد_إلى_نص(المساحة(شكل.مستطيل(الأضلاع))));
اطبع_سطر(عدد_إلى_نص(المساحة(شكل.مثلث(الزاوية))));
أرجع 0;
}// An algebraic data type whose variants carry records, destructured in `match`.
import std.io.println;
import std.text.number;
type Point = { x: int, y: int };
type Shape =
| Square of int
| Rectangle of Point
| Triangle of Point
;
def area(shape: Shape): int {
match shape with
| Shape.Square(side) -> { return side * side; }
| Shape.Rectangle({ x: w, y: h }) -> { return w * h; }
| Shape.Triangle({ x: base, y: h }) -> { return (base * h) / 2; };
}
def main(): int {
let sides: Point = { x: 4, y: 5 };
let corner: Point = { x: 6, y: 3 };
println(int_to_text(area(Shape.Square(3))));
println(int_to_text(area(Shape.Rectangle(sides))));
println(int_to_text(area(Shape.Triangle(corner))));
return 0;
}
التشغيل
بالمفسر، دون ترجمة:
./build/sultanc run examples/ar/data/shapes.snأو ترجمه إلى ملف تنفيذي:
./build/sultanc examples/ar/data/shapes.sn -o build/example && ./build/example