type slotidx = int type mthdidx = int type vtable = { n_slots : int; elems : (string, elem) Hashtbl.t; mthds : mthd array; } and elem = | Field of slotidx | Method of mthdidx and mthd = .. type t = | Nil | True | False | Int of int64 | Obj of vtable * t array let make_obj vtable = Obj (vtable, Array.make vtable.n_slots Nil) let int n = Int (Int64.of_int n) let bool = function | true -> True | false -> False let rec pp ppf = function | Obj (vtable, slots) -> pp_obj ppf vtable slots | Int n -> Fmt.string ppf (Int64.to_string n) | v -> Fmt.pf ppf "%S" (to_string v) and to_string = function | Nil -> "nil" | True -> "true" | False -> "false" | v -> Fmt.str "%a" pp v and pp_obj ppf vtable slots = Fmt.pf ppf "{"; let sep = ref "" in Hashtbl.iter (fun name -> function | Method _ -> () | Field idx -> Fmt.pf ppf "%s%S:%a" !sep name pp slots.(idx); sep := ",") vtable.elems; Fmt.pf ppf "}" type mthd += | Native_function of (t -> t list -> t) let call mthd self args = match mthd with | Native_function f -> f self args | _ -> raise Not_found