3 module List = ListLabels
6 module Symbol = Tiger_symbol
18 ; fields : record_fields
24 | Name of Symbol.t * t option ref
26 (Tiger_symbol.t * t) list
34 let new_record fields =
37 ; unique = new_unique ()
43 ; unique = new_unique ()
48 | Name (s1, _) , Name (s2, _) -> Symbol.is_equal s1 s2
49 | Record {unique=u1; _}, Record {unique=u2; _} -> u1 == u2
50 | Record _ , Nil -> true
51 | Nil , Record _ -> true
52 | Array {unique=u1; _}, Array {unique=u2; _} -> u1 == u2
54 (* The above pattern matching is "fragile" and I'm OK with it.
55 * TODO: Can we ignore the warning locally?
64 let is_array = function
73 let is_record = function
82 let is_name = function
91 let if_record t ~f ~otherwise =
93 | Record {fields; _} ->
103 let if_array t ~f ~otherwise =
115 let to_string = function
119 | Record {unique; _} -> sprintf "record(%d)" (Obj.magic unique)
120 | Array {unique; _} -> sprintf "array(%d)" (Obj.magic unique)
122 | Name (name, _) -> Symbol.to_string name
128 ; ("string" , String)
130 |> List.map ~f:(fun (k, v) -> (Symbol.of_string k, v))