WIP type-checking
[tiger.ml.git] / compiler / src / lib / tiger / tiger_env_type.ml
index 041d421..bb8cdd6 100644 (file)
@@ -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"
This page took 0.023175 seconds and 4 git commands to generate.