// Functions passed as values: transform, filter and fold a vector.
import std.io.println;
import std.text.number;
def transform(values: &vector int, f: fn(int): int): vector int {
let output: mutable vector int = [];
let i: mutable uint = 0;
while (i < (length(*values) as uint)) {
append(output, f((*values)[i]));
i := i + 1;
}
return output;
}
def keep(values: &vector int, test: fn(int): bool): vector int {
let output: mutable vector int = [];
let i: mutable uint = 0;
while (i < (length(*values) as uint)) {
if (test((*values)[i])) { append(output, (*values)[i]); };
i := i + 1;
}
return output;
}
def fold(values: &vector int, start: int, combine: fn(int, int): int): int {
let total: mutable int = start;
let i: mutable uint = 0;
while (i < (length(*values) as uint)) {
total := combine(total, (*values)[i]);
i := i + 1;
}
return total;
}
def square(value: int): int { return value * value; }
def is_even(value: int): bool { return value % 2 == 0; }
def add(left: int, right: int): int { return left + right; }
def main(): int {
let numbers: vector int = [1, 2, 3, 4, 5, 6];
let squares: vector int = transform(&numbers, square);
let even_squares: vector int = keep(&squares, is_even);
println(int_to_text(fold(&even_squares, 0, add)));
println(uint_to_text(length(even_squares) as uint));
return 0;
}// دوال تمرر كقيم: تحويل متجه وتصفيته وطيه.
استورد std.io.println;
استورد std.text.number;
عرف حول(القيم: &متجه عدد, د: دالة(عدد): عدد): متجه عدد {
دع الناتج: متغير متجه عدد = [];
دع ف: متغير طبيعي = 0;
طالما (ف < (الطول(*القيم) مثل طبيعي)) {
ألحق(الناتج, د((*القيم)[ف]));
ف := ف + 1;
}
أرجع الناتج;
}
عرف استبق(القيم: &متجه عدد, الاختبار: دالة(عدد): منطقي): متجه عدد {
دع الناتج: متغير متجه عدد = [];
دع ف: متغير طبيعي = 0;
طالما (ف < (الطول(*القيم) مثل طبيعي)) {
إذا (الاختبار((*القيم)[ف])) { ألحق(الناتج, (*القيم)[ف]); };
ف := ف + 1;
}
أرجع الناتج;
}
عرف اطو(القيم: &متجه عدد, البداية: عدد, ادمج: دالة(عدد, عدد): عدد): عدد {
دع المجموع: متغير عدد = البداية;
دع ف: متغير طبيعي = 0;
طالما (ف < (الطول(*القيم) مثل طبيعي)) {
المجموع := ادمج(المجموع, (*القيم)[ف]);
ف := ف + 1;
}
أرجع المجموع;
}
عرف مربع_العدد(القيمة: عدد): عدد { أرجع القيمة * القيمة; }
عرف زوجي(القيمة: عدد): منطقي { أرجع القيمة % 2 == 0; }
عرف اجمع_عددين(اليسار: عدد, اليمين: عدد): عدد { أرجع اليسار + اليمين; }
عرف الرئيسية(): عدد {
دع الأعداد: متجه عدد = [1, 2, 3, 4, 5, 6];
دع المربعات: متجه عدد = حول(&الأعداد, مربع_العدد);
دع المربعات_الزوجية: متجه عدد = استبق(&المربعات, زوجي);
اطبع_سطر(عدد_إلى_نص(اطو(&المربعات_الزوجية, 0, اجمع_عددين)));
اطبع_سطر(طبيعي_إلى_نص(الطول(المربعات_الزوجية) مثل طبيعي));
أرجع 0;
}
Run it
With the interpreter, without compiling:
./build/sultanc run examples/en/functions/higher_order.snOr compile it to an executable:
./build/sultanc examples/en/functions/higher_order.sn -o build/example && ./build/example