29 lines
637 B
Plaintext
29 lines
637 B
Plaintext
// Closures capture their defining environment, so each counter is
|
|
// independent.
|
|
let makeCounter = fn() {
|
|
let n = 0;
|
|
fn() { n = n + 1; n }
|
|
};
|
|
|
|
let a = makeCounter();
|
|
let b = makeCounter();
|
|
puts(a(), a(), a()); // 1 2 3
|
|
puts(b()); // 1
|
|
|
|
// Higher-order functions.
|
|
let map = fn(arr, f) {
|
|
let out = [];
|
|
let i = 0;
|
|
while (i < len(arr)) { out = push(out, f(arr[i])); i = i + 1; }
|
|
out
|
|
};
|
|
puts(map([1, 2, 3, 4], fn(x) { x * x }));
|
|
|
|
let reduce = fn(arr, init, f) {
|
|
let acc = init;
|
|
let i = 0;
|
|
while (i < len(arr)) { acc = f(acc, arr[i]); i = i + 1; }
|
|
acc
|
|
};
|
|
puts(reduce([1, 2, 3, 4, 5], 0, fn(a, b) { a + b }));
|