// Ownership: values move into functions, references borrow them, and
// `&mutable` lends write access without giving the value away.
import std.io.println;
import std.text.number;
type Account = { owner: string, balance: int };
def open_account(owner: string, deposit: int): Account {
let account: Account = { owner: owner, balance: deposit };
return account;
}
def deposit(account: &mutable Account, amount: int): void {
(*account).balance := (*account).balance + amount;
}
def balance(account: &Account): int {
return (*account).balance;
}
def close(account: Account): string {
return clone(&account.owner);
}
def main(): int {
let account: mutable Account = open_account("Layla", 100);
deposit(&mutable account, 50);
println(int_to_text(balance(&account)));
let owner: string = close(account);
println(owner);
return 0;
}// الملكية: القيم تنتقل إلى الدوال، والمراجع تستعيرها،
// و`&متغير` يعير صلاحية الكتابة دون التخلي عن القيمة.
استورد std.io.println;
استورد std.text.number;
نوع حساب = { المالك: نص, الرصيد: عدد };
عرف افتح_حسابا(المالك: نص, أودع: عدد): حساب {
دع الحساب: حساب = { المالك: المالك, الرصيد: أودع };
أرجع الحساب;
}
عرف أودع(الحساب: &متغير حساب, المقدار: عدد): فراغ {
(*الحساب).الرصيد := (*الحساب).الرصيد + المقدار;
}
عرف الرصيد(الحساب: &حساب): عدد {
أرجع (*الحساب).الرصيد;
}
عرف أغلق(الحساب: حساب): نص {
أرجع استنسخ(&الحساب.المالك);
}
عرف الرئيسية(): عدد {
دع الحساب: متغير حساب = افتح_حسابا("ليلى", 100);
أودع(&متغير الحساب, 50);
اطبع_سطر(عدد_إلى_نص(الرصيد(&الحساب)));
دع المالك: نص = أغلق(الحساب);
اطبع_سطر(المالك);
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/ownership/moves_and_borrows.snOr compile it to an executable:
./build/sultanc examples/en/ownership/moves_and_borrows.sn -o build/example && ./build/example