summaryrefslogtreecommitdiff
path: root/lambda/matching.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lambda/matching.ml')
-rw-r--r--lambda/matching.ml100
1 files changed, 52 insertions, 48 deletions
diff --git a/lambda/matching.ml b/lambda/matching.ml
index 0dc275d971..7d6f34e84b 100644
--- a/lambda/matching.ml
+++ b/lambda/matching.ml
@@ -135,7 +135,8 @@ let all_record_args lbls =
| (_, { lbl_all }, _) :: _ ->
let t =
Array.map
- (fun lbl -> (mknoloc (Longident.Lident "?temp?"), lbl, omega))
+ (fun lbl ->
+ (mknoloc (Longident.Lident "?temp?"), lbl, Patterns.omega))
lbl_all
in
List.iter (fun ((_, lbl, _) as x) -> t.(lbl.lbl_pos) <- x) lbls;
@@ -149,14 +150,14 @@ let rec expand_record p =
| _ -> p
let expand_record_head head =
- match Pattern_head.desc head with
+ match Patterns.Head.desc head with
| Record _ ->
- head |> Pattern_head.to_omega_pattern |> expand_record
- |> Pattern_head.deconstruct |> fst
+ head |> Patterns.Head.to_omega_pattern |> expand_record
+ |> Patterns.Head.deconstruct |> fst
| _ -> head
let head_loc ~scopes head =
- Scoped_location.of_location ~scopes (Pattern_head.loc head)
+ Scoped_location.of_location ~scopes (Patterns.Head.loc head)
type 'a clause = 'a * lambda
@@ -296,7 +297,7 @@ end = struct
in
match p.pat_desc with
| `Any -> stop p `Any
- | `Var (id, s) -> continue p (`Alias (omega, id, s))
+ | `Var (id, s) -> continue p (`Alias (Patterns.omega, id, s))
| `Alias (p, id, _) ->
let k = Typeopt.value_kind p.pat_env p.pat_type in
aux
@@ -326,7 +327,7 @@ module Simple : sig
type clause = pattern Non_empty_clause.t
- val head : pattern -> Pattern_head.t
+ val head : pattern -> Patterns.Head.t
val explode_or_pat :
Half_simple.pattern * Typedtree.pattern list ->
@@ -341,7 +342,7 @@ end = struct
type clause = pattern Non_empty_clause.t
let head p =
- fst (Pattern_head.deconstruct (General.erase (p :> General.pattern)))
+ fst (Patterns.Head.deconstruct (General.erase (p :> General.pattern)))
let alpha env (p : pattern) : pattern =
let alpha_pat env p = Typedtree.alpha_pat env p in
@@ -384,7 +385,7 @@ end = struct
| `Alias (p, id, _) -> split_explode p (id :: aliases) rem
| `Var (id, str) ->
explode
- { p with pat_desc = `Alias (Parmatch.omega, id, str) }
+ { p with pat_desc = `Alias (Patterns.omega, id, str) }
aliases rem
| #simple_view as view ->
let env = mk_alpha_env arg aliases vars in
@@ -405,7 +406,7 @@ type initial_clause = pattern list clause
type matrix = pattern list list
-let add_omega_column pss = List.map (fun ps -> omega :: ps) pss
+let add_omega_column pss = List.map (fun ps -> Patterns.omega :: ps) pss
let rec rev_split_at n ps =
if n <= 0 then
@@ -422,8 +423,8 @@ exception NoMatch
let matcher discr (p : Simple.pattern) rem =
let discr = expand_record_head discr in
let p = expand_record_simple p in
- let omegas = omegas (Pattern_head.arity discr) in
- let ph, args = Pattern_head.deconstruct (General.erase p) in
+ let omegas = Patterns.(omegas (Head.arity discr)) in
+ let ph, args = Patterns.Head.deconstruct (General.erase p) in
let yes () = args @ rem in
let no () = raise NoMatch in
let yesif b =
@@ -432,7 +433,7 @@ let matcher discr (p : Simple.pattern) rem =
else
no ()
in
- match (Pattern_head.desc discr, Pattern_head.desc ph) with
+ match (Patterns.Head.desc discr, Patterns.Head.desc ph) with
| Any, _ -> rem
| ( ( Constant _ | Construct _ | Variant _ | Lazy | Array _ | Record _
| Tuple _ ),
@@ -489,7 +490,7 @@ module Context : sig
val eprintf : t -> unit
- val specialize : Pattern_head.t -> t -> t
+ val specialize : Patterns.Head.t -> t -> t
val lshift : t -> t
@@ -522,7 +523,7 @@ end = struct
let lforget { left; right } =
match right with
- | _ :: xs -> { left = omega :: left; right = xs }
+ | _ :: xs -> { left = Patterns.omega :: left; right = xs }
| _ -> assert false
let rshift { left; right } =
@@ -547,7 +548,7 @@ end = struct
let empty = []
- let start n : t = [ { left = []; right = omegas n } ]
+ let start n : t = [ { left = []; right = Patterns.omegas n } ]
let is_empty = function
| [] -> true
@@ -583,13 +584,13 @@ end = struct
| `Or (p1, p2, _) ->
filter_rec ((left, p1, right) :: (left, p2, right) :: rem)
| `Alias (p, _, _) -> filter_rec ((left, p, right) :: rem)
- | `Var _ -> filter_rec ((left, omega, right) :: rem)
+ | `Var _ -> filter_rec ((left, Patterns.omega, right) :: rem)
| #simple_view as view -> (
let p = { p with pat_desc = view } in
match matcher head p right with
| exception NoMatch -> filter_rec rem
| right ->
- let left = Pattern_head.to_omega_pattern head :: left in
+ let left = Patterns.Head.to_omega_pattern head :: left in
{ Row.left; right }
:: filter_rec rem
)
@@ -628,7 +629,7 @@ end
let rec flatten_pat_line size p k =
match p.pat_desc with
- | Tpat_any -> omegas size :: k
+ | Tpat_any -> Patterns.omegas size :: k
| Tpat_tuple args -> args :: k
| Tpat_or (p1, p2, _) ->
flatten_pat_line size p1 (flatten_pat_line size p2 k)
@@ -675,7 +676,7 @@ module Default_environment : sig
val cons : matrix -> int -> t -> t
- val specialize : Pattern_head.t -> t -> t
+ val specialize : Patterns.Head.t -> t -> t
val pop_column : t -> t
@@ -708,7 +709,7 @@ end = struct
let p = General.view p in
match p.pat_desc with
| `Alias (p, _, _) -> filter_rec ((p, ps) :: rem)
- | `Var _ -> filter_rec ((omega, ps) :: rem)
+ | `Var _ -> filter_rec ((Patterns.omega, ps) :: rem)
| `Or (p1, p2, _) -> filter_rec_or p1 p2 ps rem
| #simple_view as view -> (
let p = { p with pat_desc = view } in
@@ -806,7 +807,7 @@ end = struct
make_rec env
let specialize head def =
- specialize_ (Pattern_head.arity head) (matcher head) def
+ specialize_ (Patterns.Head.arity head) (matcher head) def
let pop_column def = specialize_ 0 (fun _p rem -> rem) def
@@ -1125,10 +1126,10 @@ let half_simplify_clause ~arg (cls : Typedtree.pattern list clause) =
let rec what_is_cases ~skip_any cases =
match cases with
- | [] -> Pattern_head.omega
+ | [] -> Patterns.Head.omega
| ((p, _), _) :: rem -> (
let head = Simple.head p in
- match Pattern_head.desc head with
+ match Patterns.Head.desc head with
| Any when skip_any -> what_is_cases ~skip_any rem
| _ -> head
)
@@ -1145,7 +1146,7 @@ let pm_free_variables { cases } =
(* Basic grouping predicates *)
let can_group discr pat =
- match (Pattern_head.desc discr, Pattern_head.desc (Simple.head pat)) with
+ match (Patterns.Head.desc discr, Patterns.Head.desc (Simple.head pat)) with
| Any, Any
| Constant (Const_int _), Constant (Const_int _)
| Constant (Const_char _), Constant (Const_char _)
@@ -1193,7 +1194,7 @@ let rec omega_like p =
| _ -> false
let simple_omega_like p =
- match Pattern_head.desc (Simple.head p) with
+ match Patterns.Head.desc (Simple.head p) with
| Any -> true
| _ -> false
@@ -1413,7 +1414,7 @@ and split_no_or cls args def k =
insert_split group_discr yes no def k
and insert_split group_discr yes no def k =
let precompile_group =
- match Pattern_head.desc group_discr with
+ match Patterns.Head.desc group_discr with
| Any -> precompile_var
| _ -> do_not_precompile
in
@@ -1426,7 +1427,7 @@ and split_no_or cls args def k =
(Default_environment.cons matrix idef def)
((idef, next) :: nexts)
and should_split group_discr =
- match Pattern_head.desc group_discr with
+ match Patterns.Head.desc group_discr with
| Construct { cstr_tag = Cstr_extension _ } ->
(* it is unlikely that we will raise anything, so we split now *)
true
@@ -1548,7 +1549,7 @@ and precompile_or argo (cls : Simple.clause list) ors args def k =
(id, Typeopt.value_kind orp.pat_env ty))
in
let or_num = next_raise_count () in
- let new_patl = Parmatch.omega_list patl in
+ let new_patl = Patterns.omega_list patl in
let mk_new_action ~vars =
Lstaticraise (or_num, List.map (fun v -> Lvar v) vars)
in
@@ -1616,7 +1617,7 @@ let split_and_precompile ~arg_id ~arg_lambda pm =
type cell = {
pm : initial_clause pattern_matching;
ctx : Context.t;
- discr : Pattern_head.t
+ discr : Patterns.Head.t
}
(** a submatrix after specializing by discriminant pattern;
[ctx] is the context shared by all rows. *)
@@ -1730,7 +1731,7 @@ let get_pat_args_constr p rem =
let get_expr_args_constr ~scopes head (arg, _mut) rem =
let cstr =
- match Pattern_head.desc head with
+ match Patterns.Head.desc head with
| Construct cstr -> cstr
| _ -> fatal_error "Matching.get_expr_args_constr"
in
@@ -1819,13 +1820,13 @@ let divide_var ctx pm =
divide_line Context.lshift
get_expr_args_var
get_pat_args_var
- Pattern_head.omega ctx pm
+ Patterns.Head.omega ctx pm
(* Matching and forcing a lazy value *)
let get_pat_args_lazy p rem =
match p with
- | { pat_desc = Tpat_any } -> omega :: rem
+ | { pat_desc = Tpat_any } -> Patterns.omega :: rem
| { pat_desc = Tpat_lazy arg } -> arg :: rem
| _ -> assert false
@@ -1976,13 +1977,13 @@ let divide_lazy ~scopes head ctx pm =
let get_pat_args_tuple arity p rem =
match p with
- | { pat_desc = Tpat_any } -> omegas arity @ rem
+ | { pat_desc = Tpat_any } -> Patterns.omegas arity @ rem
| { pat_desc = Tpat_tuple args } -> args @ rem
| _ -> assert false
let get_expr_args_tuple ~scopes head (arg, _mut) rem =
let loc = head_loc ~scopes head in
- let arity = Pattern_head.arity head in
+ let arity = Patterns.Head.arity head in
let rec make_args pos =
if pos >= arity then
rem
@@ -1992,7 +1993,7 @@ let get_expr_args_tuple ~scopes head (arg, _mut) rem =
make_args 0
let divide_tuple ~scopes head ctx pm =
- let arity = Pattern_head.arity head in
+ let arity = Patterns.Head.arity head in
divide_line (Context.specialize head)
(get_expr_args_tuple ~scopes)
(get_pat_args_tuple arity)
@@ -2001,7 +2002,7 @@ let divide_tuple ~scopes head ctx pm =
(* Matching against a record pattern *)
let record_matching_line num_fields lbl_pat_list =
- let patv = Array.make num_fields omega in
+ let patv = Array.make num_fields Patterns.omega in
List.iter (fun (_, lbl, pat) -> patv.(lbl.lbl_pos) <- pat) lbl_pat_list;
Array.to_list patv
@@ -2015,7 +2016,7 @@ let get_pat_args_record num_fields p rem =
let get_expr_args_record ~scopes head (arg, _mut) rem =
let loc = head_loc ~scopes head in
let all_labels =
- match Pattern_head.desc head with
+ match Patterns.Head.desc head with
| Record (lbl :: _) -> lbl.lbl_all
| Record []
| _ ->
@@ -2069,7 +2070,7 @@ let get_pat_args_array p rem =
let get_expr_args_array ~scopes kind head (arg, _mut) rem =
let len =
- match Pattern_head.desc head with
+ match Patterns.Head.desc head with
| Array len -> len
| _ -> assert false
in
@@ -2972,7 +2973,7 @@ let compile_list compile_fun division =
in
( (key, lambda1) :: c_rem,
total,
- Pattern_head.to_omega_pattern cell.discr :: new_discrs )
+ Patterns.Head.to_omega_pattern cell.discr :: new_discrs )
with Unused -> c_rec totals rem
)
in
@@ -3219,9 +3220,9 @@ and do_compile_matching ~scopes repr partial ctx pmh =
assert false
in
let ph = what_is_cases pm.cases in
- let pomega = Pattern_head.to_omega_pattern ph in
+ let pomega = Patterns.Head.to_omega_pattern ph in
let ploc = head_loc ~scopes ph in
- match Pattern_head.desc ph with
+ match Patterns.Head.desc ph with
| Any ->
compile_no_test ~scopes
divide_var
@@ -3246,7 +3247,7 @@ and do_compile_matching ~scopes repr partial ctx pmh =
(compile_match ~scopes repr partial)
partial (divide_constructor ~scopes)
(combine_constructor ploc arg
- (Pattern_head.env ph) cstr partial)
+ (Patterns.Head.env ph) cstr partial)
ctx pm
| Array _ ->
let kind = Typeopt.array_pattern_kind pomega in
@@ -3385,7 +3386,8 @@ let compile_matching ~scopes repr handler_fun arg pat_act_list partial =
let pm =
{ cases = List.map (fun (pat, act) -> ([ pat ], act)) pat_act_list;
args = [ (arg, Strict) ];
- default = Default_environment.(cons [ [ omega ] ] raise_num empty)
+ default =
+ Default_environment.(cons [ [ Patterns.omega ] ] raise_num empty)
}
in
try
@@ -3609,11 +3611,11 @@ let for_let ~scopes loc param pat body =
let for_tupled_function ~scopes loc paraml pats_act_list partial =
let partial = check_partial_list pats_act_list partial in
let raise_num = next_raise_count () in
- let omegas = [ List.map (fun _ -> omega) paraml ] in
+ let omega_params = [ Patterns.omega_list paraml ] in
let pm =
{ cases = pats_act_list;
args = List.map (fun id -> (Lvar id, Strict)) paraml;
- default = Default_environment.(cons omegas raise_num empty)
+ default = Default_environment.(cons omega_params raise_num empty)
}
in
try
@@ -3627,7 +3629,7 @@ let for_tupled_function ~scopes loc paraml pats_act_list partial =
let flatten_pattern size p =
match p.pat_desc with
| Tpat_tuple args -> args
- | Tpat_any -> omegas size
+ | Tpat_any -> Patterns.omegas size
| _ -> raise Cannot_flatten
let flatten_cases size cases =
@@ -3685,7 +3687,9 @@ let do_for_multiple_match ~scopes loc paraml pat_act_list partial =
match partial with
| Partial ->
let raise_num = next_raise_count () in
- (raise_num, Default_environment.(cons [ [ omega ] ] raise_num empty))
+ ( raise_num,
+ Default_environment.(cons [ [ Patterns.omega ] ] raise_num empty)
+ )
| Total -> (-1, Default_environment.empty)
in
let loc = Scoped_location.of_location ~scopes loc in