@@ -1066,7 +1066,7 @@ let is_explicit_lit l =
10661066
10671067let rec is_explicit_pat p =
10681068 match p.it with
1069- | WildP | VarP _ -> false
1069+ | WildP | VarP _ | GivenP _ -> false
10701070 | LitP l | SignP (_ , l ) -> is_explicit_lit ! l
10711071 | OptP p1 | TagP (_ , p1 ) | ParP p1 -> is_explicit_pat p1
10721072 | TupP ps -> List. for_all is_explicit_pat ps
@@ -1313,6 +1313,7 @@ and combine_pat_srcs env t pat : unit =
13131313 match pat.it with
13141314 | WildP -> ()
13151315 | VarP id -> combine_id_srcs env t id
1316+ | GivenP id -> combine_id_srcs env t id.id
13161317 | LitP _ -> ()
13171318 | SignP _ -> ()
13181319 | TupP pats ->
@@ -3186,7 +3187,7 @@ and infer_pat' name_types env pat : T.typ * Scope.val_env =
31863187 match pat.it with
31873188 | WildP ->
31883189 error env pat.at " M0102" " cannot infer type of wildcard"
3189- | VarP _ ->
3190+ | VarP _ | GivenP _ ->
31903191 error env pat.at " M0103" " cannot infer type of variable"
31913192 | LitP lit ->
31923193 T. Prim (infer_lit env lit pat.at), T.Env. empty
@@ -3304,6 +3305,8 @@ and check_pat_aux' env t pat val_kind : Scope.val_env =
33043305 T.Env. empty
33053306 | VarP id ->
33063307 T.Env. singleton id.it (None , t, id.at, val_kind)
3308+ | GivenP { id; implicit } ->
3309+ T.Env. singleton id.it (Some implicit.it, t, id.at, val_kind)
33073310 | LitP lit ->
33083311 if not env.pre then begin
33093312 let t' = if eq env pat.at t T. nat then T. int else t in (* account for Nat <: Int *)
@@ -3584,7 +3587,7 @@ and vis_dec src dec xs : visibility_env =
35843587and vis_pat src pat xs : visibility_env =
35853588 match pat.it with
35863589 | WildP | LitP _ | SignP _ -> xs
3587- | VarP id -> vis_val_id src id xs
3590+ | VarP id | GivenP { id; _} -> vis_val_id src id xs
35883591 | TupP pats -> List. fold_right (vis_pat src) pats xs
35893592 | ObjP pfs -> List. fold_right (vis_pat_field src) pfs xs
35903593 | AltP (pat1, _)
@@ -4282,7 +4285,7 @@ and gather_dec env scope dec : Scope.t =
42824285 | VarP id -> Scope. adjoin scope (Scope. mixin id.it (imports, args, t, decs))
42834286 | _ -> error env pat.at " M0229" " mixins may only be imported by binding to a name"
42844287 )
4285- | VarD (id , _ ) -> Scope. adjoin_val_env scope (gather_id env scope.Scope. val_env id Scope. Declaration )
4288+ | VarD (id , _ ) -> Scope. adjoin_val_env scope (gather_id env scope.Scope. val_env id None Scope. Declaration )
42864289 | TypD (id , binds , _ ) | ClassD (_ , _ , _ , id , binds , _ , _ , _ , _ ) ->
42874290 let open Scope in
42884291 if T.Env. mem id.it scope.typ_env then
@@ -4342,7 +4345,8 @@ and gather_pat env (scope : Scope.t) pat : Scope.t =
43424345and gather_pat_aux env val_kind scope pat : Scope.t =
43434346 match pat.it with
43444347 | WildP | LitP _ | SignP _ -> scope
4345- | VarP id -> Scope. adjoin_val_env scope (gather_id env scope.Scope. val_env id val_kind)
4348+ | VarP id -> Scope. adjoin_val_env scope (gather_id env scope.Scope. val_env id None val_kind)
4349+ | GivenP { id; implicit } -> Scope. adjoin_val_env scope (gather_id env scope.Scope. val_env id (Some implicit.it) val_kind)
43464350 | TupP pats -> List. fold_left (gather_pat env) scope pats
43474351 | ObjP pfs -> List. fold_left (gather_pat_field env) scope pfs
43484352 | TagP (_, pat1) | AltP (pat1, _) | OptP pat1
@@ -4354,11 +4358,10 @@ and gather_pat_field env scope pf : Scope.t =
43544358 | ValPF (id , pat ) -> gather_pat_aux env val_kind scope pat
43554359 | TypPF id -> gather_typ_id env scope id
43564360
4357- and gather_id env ve id val_kind : Scope.val_env =
4361+ and gather_id env ve id implicit val_kind : Scope.val_env =
43584362 if T.Env. mem id.it ve then
43594363 error_duplicate env " " id;
4360- (* TODO *)
4361- T.Env. add id.it (None , T. Pre , id.at, val_kind) ve
4364+ T.Env. add id.it (implicit, T. Pre , id.at, val_kind) ve
43624365
43634366and gather_typ_id env scope id : Scope.t =
43644367 let open Scope in
@@ -4423,13 +4426,17 @@ and infer_dec_typdecs env dec : Scope.t =
44234426 (match infer_val_path env exp with
44244427 | None -> Scope. empty
44254428 | Some t ->
4426- let open Scope in
4427- (* TODO *)
44284429 match T. promote t with
4429- | T. Obj (_ , _ ) as t' -> { Scope. empty with val_env = singleton id None t' }
4430- | _ -> { Scope. empty with val_env = singleton id None T. Pre }
4431- )
4432- end
4430+ | T. Obj (_ , _ ) as t' -> Scope. { empty with val_env = singleton id None t' }
4431+ | _ -> Scope. { empty with val_env = singleton id None T. Pre }
4432+ ) end
4433+ | LetD ({it = GivenP { id; implicit } ; _} , exp , _ ) ->
4434+ (match infer_val_path env exp with
4435+ | None -> Scope. empty
4436+ | Some t ->
4437+ match T. promote t with
4438+ | T. Obj (_ , _ ) as t' -> Scope. { empty with val_env = singleton id (Some implicit.it) t' }
4439+ | _ -> Scope. { empty with val_env = singleton id (Some implicit.it) T. Pre })
44334440 | LetD (pat , exp , _ ) ->
44344441 begin match infer_val_path env exp with
44354442 | Some t ->
0 commit comments