diff options
Diffstat (limited to 'src/libzisp/lib/list.zig')
| -rw-r--r-- | src/libzisp/lib/list.zig | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libzisp/lib/list.zig b/src/libzisp/lib/list.zig new file mode 100644 index 0000000..9d6a6bc --- /dev/null +++ b/src/libzisp/lib/list.zig @@ -0,0 +1,20 @@ +const value = @import("../value.zig"); + +const Value = value.Value; + +pub fn reverse(list: Value) Value { + return reverseWithTail(list, value.nil.nil); +} + +pub fn reverseWithTail(list: Value, tail: Value) Value { + var head = list; + var result = tail; + while (!value.nil.check(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; +} |
