summaryrefslogtreecommitdiff
path: root/src/libzisp.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/libzisp.zig')
-rw-r--r--src/libzisp.zig188
1 files changed, 99 insertions, 89 deletions
diff --git a/src/libzisp.zig b/src/libzisp.zig
index 90508be..e6c8ac5 100644
--- a/src/libzisp.zig
+++ b/src/libzisp.zig
@@ -13,6 +13,20 @@ pub const Hval = gc.Hval;
pub const ShortString = value.ShortString;
pub const Value = value.Value;
+fn benchmark(name: []const u8, iters: usize, func: fn () anyerror!void) !void {
+ var timer = try std.time.Timer.start();
+ for (0..iters) |i| {
+ _ = i;
+ try func();
+ }
+ const ns: f64 = @floatFromInt(timer.lap());
+ const secs = ns / 1_000_000_000;
+ std.debug.print(
+ "bench {s} x {}: {d:.3}s\n",
+ .{ name, iters, secs },
+ );
+}
+
test "double" {
const d1: f64 = 0.123456789;
const d2: f64 = -0.987654321;
@@ -128,7 +142,7 @@ test "sstr" {
.ReleaseSafe => 100_000_000,
.ReleaseFast => 1_000_000_000,
};
- std.debug.print("Benchmarking with {} iters.\n", .{iters});
+ std.debug.print("Benchmarking sstr with {} iters.\n", .{iters});
inline for (impls, 0..) |impl, i| {
try benchmarkSstr(impl, i, iters);
}
@@ -288,7 +302,7 @@ test "parse" {
test "parse2" {
const val = parseString(
\\ ;; Testing some crazy datum comments
- \\ #;"bar"#;([x #"y"]{##`,'z}) #"foo"
+ \\ ;~"bar"([x #"y"]{##`,'z}) #"foo"
\\ ;; end
);
@@ -302,90 +316,86 @@ 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) !void {
- const iters = 1000;
-
- var buf: [8196]u8 = undefined;
- const file = try std.fs.cwd().openFile(path, .{});
- defer file.close();
- const count = try file.readAll(&buf);
-
- var fbs = std.io.fixedBufferStream(buf[0..count]);
- const reader = fbs.reader().any();
-
- var timer = try std.time.Timer.start();
- for (0..iters) |i| {
- _ = i;
- var v: Value = undefined;
- while (true) {
- v = io.parser.parse(reader);
- if (value.eof.check(v)) {
- break;
- }
- }
- try fbs.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");
- try parseBench("test-data/parser-test-2.scm");
-}
-
-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", 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(),
+// );
+// }