diff options
| author | Kathy Gray | 2014-10-28 11:40:30 +0000 |
|---|---|---|
| committer | Kathy Gray | 2014-10-28 11:40:30 +0000 |
| commit | 58bb92ad73b75028dd737a653a856bf9c44d8c43 (patch) | |
| tree | ae89592497e34ecc7a4aaa26a01f74be03230508 | |
| parent | af5c83206554e5744842290273121d673022630c (diff) | |
Add proper tag to constructors when storing continuation
| -rw-r--r-- | src/lem_interp/interp.lem | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/src/lem_interp/interp.lem b/src/lem_interp/interp.lem index 4965deb8..a2f224af 100644 --- a/src/lem_interp/interp.lem +++ b/src/lem_interp/interp.lem @@ -21,6 +21,8 @@ let intern_annot annot = let val_annot typ = Just(typ,Tag_empty,[],pure) +let ctor_annot typ = Just(typ,Tag_ctor,[],pure) + (* This is different from OCaml: it will drop elements from the longest list. *) let foldr2 f x l l' = List.foldr (Tuple.uncurry f) x (List.zip l l') let map2 f l l' = List.map (Tuple.uncurry f) (List.zip l l') @@ -621,7 +623,8 @@ let rec val_typ v = (* When mode.track_values keeps tracking on registers by extending environment *) let rec to_exp mode env v : (exp tannot * lenv) = - let annot = (Interp_ast.Unknown, (val_annot (val_typ v))) in + let mk_annot is_ctor = (Interp_ast.Unknown, if is_ctor then (ctor_annot (val_typ v)) else (val_annot (val_typ v))) in + let annot = mk_annot false in let mapf vs ((LEnv l env) as lenv) : (list (exp tannot) * lenv) = let (es, env) = List.foldr (fun v (es,env) -> let (e,ev) = (to_exp mode env v) in @@ -660,17 +663,17 @@ let rec to_exp mode env v : (exp tannot * lenv) = | V_list(vals) -> let (es,env') = mapf vals env in (E_aux (E_list es) annot, env') | V_ctor id t vals -> (match vals with - | V_lit (L_aux L_unit _) -> (E_aux (E_id id) annot, env) - | V_track (V_lit (L_aux L_unit _)) _ -> (E_aux (E_id id) annot, env) - | V_tuple vals -> let (es,env') = mapf vals env in (E_aux (E_app id es) annot, env') - | V_track (V_tuple vals) _ -> let (es,env') = mapf vals env in (E_aux (E_app id es) annot, env') + | V_lit (L_aux L_unit _) -> (E_aux (E_id id) (mk_annot true), env) + | V_track (V_lit (L_aux L_unit _)) _ -> (E_aux (E_id id) (mk_annot true), env) + | V_tuple vals -> let (es,env') = mapf vals env in (E_aux (E_app id es) (mk_annot true), env') + | V_track (V_tuple vals) _ -> let (es,env') = mapf vals env in (E_aux (E_app id es) (mk_annot true), env') | V_track _ _ -> if mode.track_values then begin let (fid,env') = fresh_var env in let env' = add_to_env (fid,vals) env' in - (E_aux (E_app id [(E_aux (E_id fid) (Interp_ast.Unknown, (val_annot (val_typ vals))))]) annot, env') + (E_aux (E_app id [(E_aux (E_id fid) (Interp_ast.Unknown, (val_annot (val_typ vals))))]) (mk_annot true), env') end - else let (e,env') = (to_exp mode env vals) in (E_aux (E_app id [e]) annot, env') end) + else let (e,env') = (to_exp mode env vals) in (E_aux (E_app id [e]) (mk_annot true), env') end) | V_register (Reg id tan) -> (E_aux (E_id id) annot, env) | V_track v' _ -> if mode.track_values |
