Fix use type of last expression in a sequence
authorSiraaj Khandkar <siraaj@khandkar.net>
Fri, 14 Sep 2018 16:02:48 +0000 (12:02 -0400)
committerSiraaj Khandkar <siraaj@khandkar.net>
Fri, 14 Sep 2018 16:02:48 +0000 (12:02 -0400)
compiler/src/lib/tiger/tiger_semant.ml

index 082760f..70639e9 100644 (file)
@@ -100,12 +100,18 @@ end = struct
               E.raise (E.Wrong_type_used_as_record {ty_id=typ; ty; pos})
             );
           return ty
-      | A.SeqExp exps ->
-          (* Ignoring value because we only care if a type-checking exception
-           * is raised in one of trexp calls: *)
-          List.iter exps ~f:(fun (exp, _) -> ignore (trexp exp));
-          (* FIXME: Return type of last expression, not unit. *)
+      | A.SeqExp [] ->
           return_unit
+      | A.SeqExp exps ->
+          let last xs =
+            xs
+            |> List.rev  (* Yes, redundant, but clean-looking ;-P *)
+            |> List.hd   (* Empty is matched in above SeqExp match case *)
+          in
+          exps
+          |> List.map ~f:(fun (exp, _) -> let {ty; _} = trexp exp in ty)
+          |> last
+          |> return
       | A.AssignExp {var; exp; pos} ->
           check_same (trvar var) (trexp exp) ~pos;
           (* TODO: Add var->exp to val env? *)
This page took 0.025465 seconds and 4 git commands to generate.