summaryrefslogtreecommitdiff
path: root/src/libzisp.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/libzisp.zig')
-rw-r--r--src/libzisp.zig194
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');
+}