summaryrefslogtreecommitdiff
path: root/src/zisp/lib/list.zig
blob: be40af7e2d18ae0310a92ffaca91c17b64635ed8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
const value = @import("../value.zig");

const Value = value.Value;

pub fn reverse(list: Value) Value {
    return reverseWithTail(list, value.nil);
}

pub fn reverseWithTail(list: Value, tail: Value) Value {
    var head = list;
    var result = tail;
    while (!value.nil.eq(head)) {
        value.pair.assert(head);
        const car = value.pair.car(head);
        const cdr = value.pair.cdr(head);
        result = value.pair.cons(car, result);
        head = cdr;
    }
    return result;
}