solilang 0.21.1

A statically-typed, class-based OOP language with pipeline operators
Documentation
// Array iteration methods: map, filter, each
// These work similarly to Ruby arrays

let numbers = [1, 2, 3, 4, 5];

// map - transforms each element and returns new array
let doubled = numbers.map(fn(x) x * 2);
print("Original:", numbers);
print("Doubled (map x*2):", doubled);

// filter - selects elements where predicate returns truthy
let evens = numbers.filter(fn(x) x % 2 == 0);
print("Evens (filter x%2==0):", evens);

// Chaining - map and filter together
let result = numbers
    .map(fn(x) x * 2)
    .filter(fn(x) x > 5);
print("Doubled then filtered (>5):", result);

// each - executes function for side effects, returns original array
print("Each iteration:");
numbers.each(fn(x) print("  " + x));

// Block syntax with explicit return
let squares = numbers.map(fn(n) {
    return n * n;
});
print("Squares (block syntax):", squares);

// Hash iteration methods
let hash = {"name": "Alice", "age": 30, "city": "Paris"};
print("\nOriginal hash:", hash);

// Hash map - function receives [key, value] array, returns [new_key, new_value]
let prefixed = hash.map(fn(pair) {
    return ["prefix_" + pair[0], pair[1]];
});
print("Prefixed keys:", prefixed);

// Hash filter - function receives [key, value] array, returns boolean
let adults = hash.filter(fn(pair) {
    return pair[0] == "age" && pair[1] >= 18;
});
print("Adults filter:", adults);

// Hash each - function receives [key, value] array
print("Hash each:");
hash.each(fn(pair) {
    print("  " + pair[0] + ": " + pair[1]);
});

print("\nAll iteration tests passed!");