diff options
Diffstat (limited to 'src/libzisp.zig')
| -rw-r--r-- | src/libzisp.zig | 194 |
1 files changed, 111 insertions, 83 deletions
diff --git a/src/libzisp.zig b/src/libzisp.zig index e6c8ac5..df8422b 100644 --- a/src/libzisp.zig +++ b/src/libzisp.zig @@ -316,86 +316,114 @@ test "parse2" { try std.testing.expectEqualStrings("foo", f.slice()); } -// test "parse3" { -// const val = parseString( -// \\(foo ;~x ;~(x y) ;~x #bar [#x #"baz"] 'bat) -// ); - -// const car = value.pair.car; -// const cdr = value.pair.cdr; - -// const e1 = car(val); -// const e2 = car(cdr(val)); -// const e3 = car(cdr(cdr(val))); -// const e4 = car(cdr(cdr(cdr(val)))); - -// try std.testing.expect(value.sstr.check(e1)); -// try std.testing.expect(value.rune.check(e2)); -// try std.testing.expect(value.pair.check(e3)); -// try std.testing.expect(value.pair.check(e4)); -// } - -// test "parse4" { -// const val = parseString("(foo . ;~x bar ;~y)"); - -// const s = value.sstr.unpack(value.pair.car(val)); -// try std.testing.expectEqualStrings("foo", s.slice()); - -// const f = value.sstr.unpack(value.pair.cdr(val)); -// try std.testing.expectEqualStrings("bar", f.slice()); -// } - -// fn parseBench(path: []const u8, iters: usize) !void { -// const file = try std.fs.cwd().openFile(path, .{}); -// defer file.close(); - -// var timer = try std.time.Timer.start(); -// for (0..iters) |i| { -// _ = i; -// var br = std.io.bufferedReader(file.reader()); -// const reader = br.reader().any(); -// var v: Value = undefined; -// while (true) { -// v = io.parser.parse(reader); -// if (value.eof.check(v)) { -// break; -// } -// } -// try file.seekTo(0); -// } -// const ns: f64 = @floatFromInt(timer.lap()); -// const secs = ns / 1_000_000_000; -// std.debug.print( -// "parse {s} x {}: {d:.3}s\n", -// .{ path, iters, secs }, -// ); -// } - -// test "parse bench" { -// // try parseBench("test-data/parser-test-1.scm", 200); -// // try parseBench("test-data/parser-test-2.scm", 800); -// try parseBench("test-data/parser-torture.scm", 1); -// } - -// test "unparse" { -// var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; -// var out: std.ArrayList(u8) = .init(gpa.allocator()); - -// const w = out.writer(); -// const v = parseString("#foo"); -// try io.unparser.unparse(w, v); -// try std.testing.expectEqualStrings("#foo", try out.toOwnedSlice()); -// } - -// test "unparse2" { -// var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; -// var out: std.ArrayList(u8) = .init(gpa.allocator()); - -// const w = out.writer(); -// const v = parseString("#{foo bar['x]}"); -// try io.unparser.unparse(w, v); -// try std.testing.expectEqualStrings( -// "(#HASH #BRACE foo (#JOIN bar #SQUARE (#QUOTE . x)))", -// try out.toOwnedSlice(), -// ); -// } +test "parse3" { + const val = parseString( + \\(foo ;~x ;~(x y) ;~x #bar [#x #"baz"] 'bat) + ); + + const car = value.pair.car; + const cdr = value.pair.cdr; + + const e1 = car(val); + const e2 = car(cdr(val)); + const e3 = car(cdr(cdr(val))); + const e4 = car(cdr(cdr(cdr(val)))); + + try std.testing.expect(value.sstr.check(e1)); + try std.testing.expect(value.rune.check(e2)); + try std.testing.expect(value.pair.check(e3)); + try std.testing.expect(value.pair.check(e4)); +} + +test "parse4" { + const val = parseString("(foo . ;~x bar ;~y)"); + + const s = value.sstr.unpack(value.pair.car(val)); + try std.testing.expectEqualStrings("foo", s.slice()); + + const f = value.sstr.unpack(value.pair.cdr(val)); + try std.testing.expectEqualStrings("bar", f.slice()); +} + +fn parseBench(path: []const u8, iters: usize) !void { + const file = try std.fs.cwd().openFile(path, .{}); + defer file.close(); + + var timer = try std.time.Timer.start(); + for (0..iters) |i| { + _ = i; + var br = std.io.bufferedReader(file.reader()); + const reader = br.reader().any(); + var v: Value = undefined; + while (true) { + v = io.parser.parse(reader); + if (value.eof.check(v)) { + break; + } + } + try file.seekTo(0); + } + const ns: f64 = @floatFromInt(timer.lap()); + const secs = ns / 1_000_000_000; + std.debug.print( + "parse {s} x {}: {d:.3}s\n", + .{ path, iters, secs }, + ); +} + +test "parse bench" { + try parseBench("test-data/parser-test-1.scm", 1000); + try parseBench("test-data/parser-test-2.scm", 1000); + // try parseBench("test-data/parser-torture.scm", 1); +} + +test "unparse" { + var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; + var out: std.ArrayList(u8) = .init(gpa.allocator()); + + const w = out.writer(); + const v = parseString("#foo"); + try io.unparser.unparse(w, v); + try std.testing.expectEqualStrings("#foo", try out.toOwnedSlice()); +} + +test "unparse2" { + var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init; + var out: std.ArrayList(u8) = .init(gpa.allocator()); + + const w = out.writer(); + const v = parseString("#{foo bar['x]}"); + try io.unparser.unparse(w, v); + try std.testing.expectEqualStrings( + "(#HASH #BRACE foo (#JOIN bar #SQUARE (#QUOTE . x)))", + try out.toOwnedSlice(), + ); +} + +test "unparse3" { + const w = std.io.getStdErr().writer(); + const v = parseString("#{foo bar['x](y)(z)}"); + try io.unparser.unparse(w, v); + try w.writeByte('\n'); +} + +test "unparse4" { + const w = std.io.getStdErr().writer(); + const v = parseString("(foo ;~bar)"); + try io.unparser.unparse(w, v); + try w.writeByte('\n'); +} + +test "unparse5" { + const w = std.io.getStdErr().writer(); + const v = parseString("(;~foo foo ;~bar . ;~bar bar ;~bar)"); + try io.unparser.unparse(w, v); + try w.writeByte('\n'); +} + +test "unparse6" { + const w = std.io.getStdErr().writer(); + const v = parseString("(foo .bar ... baz. bat.(qux))"); + try io.unparser.unparse(w, v); + try w.writeByte('\n'); +} |
