vm::callbacks.zig (2355B)
1 const std = @import("std"); 2 3 const GC = @import("gc.zig").GC; 4 const Obj = GC.Obj; 5 const Value = @import("value.zig").Value; 6 pub const Error = Obj.Error; 7 8 const Number = Value.tagType(.number); 9 const Bool = Value.tagType(.bool); 10 11 pub fn Type(comptime in_tag: anytype, comptime out_tag: anytype) type { 12 if (@TypeOf(in_tag) == Obj.Type) { 13 return struct { 14 objects: *GC, 15 _call: *const fn (self: *const @This(), Value.tagType(in_tag), Value.tagType(in_tag)) Error!Value.tagType(out_tag), 16 pub fn call(self: *const @This(), a: Value.tagType(in_tag), b: Value.tagType(in_tag)) Error!Value.tagType(out_tag) { 17 return self._call(self, a, b); 18 } 19 }; 20 } else { 21 return struct { 22 call: fn (Value.tagType(in_tag), Value.tagType(in_tag)) callconv(.@"inline") Error!Value.tagType(out_tag), 23 }; 24 } 25 } 26 27 pub fn concatenate(objects: *GC) Type(Obj.Type.String, Obj.Type.String) { 28 const Ret = Type(Obj.Type.String, Obj.Type.String); 29 const ret = Ret{ .objects = objects, ._call = struct { 30 pub fn concatenate(self: *const Ret, lhs: *Obj, rhs: *Obj) Error!*Obj { 31 return try self.objects.emplace_cast(.String, null, &.{ (lhs.cast(.String) catch unreachable).slice(), (rhs.cast(.String) catch unreachable).slice() }); 32 } 33 }.concatenate }; 34 return ret; 35 } 36 37 pub const add = Type(Value.number, Value.number){ .call = struct { 38 pub inline fn add(a: Number, b: Number) Error!Number { 39 return a + b; 40 } 41 }.add }; 42 pub const mul = Type(Value.number, Value.number){ .call = struct { 43 pub inline fn mul(a: Number, b: Number) Error!Number { 44 return a * b; 45 } 46 }.mul }; 47 pub const sub = Type(Value.number, Value.number){ .call = struct { 48 pub inline fn sub(a: Number, b: Number) Error!Number { 49 return a - b; 50 } 51 }.sub }; 52 pub const div = Type(Value.number, Value.number){ .call = struct { 53 pub inline fn div(a: Number, b: Number) Error!Number { 54 return a / b; 55 } 56 }.div }; 57 pub const less = Type(Value.number, Value.bool){ .call = struct { 58 pub inline fn less(a: Number, b: Number) Error!Bool { 59 return a < b; 60 } 61 }.less }; 62 pub const more = Type(Value.number, Value.bool){ .call = struct { 63 pub inline fn more(a: Number, b: Number) Error!Bool { 64 return a > b; 65 } 66 }.more };