DzLox

:)
git clone https://git.sr.ht/~ashymad/DzLox
Log | Files | Refs | Submodules | LICENSE

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 };