From 6794e27eac3e866aa2b24999e2027b301a52ebf2 Mon Sep 17 00:00:00 2001 From: Taylan Kammer Date: Sun, 31 May 2026 20:58:25 +0200 Subject: Code cleanup. --- src/zisp/gc.zig | 31 +++++++++++++++---------------- src/zisp/gc/PairPool.zig | 1 + src/zisp/io/print.zig | 15 ++++++++------- src/zisp/lib/list.zig | 4 ++-- src/zisp/value/array.zig | 2 +- src/zisp/value/istr.zig | 5 +++-- src/zisp/value/pair.zig | 24 ++++++++++++++++-------- 7 files changed, 46 insertions(+), 36 deletions(-) create mode 100644 src/zisp/gc/PairPool.zig (limited to 'src') diff --git a/src/zisp/gc.zig b/src/zisp/gc.zig index fdb0e02..3a3e6f7 100644 --- a/src/zisp/gc.zig +++ b/src/zisp/gc.zig @@ -3,40 +3,39 @@ const std = @import("std"); const value = @import("value.zig"); +//const PairPool = @import("gc/PairPool.zig"); +const PairPool = std.heap.MemoryPool(value.pair.Pair); // TODO const IstrSet = @import("gc/IstrSet.zig"); -const istr = value.istr; -const ptr = value.ptr; - const Value = value.Value; -const Zptr = value.Zptr; + +const PairPtr = value.pair.PairPtr; +const IstrPtr = value.istr.IstrPtr; pub const alloc = std.heap.smp_allocator; -// Cons cells +// Pairs -const ConsPool = std.heap.MemoryPool([2]Value); -var cons_pool: ConsPool = undefined; +var pair_pool: PairPool = undefined; -pub fn cons(v1: Value, v2: Value) *[2]Value { - const mem = cons_pool.create(alloc) catch @panic("OOM"); - mem[0] = v1; - mem[1] = v2; - return mem; +pub fn makePair(v1: Value, v2: Value) PairPtr { + const p = pair_pool.create(alloc) catch @panic("OOM"); + p.car = v1; + p.cdr = v2; + return p; } // Interned strings var istr_set: IstrSet = undefined; -pub fn internString(s: []const u8) !Value { - const p = istr_set.add(alloc, s) catch @panic("OOM"); - return ptr.pack(p, .istr); +pub fn internString(s: []const u8) value.istr.IstrPtr { + return istr_set.add(alloc, s) catch @panic("OOM"); } // Init pub fn init() void { - cons_pool = ConsPool.initCapacity(alloc, 64) catch @panic("OOM"); + pair_pool = PairPool.initCapacity(alloc, 64) catch @panic("OOM"); istr_set = IstrSet.init(alloc) catch @panic("OOM"); } diff --git a/src/zisp/gc/PairPool.zig b/src/zisp/gc/PairPool.zig new file mode 100644 index 0000000..70b786d --- /dev/null +++ b/src/zisp/gc/PairPool.zig @@ -0,0 +1 @@ +// TODO diff --git a/src/zisp/io/print.zig b/src/zisp/io/print.zig index ddf9725..0873767 100644 --- a/src/zisp/io/print.zig +++ b/src/zisp/io/print.zig @@ -9,6 +9,7 @@ const Parser = @import("Parser.zig"); const Value = value.Value; +const PairPtr = value.pair.PairPtr; const IstrPtr = value.istr.IstrPtr; const ArrayPtr = value.array.ArrayPtr; @@ -76,9 +77,9 @@ pub fn srat(w: Writer, v: Value) !void { @panic("not implemented"); } -pub fn pair(w: Writer, p: *[2]Value) !void { - const car = p[0]; - //const cdr = p[1]; +pub fn pair(w: Writer, p: PairPtr) !void { + const car = p.car; + //const cdr = p.cdr; if (car.eq(Parser.PQSTR)) { //try pipeString(w, cdr); @panic(""); @@ -114,13 +115,13 @@ pub fn string(w: Writer, s: ArrayPtr) !void { try w.writeByte('|'); } -pub fn list(w: Writer, p: *[2]Value) !void { +pub fn list(w: Writer, p: PairPtr) !void { try w.writeByte('('); - try toWriter(w, p[0]); - var cdr = p[1]; + try toWriter(w, p.car); + var cdr = p.cdr; while (value.pair.check(cdr)) |p2| : (cdr = value.pair.cdr(cdr)) { try w.writeByte(' '); - try toWriter(w, p2[0]); + try toWriter(w, p2.car); } if (!value.nil.eq(cdr)) { try w.writeByte(' '); diff --git a/src/zisp/lib/list.zig b/src/zisp/lib/list.zig index cd6b553..76667d8 100644 --- a/src/zisp/lib/list.zig +++ b/src/zisp/lib/list.zig @@ -11,8 +11,8 @@ pub fn reverseWithTail(list: Value, tail: Value) Value { var result = tail; while (!value.nil.eq(head)) { const p = value.pair.unpack(head); - result = value.pair.cons(p[0], result); - head = p[1]; + result = value.pair.cons(p.car, result); + head = p.cdr; } return result; } diff --git a/src/zisp/value/array.zig b/src/zisp/value/array.zig index ac56391..650cae1 100644 --- a/src/zisp/value/array.zig +++ b/src/zisp/value/array.zig @@ -48,7 +48,7 @@ const Value = value.Value; /// Other remaining bits provide information about element type and size. pub const ArrayPtr = *align(8) ArrayHeader; -const ArrayHeader = packed struct(u64) { +pub const ArrayHeader = packed struct(u64) { len_or_ptr: u48, is_slice: bool, is_ptr: bool, diff --git a/src/zisp/value/istr.zig b/src/zisp/value/istr.zig index a525c7e..aef5405 100644 --- a/src/zisp/value/istr.zig +++ b/src/zisp/value/istr.zig @@ -72,9 +72,10 @@ fn assertValidIstr(s: []const u8) void { } } -pub fn intern(s: []const u8) !Value { +pub fn intern(s: []const u8) Value { assertValidIstr(s); - return gc.internString(s); + const istr = gc.internString(s); + return value.ptr.pack(@ptrCast(istr), .istr); } // Zisp API diff --git a/src/zisp/value/pair.zig b/src/zisp/value/pair.zig index 9afaf12..ec7e69b 100644 --- a/src/zisp/value/pair.zig +++ b/src/zisp/value/pair.zig @@ -7,20 +7,27 @@ const ptr = @import("ptr.zig"); const Value = value.Value; +pub const PairPtr = *align(8) Pair; + +pub const Pair = struct { + car: Value, + cdr: Value, +}; + // Zig API -pub fn check(v: Value) ?*[2]Value { +pub fn check(v: Value) ?PairPtr { return @ptrCast(v.getPtr(.pair)); } -pub fn assert(v: Value) *[2]Value { +pub fn assert(v: Value) PairPtr { return check(v) orelse { v.dump(); @panic("not pair"); }; } -pub fn unpack(v: Value) *[2]Value { +pub fn unpack(v: Value) PairPtr { return assert(v); } @@ -31,21 +38,22 @@ pub fn pred(v: Value) Value { } pub fn cons(v1: Value, v2: Value) Value { - return ptr.pack(@ptrCast(gc.cons(v1, v2)), .pair); + const pair = gc.makePair(v1, v2); + return ptr.pack(@ptrCast(pair), .pair); } pub fn car(v: Value) Value { - return unpack(v)[0]; + return unpack(v).car; } pub fn cdr(v: Value) Value { - return unpack(v)[1]; + return unpack(v).cdr; } pub fn setCar(v: Value, new: Value) void { - unpack(v)[0] = new; + unpack(v).car = new; } pub fn setCdr(v: Value, new: Value) void { - unpack(v)[1] = new; + unpack(v).cdr = new; } -- cgit v1.2.3