X-Git-Url: https://git.xandkar.net/?p=tiger.ml.git;a=blobdiff_plain;f=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_env_type.ml;h=bb8cdd605f54499df41f01d4dc3a08ef34446ce0;hp=041d4213a64fce5a8f370aeb6e4ccb2e5edf1835;hb=523e2b063b9ba20329af61e18dc9a5ccbaca06a0;hpb=1e835a256b232c01f8af88f78782829764353f70 diff --git a/compiler/src/lib/tiger/tiger_env_type.ml b/compiler/src/lib/tiger/tiger_env_type.ml index 041d421..bb8cdd6 100644 --- a/compiler/src/lib/tiger/tiger_env_type.ml +++ b/compiler/src/lib/tiger/tiger_env_type.ml @@ -15,13 +15,15 @@ type t = | String | Record of { unique : unique - ; fields : (Symbol.t * t) list + ; fields : record_fields } | Array of { unique : unique ; ty : t } | Name of Symbol.t * t option ref +and record_fields = + (Tiger_symbol.t * t) list type env = (Symbol.t, t ) Map.t @@ -50,23 +52,29 @@ let is_equal t1 t2 = * TODO: Can we ignore the warning locally? * *) -let is_record = function +let is_int t = + t = Int + +let is_string t = + t = String + +let is_array = function | Unit | Int | String | Name _ - | Array _ -> false - | Nil (* nil belongs to ANY record *) - | Record _ -> true + | Nil + | Record _ -> false + | Array _ -> true -let is_int = function +let is_record = function | Unit - | Nil + | Int | String | Name _ - | Record _ + | Nil | Array _ -> false - | Int -> true + | Record _ -> true let is_name = function | Unit @@ -77,6 +85,18 @@ let is_name = function | Array _ -> false | Name _ -> true +let if_record t ~f ~otherwise = + match t with + | Record {fields; _} -> + f fields + | Unit + | Int + | String + | Name _ + | Nil + | Array _ -> + otherwise () + let to_string = function | Unit -> "unit" | Nil -> "nil"