aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/trans.icl173
1 files changed, 130 insertions, 43 deletions
diff --git a/frontend/trans.icl b/frontend/trans.icl
index 4ebf56b..6f3b23b 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -7,7 +7,7 @@ import StdEnv
import syntax, transform, checksupport, StdCompare, check, utilities, unitype, typesupport, type
import classify, partition
-
+
SwitchCaseFusion fuse dont_fuse :== fuse
SwitchGeneratedFusion fuse dont_fuse :== fuse
SwitchFunctionFusion fuse dont_fuse :== fuse
@@ -394,15 +394,21 @@ where
// = transformApplication { app_symb = folder, app_args = folder_args, app_info_ptr = nilPtr } [] ro ti
// where
isFoldExpression (App app) = isFoldSymbol app.app_symb.symb_kind
+ where
+ isFoldSymbol (SK_Function {glob_module,glob_object})
+ | glob_module==ro.ro_stdStrictLists_module_n
+ # type_arity = ro.ro_imported_funs.[glob_module].[glob_object].ft_type.st_arity
+ | type_arity==0 || (type_arity==2 && case app.app_args of [_:_] -> True; _ -> False)
+ = False
+ = True
+ = True
+ isFoldSymbol (SK_LocalMacroFunction _) = True
+ isFoldSymbol (SK_GeneratedFunction _ _) = True
+ isFoldSymbol _ = False
isFoldExpression (Var _) = True
// isFoldExpression (Case _) = True
isFoldExpression _ = False
- isFoldSymbol (SK_Function _) = True
- isFoldSymbol (SK_LocalMacroFunction _) = True
- isFoldSymbol (SK_GeneratedFunction _ _) = True
- isFoldSymbol _ = False
-
folder = ro.ro_fun_orig
folder_args = f_a_before` ++ [guard_expr:f_a_after`]
old_f_a_before = takeWhile (\e -> not (isMember e aci.aci_params)) ro.ro_fun_args
@@ -432,23 +438,29 @@ where
new_case = { outer_case & case_expr = guard_expr, case_guards=outer_guards, case_info_ptr=new_info_ptr }
= transformCase new_case ro ti
-transCase is_active opt_aci this_case=:{case_expr = case_expr=:(App app=:{app_symb,app_args}),case_guards,case_default,case_explicit} ro ti
+transCase is_active opt_aci this_case=:{case_expr = case_expr=:(App app=:{app_symb,app_args}),case_guards,case_default,case_explicit,case_ident} ro ti
= case app_symb.symb_kind of
SK_Constructor cons_index
| not is_active
-> skip_over this_case ro ti // XXX currently only active cases are matched at runtime (multimatch problem)
- # aci = case opt_aci of
- Yes aci -> aci
- (may_be_match_expr, ti) = match_and_instantiate aci.aci_linearity_of_patterns cons_index app_args case_guards case_default ro ti
- -> case may_be_match_expr of
- Yes match_expr
- -> (match_expr, ti)
- No
- -> (neverMatchingCase never_ident, ti) <-!- ("transCase:App:neverMatchingCase",never_ident)
- with
- never_ident = case ro.ro_root_case_mode of
- NotRootCase -> this_case.case_ident
- _ -> Yes ro.ro_fun_case.symb_name
+ # aci_linearity_of_patterns = case opt_aci of
+ Yes aci -> aci.aci_linearity_of_patterns
+ (may_be_match_expr, ti) = match_and_instantiate aci_linearity_of_patterns cons_index app_args case_guards case_default ro ti
+ -> expr_or_never_matching_case may_be_match_expr case_ident ti
+
+ SK_Function {glob_module,glob_object}
+ | glob_module==ro.ro_stdStrictLists_module_n && is_active &&
+ (let type = ro.ro_imported_funs.[glob_module].[glob_object].ft_type
+ in (type.st_arity==0 || (type.st_arity==2 && case app_args of [_:_] -> True; _ -> False)))
+ # type = ro.ro_imported_funs.[glob_module].[glob_object].ft_type
+ | type.st_arity==0
+ # (may_be_match_expr, ti) = match_and_instantiate_overloaded_nil case_guards case_default ro ti
+ -> expr_or_never_matching_case may_be_match_expr case_ident ti
+ # aci_linearity_of_patterns = case opt_aci of
+ Yes aci -> aci.aci_linearity_of_patterns
+ (may_be_match_expr, ti) = match_and_instantiate_overloaded_cons type aci_linearity_of_patterns app_args case_guards case_default ro ti
+ -> expr_or_never_matching_case may_be_match_expr case_ident ti
+
// otherwise it's a function application
_ -> case opt_aci of
Yes aci=:{ aci_params, aci_opt_unfolder }
@@ -535,50 +547,115 @@ where
match_and_instantiate linearities cons_index app_args (AlgebraicPatterns _ algebraicPatterns) case_default ro ti
= match_and_instantiate_algebraic_type linearities cons_index app_args algebraicPatterns case_default ro ti
where
- match_and_instantiate_algebraic_type [linearity:linearities] cons_index app_args
- [{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards]
- case_default ro ti
+ match_and_instantiate_algebraic_type [linearity:linearities] cons_index app_args
+ [{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards] case_default ro ti
| cons_index.glob_module == glob_module && cons_index.glob_object == ds_index
# {cons_type} = ro.ro_common_defs.[glob_module].com_cons_defs.[ds_index]
- = instantiate linearity app_args ap_vars ap_expr cons_type ti
- = match_and_instantiate_algebraic_type linearities cons_index app_args guards case_default ro ti
- match_and_instantiate_algebraic_type [linearity:linearities] cons_index app_args [guard : guards] case_default ro ti
+ = instantiate linearity app_args ap_vars ap_expr cons_type.st_args_strictness cons_type.st_args ti
= match_and_instantiate_algebraic_type linearities cons_index app_args guards case_default ro ti
match_and_instantiate_algebraic_type _ cons_index app_args [] case_default ro ti
= transform case_default { ro & ro_root_case_mode = NotRootCase } ti
match_and_instantiate linearities cons_index app_args (OverloadedListPatterns (OverloadedList _ _ _ _) _ algebraicPatterns) case_default ro ti
= match_and_instantiate_overloaded_list linearities cons_index app_args algebraicPatterns case_default ro ti
where
- match_and_instantiate_overloaded_list [linearity:linearities] cons_index app_args
+ match_and_instantiate_overloaded_list [linearity:linearities] cons_index=:{glob_module=cons_glob_module,glob_object=cons_ds_index} app_args
[{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards]
case_default ro ti
- | equal_list_contructor glob_module ds_index cons_index
- # {cons_type} = ro.ro_common_defs.[glob_module].com_cons_defs.[ds_index]
- = instantiate linearity app_args ap_vars ap_expr cons_type ti
+ | equal_list_contructor glob_module ds_index cons_glob_module cons_ds_index
+ # {cons_type} = ro.ro_common_defs.[cons_glob_module].com_cons_defs.[cons_ds_index]
+ = instantiate linearity app_args ap_vars ap_expr cons_type.st_args_strictness cons_type.st_args ti
= match_and_instantiate_overloaded_list linearities cons_index app_args guards case_default ro ti
where
- equal_list_contructor glob_module ds_index {glob_module=cons_glob_module,glob_object=cons_ds_index}
+ equal_list_contructor glob_module ds_index cons_glob_module cons_ds_index
| glob_module==cPredefinedModuleIndex && cons_glob_module==cPredefinedModuleIndex
# index=ds_index+FirstConstructorPredefinedSymbolIndex
# cons_index=cons_ds_index+FirstConstructorPredefinedSymbolIndex
| index==PD_OverloadedConsSymbol
- = cons_index==PD_ConsSymbol || cons_index==PD_StrictConsSymbol || cons_index==PD_TailStrictConsSymbol || cons_index==PD_StrictTailStrictConsSymbol;
+ = cons_index==PD_ConsSymbol || cons_index==PD_StrictConsSymbol || cons_index==PD_TailStrictConsSymbol || cons_index==PD_StrictTailStrictConsSymbol
| index==PD_OverloadedNilSymbol
- = cons_index==PD_NilSymbol || cons_index==PD_StrictNilSymbol || cons_index==PD_TailStrictNilSymbol || cons_index==PD_StrictTailStrictNilSymbol;
+ = cons_index==PD_NilSymbol || cons_index==PD_StrictNilSymbol || cons_index==PD_TailStrictNilSymbol || cons_index==PD_StrictTailStrictNilSymbol
= abort "equal_list_contructor"
- match_and_instantiate_overloaded_list [linearity:linearities] cons_index app_args [guard : guards] case_default ro ti
- = match_and_instantiate_overloaded_list linearities cons_index app_args guards case_default ro ti
match_and_instantiate_overloaded_list _ cons_index app_args [] case_default ro ti
= transform case_default { ro & ro_root_case_mode = NotRootCase } ti
-
- instantiate linearity app_args ap_vars ap_expr cons_type ti
+
+ match_and_instantiate_overloaded_nil (OverloadedListPatterns _ _ algebraicPatterns) case_default ro ti
+ = match_and_instantiate_nil algebraicPatterns case_default ro ti
+ match_and_instantiate_overloaded_nil (AlgebraicPatterns _ algebraicPatterns) case_default ro ti
+ = match_and_instantiate_nil algebraicPatterns case_default ro ti
+
+ match_and_instantiate_nil [{ap_symbol={glob_module,glob_object={ds_index}},ap_expr} : guards] case_default ro ti
+ | glob_module==cPredefinedModuleIndex
+ # index=ds_index+FirstConstructorPredefinedSymbolIndex
+ | index==PD_NilSymbol || index==PD_StrictNilSymbol || index==PD_TailStrictNilSymbol || index==PD_StrictTailStrictNilSymbol ||
+ index==PD_OverloadedNilSymbol || index==PD_UnboxedNilSymbol || index==PD_UnboxedTailStrictNilSymbol
+ = instantiate [] [] [] ap_expr NotStrict [] ti
+ = match_and_instantiate_nil guards case_default ro ti
+ match_and_instantiate_nil [] case_default ro ti
+ = transform case_default { ro & ro_root_case_mode = NotRootCase } ti
+
+ match_and_instantiate_overloaded_cons cons_function_type linearities app_args (AlgebraicPatterns _ algebraicPatterns) case_default ro ti
+ = match_and_instantiate_overloaded_cons_boxed_match linearities app_args algebraicPatterns case_default ro ti
+ where
+ match_and_instantiate_overloaded_cons_boxed_match [linearity:linearities] app_args
+ [{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards]
+ case_default ro ti
+ | glob_module==cPredefinedModuleIndex
+ # index=ds_index+FirstConstructorPredefinedSymbolIndex
+ | index==PD_ConsSymbol || index==PD_StrictConsSymbol || index==PD_TailStrictConsSymbol || index==PD_StrictTailStrictConsSymbol
+ # {cons_type} = ro.ro_common_defs.[glob_module].com_cons_defs.[ds_index]
+ = instantiate linearity app_args ap_vars ap_expr cons_type.st_args_strictness cons_type.st_args ti
+ // | index==PD_NilSymbol || index==PD_StrictNilSymbol || index==PD_TailStrictNilSymbol || index==PD_StrictTailStrictNilSymbol
+ = match_and_instantiate_overloaded_cons_boxed_match linearities app_args guards case_default ro ti
+ // = abort "match_and_instantiate_overloaded_cons_boxed_match"
+ match_and_instantiate_overloaded_cons_boxed_match _ app_args [] case_default ro ti
+ = transform case_default { ro & ro_root_case_mode = NotRootCase } ti
+ match_and_instantiate_overloaded_cons cons_function_type linearities app_args (OverloadedListPatterns _ _ algebraicPatterns) case_default ro ti
+ = match_and_instantiate_overloaded_cons_overloaded_match linearities app_args algebraicPatterns case_default ro ti
+ where
+ match_and_instantiate_overloaded_cons_overloaded_match [linearity:linearities] app_args
+ [{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards]
+ case_default ro ti
+ | glob_module==cPredefinedModuleIndex
+ # index=ds_index+FirstConstructorPredefinedSymbolIndex
+ | index==PD_UnboxedConsSymbol || index==PD_UnboxedTailStrictConsSymbol || index==PD_OverloadedConsSymbol
+ = instantiate linearity app_args ap_vars ap_expr cons_function_type.st_args_strictness cons_function_type.st_args ti
+ // | index==PD_UnboxedNilSymbol || index==PD_UnboxedTailStrictNilSymbol || index==PD_OverloadedNilSymbol
+ = match_and_instantiate_overloaded_cons_overloaded_match linearities app_args guards case_default ro ti
+ // = abort "match_and_instantiate_overloaded_cons_overloaded_match"
+ match_and_instantiate_overloaded_cons_overloaded_match _ app_args [] case_default ro ti
+ = transform case_default { ro & ro_root_case_mode = NotRootCase } ti
+
+ /*
+ match_and_instantiate_overloaded_cons linearities app_args (OverloadedListPatterns _ (App {app_args=[],app_symb={symb_kind=SK_Function {glob_module=decons_module,glob_object=deconsindex}}}) algebraicPatterns) case_default ro ti
+ = match_and_instantiate_overloaded_cons_overloaded_match linearities app_args algebraicPatterns case_default ro ti
+ where
+ match_and_instantiate_overloaded_cons_overloaded_match [linearity:linearities] app_args
+ [{ap_symbol={glob_module,glob_object={ds_index}}, ap_vars, ap_expr} : guards]
+ case_default ro ti
+ | glob_module==cPredefinedModuleIndex
+ # index=ds_index+FirstConstructorPredefinedSymbolIndex
+ | index==PD_UnboxedConsSymbol || index==PD_UnboxedTailStrictConsSymbol || index==PD_OverloadedConsSymbol
+ # (argument_types,strictness) = case ro.ro_imported_funs.[decons_module].[deconsindex].ft_type.st_result.at_type of
+ TA _ args=:[arg1,arg2] -> (args,NotStrict)
+ TAS _ args=:[arg1,arg2] strictness -> (args,strictness)
+ = instantiate linearity app_args ap_vars ap_expr strictness argument_types ti
+ | index==PD_UnboxedNilSymbol || index==PD_UnboxedTailStrictNilSymbol || index==PD_OverloadedNilSymbol
+ = match_and_instantiate_overloaded_cons_overloaded_match linearities app_args guards case_default ro ti
+ = abort "match_and_instantiate_overloaded_cons_overloaded_match"
+ match_and_instantiate_overloaded_cons_overloaded_match [linearity:linearities] app_args [guard : guards] case_default ro ti
+ = match_and_instantiate_overloaded_cons_overloaded_match linearities app_args guards case_default ro ti
+ match_and_instantiate_overloaded_cons_overloaded_match _ app_args [] case_default ro ti
+ = transform case_default { ro & ro_root_case_mode = NotRootCase } ti
+ */
+
+ instantiate linearity app_args ap_vars ap_expr cons_type_args_strictness cons_type_args ti
# zipped = zip2 ap_vars app_args
- unfoldables = [ ((not (arg_is_strict i cons_type.st_args_strictness)) && linear) || in_normal_form app_arg \\ linear <- linearity & app_arg <- app_args & i <- [0..]]
+ unfoldables = [ ((not (arg_is_strict i cons_type_args_strictness)) && linear) || in_normal_form app_arg \\ linear <- linearity & app_arg <- app_args & i <- [0..]]
unfoldable_args = filterWith unfoldables zipped
not_unfoldable = map not unfoldables
non_unfoldable_args = filterWith not_unfoldable zipped
ti_var_heap = foldSt (\({fv_info_ptr}, arg) -> writeVarInfo fv_info_ptr (VI_Expression arg)) unfoldable_args ti.ti_var_heap
- (new_expr, ti_symbol_heap) = possibly_add_let non_unfoldable_args ap_expr not_unfoldable cons_type ro ti.ti_symbol_heap
+ (new_expr, ti_symbol_heap) = possibly_add_let non_unfoldable_args ap_expr not_unfoldable cons_type_args ro ti.ti_symbol_heap
unfold_state = { us_var_heap = ti_var_heap, us_symbol_heap = ti_symbol_heap, us_opt_type_heaps = No,us_cleanup_info=ti.ti_cleanup_info,
us_local_macro_functions = No }
ui= {ui_handle_aci_free_vars = LeaveThem }
@@ -588,6 +665,15 @@ where
{ ti & ti_var_heap = unfold_state.us_var_heap, ti_symbol_heap = unfold_state.us_symbol_heap,ti_cleanup_info=unfold_state.us_cleanup_info }
= (Yes final_expr, ti)
+ expr_or_never_matching_case (Yes match_expr) case_ident ti
+ = (match_expr, ti)
+ expr_or_never_matching_case No case_ident ti
+ = (neverMatchingCase never_ident, ti) <-!- ("transCase:App:neverMatchingCase",never_ident)
+ where
+ never_ident = case ro.ro_root_case_mode of
+ NotRootCase -> case_ident
+ _ -> Yes ro.ro_fun_case.symb_name
+
transCase is_active opt_aci this_case=:{case_expr = (BasicExpr basic_value),case_guards,case_default} ro ti
| not is_active
= skip_over this_case ro ti // XXX currently only active cases are matched at runtime (multimatch problem)
@@ -631,8 +717,8 @@ filterWith _ _
possibly_add_let [] ap_expr _ _ _ ti_symbol_heap
= (ap_expr, ti_symbol_heap)
-possibly_add_let non_unfoldable_args ap_expr not_unfoldable cons_type ro ti_symbol_heap
- # let_type = filterWith not_unfoldable cons_type.st_args
+possibly_add_let non_unfoldable_args ap_expr not_unfoldable cons_type_args ro ti_symbol_heap
+ # let_type = filterWith not_unfoldable cons_type_args
(new_info_ptr, ti_symbol_heap) = newPtr (EI_LetType let_type) ti_symbol_heap
/* DvA... STRICT_LET
= ( Let { let_strict_binds = [ {lb_src=lb_src, lb_dst=lb_dst, lb_position = NoPos}
@@ -4199,9 +4285,10 @@ instance producerRequirements CasePatterns where
// name shadowing...
# (safe,prs) = producerRequirements patterns prs
= (safe,prs)
- producerRequirements (OverloadedListPatterns _ _ _) prs
- //...disallow for now...
- = (False,prs)
+ producerRequirements (OverloadedListPatterns _ _ patterns) prs
+ // name shadowing...
+ # (safe,prs) = producerRequirements patterns prs
+ = (safe,prs)
producerRequirements (DynamicPatterns patterns) prs
//...disallow for now...
= (False,prs)