diff --git a/src/builtin/range.zig b/src/builtin/range.zig index 9bb98cbc..d64a065a 100644 --- a/src/builtin/range.zig +++ b/src/builtin/range.zig @@ -14,7 +14,7 @@ pub fn toList(ctx: *obj.NativeCtx) c_int { }, ) catch @panic("Could not instanciate list"), ), - ) catch @panic("Could not instanceiate range"); + ) catch @panic("Could not instanciate range"); ctx.vm.push(Value.fromObj(list.toObj())); @@ -32,3 +32,18 @@ pub fn toList(ctx: *obj.NativeCtx) c_int { return 1; } + +pub fn len(ctx: *obj.NativeCtx) c_int { + const range = ctx.vm.peek(0).obj().access(obj.ObjRange, .Range, ctx.vm.gc).?; + + ctx.vm.push( + Value.fromInteger( + if (range.low < range.high) + range.high - range.low + else + range.low - range.high, + ), + ); + + return 1; +} diff --git a/src/obj.zig b/src/obj.zig index c375c044..d1dc7e52 100644 --- a/src/obj.zig +++ b/src/obj.zig @@ -2493,6 +2493,7 @@ pub const ObjRange = struct { NativeFn, .{ .{ "toList", buzz_builtin.range.toList }, + .{ "len", buzz_builtin.range.len }, }, ); @@ -2500,6 +2501,7 @@ pub const ObjRange = struct { []const u8, .{ .{ "toList", "extern Function toList() > [int]" }, + .{ "len", "extern Function len() > int" }, }, ); diff --git a/tests/053-range.buzz b/tests/053-range.buzz index 75e0f05f..0357123f 100644 --- a/tests/053-range.buzz +++ b/tests/053-range.buzz @@ -16,6 +16,8 @@ test "Range" { sum = sum + n; } std.assert(sum == 45, message: "Could iterate over range"); + + std.assert(rg.len() == 10); } test "Inverted range" { @@ -33,4 +35,6 @@ test "Inverted range" { sum = sum + n; } std.assert(sum == 55, message: "Could iterate over inverted range"); + + std.assert(rg.len() == 10); } \ No newline at end of file