p2sh 0.4.3

The p2sh Programming language interpreter
#!/usr/bin/env p2sh

fn mapfn(arr, f) {
    let iter = fn(arr, accumulated) {
        if len(arr) == 0 {
            accumulated;
        } else {
            push(accumulated, f(first(arr)));
            iter(rest(arr), accumulated);
        }
    };
    iter(arr, []);
}

fn reduce(arr, initial, f) {
    let iter = fn(arr, result) {
        if len(arr) == 0 {
            result;
        } else {
            iter(rest(arr), f(result, first(arr)));
        }
    };
    iter(arr, initial);
}

fn sum(arr) {
    reduce(arr, 0, fn(initial, el) { initial + el });
}

let double = fn(x) { x * 2; };


let arr = [1, 2, 3, 4, 5];
let arr_double = mapfn(arr, double);
let total = sum(arr_double);
println("Sum = {}", total);