aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohnvg2001-08-31 11:05:48 +0000
committerjohnvg2001-08-31 11:05:48 +0000
commitede595cc4747e9d70bd768b286e80556c102c993 (patch)
tree7c85175e4ba217c73700648bda9c791edb26872d
parentadd type for function checkSpecialTypes (diff)
added code for OverloadedListPatterns
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@711 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/convertcases.icl127
-rw-r--r--frontend/mergecases.icl185
2 files changed, 198 insertions, 114 deletions
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl
index 3737a75..a292687 100644
--- a/frontend/convertcases.icl
+++ b/frontend/convertcases.icl
@@ -243,7 +243,9 @@ weightedRefCountOfCase rci=:{rci_depth} this_case=:{case_expr, case_guards, case
rs=:{ rcs_var_heap, rcs_expr_heap, rcs_imports }
# (local_vars, vars_and_heaps) = weighted_ref_count_in_case_patterns {rci & rci_depth=rci_depth+1} case_guards rcs_imports rcs_var_heap rcs_expr_heap
(default_vars, (all_vars, rcs_imports, var_heap, expr_heap)) = weighted_ref_count_in_default {rci & rci_depth=rci_depth+1} case_default vars_and_heaps
- rs = weightedRefCount rci case_expr { rs & rcs_var_heap = var_heap, rcs_expr_heap = expr_heap, rcs_imports = rcs_imports }
+ rs = { rs & rcs_var_heap = var_heap, rcs_expr_heap = expr_heap, rcs_imports = rcs_imports }
+ rs = weighted_ref_count_of_decons_expr rci case_guards rs
+ rs = weightedRefCount rci case_expr rs
(rcs_free_vars, rcs_var_heap) = foldSt (addPatternVariable rci_depth) all_vars (rs.rcs_free_vars, rs.rcs_var_heap)
rcs_expr_heap = rs.rcs_expr_heap <:= (case_info_ptr, EI_CaseTypeAndRefCounts case_type
{ rcc_all_variables = all_vars, rcc_default_variables = default_vars, rcc_pattern_variables = local_vars })
@@ -257,28 +259,34 @@ weightedRefCountOfCase rci=:{rci_depth} this_case=:{case_expr, case_guards, case
weighted_ref_count_in_case_patterns rci (AlgebraicPatterns type patterns) collected_imports var_heap expr_heap
= mapSt (weighted_ref_count_in_algebraic_pattern rci) patterns ([], collected_imports, var_heap, expr_heap)
- where
- weighted_ref_count_in_algebraic_pattern rci=:{rci_imported} {ap_expr,ap_symbol} wrcs_state
- # (free_vars_with_rc, (all_free_vars, collected_imports, var_heap, expr_heap))
- = weightedRefCountInPatternExpr rci ap_expr wrcs_state
- (collected_imports, var_heap)
- = check_symbol rci_imported ap_symbol collected_imports var_heap
- = (free_vars_with_rc, (all_free_vars, collected_imports, var_heap, expr_heap))
- where
- check_symbol {cii_main_dcl_module_n, cii_common_defs} {glob_module, glob_object={ds_index}} collected_imports var_heap
- | glob_module <> cii_main_dcl_module_n
- # {cons_type_ptr} = cii_common_defs.[glob_module].com_cons_defs.[ds_index]
- (collected_imports, var_heap) = checkImportedSymbol (SK_Constructor {glob_module = glob_module, glob_object = ds_index})
- cons_type_ptr (collected_imports, var_heap)
- = (collected_imports, var_heap)
- // otherwise
- = (collected_imports, var_heap)
-
weighted_ref_count_in_case_patterns rci (BasicPatterns type patterns) collected_imports var_heap expr_heap
= mapSt (\{bp_expr} -> weightedRefCountInPatternExpr rci bp_expr) patterns ([], collected_imports, var_heap, expr_heap)
+ weighted_ref_count_in_case_patterns rci (OverloadedListPatterns type _ patterns) collected_imports var_heap expr_heap
+ = mapSt (weighted_ref_count_in_algebraic_pattern rci) patterns ([], collected_imports, var_heap, expr_heap)
weighted_ref_count_in_case_patterns rci (DynamicPatterns patterns) collected_imports var_heap expr_heap
= mapSt (\{dp_rhs} -> weightedRefCountInPatternExpr rci dp_rhs) patterns ([], collected_imports, var_heap, expr_heap)
+ weighted_ref_count_in_algebraic_pattern rci=:{rci_imported} {ap_expr,ap_symbol} wrcs_state
+ # (free_vars_with_rc, (all_free_vars, collected_imports, var_heap, expr_heap))
+ = weightedRefCountInPatternExpr rci ap_expr wrcs_state
+ (collected_imports, var_heap)
+ = check_symbol rci_imported ap_symbol collected_imports var_heap
+ = (free_vars_with_rc, (all_free_vars, collected_imports, var_heap, expr_heap))
+ where
+ check_symbol {cii_main_dcl_module_n, cii_common_defs} {glob_module, glob_object={ds_index}} collected_imports var_heap
+ | glob_module <> cii_main_dcl_module_n
+ # {cons_type_ptr} = cii_common_defs.[glob_module].com_cons_defs.[ds_index]
+ (collected_imports, var_heap) = checkImportedSymbol (SK_Constructor {glob_module = glob_module, glob_object = ds_index})
+ cons_type_ptr (collected_imports, var_heap)
+ = (collected_imports, var_heap)
+ // otherwise
+ = (collected_imports, var_heap)
+
+ weighted_ref_count_of_decons_expr rci (OverloadedListPatterns _ decons_exp _) rs
+ = weightedRefCount rci decons_exp rs;
+ weighted_ref_count_of_decons_expr rci case_guards rs
+ = rs;
+
weightedRefCountOfCase rci=:{rci_depth} this_case=:{case_expr, case_guards, case_default, case_info_ptr} (EI_CaseTypeAndRefCounts case_type {rcc_all_variables})
rs=:{ rcs_var_heap, rcs_expr_heap, rcs_imports }
# rs = weightedRefCount rci case_expr rs
@@ -537,12 +545,6 @@ where
distribute_lets_in_patterns depth ref_counts (AlgebraicPatterns conses patterns) ds
# (patterns, ds) = mapSt (distribute_lets_in_alg_pattern depth) (exactZip ref_counts patterns) ds
= (AlgebraicPatterns conses patterns, ds)
- where
- distribute_lets_in_alg_pattern depth (ref_counts,pattern) ds=:{ds_var_heap}
- # (ap_vars, ds_var_heap) = mapSt refresh_variable pattern.ap_vars ds_var_heap
- ds = {ds & ds_var_heap = ds_var_heap}
- (ap_expr, ds) = distribute_lets_in_pattern_expr depth ref_counts pattern.ap_expr ds
- = ({ pattern & ap_vars = ap_vars, ap_expr = ap_expr }, ds)
distribute_lets_in_patterns depth ref_counts (BasicPatterns type patterns) ds
# (patterns, ds) = mapSt (distribute_lets_in_basic_pattern depth) (exactZip ref_counts patterns) ds
= (BasicPatterns type patterns, ds)
@@ -550,6 +552,15 @@ where
distribute_lets_in_basic_pattern depth (ref_counts,pattern) ds
# (bp_expr, ds) = distribute_lets_in_pattern_expr depth ref_counts pattern.bp_expr ds
= ({ pattern & bp_expr = bp_expr }, ds)
+ distribute_lets_in_patterns depth ref_counts (OverloadedListPatterns conses decons_expr patterns) heaps
+ # (patterns, heaps) = mapSt (distribute_lets_in_alg_pattern depth) (exactZip ref_counts patterns) heaps
+ = (OverloadedListPatterns conses decons_expr patterns, heaps)
+
+ distribute_lets_in_alg_pattern depth (ref_counts,pattern) ds=:{ds_var_heap}
+ # (ap_vars, ds_var_heap) = mapSt refresh_variable pattern.ap_vars ds_var_heap
+ ds = {ds & ds_var_heap = ds_var_heap}
+ (ap_expr, ds) = distribute_lets_in_pattern_expr depth ref_counts pattern.ap_expr ds
+ = ({ pattern & ap_vars = ap_vars, ap_expr = ap_expr }, ds)
distribute_lets_in_default depth ref_counts_in_default (Yes expr) ds
# (expr, ds) = distribute_lets_in_pattern_expr depth ref_counts_in_default expr ds
@@ -751,29 +762,7 @@ where
, cs_expr_heap :: !.ExpressionHeap
, cs_next_fun_nr :: !Index
}
-/*
-class caseFree a :: !a -> Bool
-
-instance caseFree [a] | caseFree a where
- caseFree l
- = and (map caseFree l)
-
-instance caseFree (Optional a) | caseFree a where
- caseFree No
- = True
- caseFree (Yes a)
- = caseFree a
-
-instance caseFree BasicPattern where
- caseFree {bp_expr}
- = caseFree bp_expr
-
-instance caseFree Expression where
- caseFree (Case _)
- = False
- caseFree _
- = True
-*/
+
markLocalLetVar :: LetBind *VarHeap -> *VarHeap
markLocalLetVar {lb_dst={fv_info_ptr}} varHeap
= varHeap <:= (fv_info_ptr, VI_LocalLetVar)
@@ -889,18 +878,16 @@ instance convertRootCases Expression where
VI_LocalLetVar
-> convertCases ci caseExpr cs // -*-> "convertRootCases, no guards"
_
- // | True <<- ("convertRootCases",varInfo)
+// | True <<- ("convertRootCases",varInfo)
# (case_expr, cs) = convertCases ci case_expr cs
# (case_guards, cs) = convertRootCasesCasePatterns ci case_guards case_type.ct_cons_types cs
# (case_default, cs)= convertRootCases ci case_default cs
-> (Case {kees & case_expr=case_expr, case_guards=case_guards, case_default=case_default}, cs)
-
// otherwise
-> convertNonRootCase ci kees cs
expr
// -> convertCases ci caseExpr cs // -*-> "convertRootCases, no guards"
-> convertNonRootCase ci kees cs
-
where
isTruePattern [{bp_value=BVB True}:_]
= True
@@ -912,7 +899,7 @@ instance convertRootCases Expression where
# (guard, cs) = convert_guard guard ci cs
// # (EI_CaseTypeAndRefCounts case_type _, cs_expr_heap) = readPtr case_info_ptr cs.cs_expr_heap
// # {cs &cs_expr_heap=cs_expr_heap}
- # (then_part, cs) = convertRootCases {ci & ci_case_level = CaseLevelAfterGuardRoot} bp_expr cs
+ # (then_part, cs) = convertRootCases {ci & ci_case_level=CaseLevelAfterGuardRoot} bp_expr cs
# (opt_else_part, cs) = convert_to_else_part ci sign_of_then_part alts case_default cs
= (build_conditional sign_of_then_part guard then_part opt_else_part, cs)
where
@@ -952,18 +939,22 @@ convertRootCasesCasePatterns ci (AlgebraicPatterns gi patterns) arg_types cs
# (patterns, cs)
= convertRootCasesAlgebraicPatterns ci (exactZip patterns arg_types) cs
= (AlgebraicPatterns gi patterns, cs)
- where
- convertRootCasesAlgebraicPatterns :: ConvertInfo [(AlgebraicPattern, [AType])] *ConvertState -> ([AlgebraicPattern], *ConvertState)
- convertRootCasesAlgebraicPatterns ci l cs
- = mapSt (convertRootCasesAlgebraicPattern ci) l cs
-
- convertRootCasesAlgebraicPattern :: ConvertInfo (AlgebraicPattern, [AType]) *ConvertState -> (AlgebraicPattern, *ConvertState)
- convertRootCasesAlgebraicPattern ci (pattern=:{ap_expr, ap_vars}, arg_types) cs
- # ci
- = {ci & ci_bound_vars= exactZip ap_vars arg_types ++ ci.ci_bound_vars}
- # (ap_expr, cs)
- = convertRootCases ci ap_expr cs
- = ({pattern & ap_expr=ap_expr}, cs)
+convertRootCasesCasePatterns ci (OverloadedListPatterns type decons_expr patterns) arg_types cs
+ # (patterns, cs)
+ = convertRootCasesAlgebraicPatterns ci (exactZip patterns arg_types) cs
+ = (OverloadedListPatterns type decons_expr patterns, cs)
+
+convertRootCasesAlgebraicPatterns :: ConvertInfo [(AlgebraicPattern, [AType])] *ConvertState -> ([AlgebraicPattern], *ConvertState)
+convertRootCasesAlgebraicPatterns ci l cs
+ = mapSt (convertRootCasesAlgebraicPattern ci) l cs
+where
+ convertRootCasesAlgebraicPattern :: ConvertInfo (AlgebraicPattern, [AType]) *ConvertState -> (AlgebraicPattern, *ConvertState)
+ convertRootCasesAlgebraicPattern ci (pattern=:{ap_expr, ap_vars}, arg_types) cs
+ # ci
+ = {ci & ci_bound_vars= exactZip ap_vars arg_types ++ ci.ci_bound_vars}
+ # (ap_expr, cs)
+ = convertRootCases ci ap_expr cs
+ = ({pattern & ap_expr=ap_expr}, cs)
instance convertRootCases (Optional a) | convertRootCases a where
convertRootCases ci (Yes expr) cs
@@ -1172,6 +1163,8 @@ splitGuards (AlgebraicPatterns index patterns)
= [AlgebraicPatterns index [pattern] \\ pattern <- patterns]
splitGuards (BasicPatterns basicType patterns)
= [BasicPatterns basicType [pattern] \\ pattern <- patterns]
+splitGuards (OverloadedListPatterns type decons_expr patterns)
+ = [OverloadedListPatterns type decons_expr [pattern] \\ pattern <- patterns]
makeCase :: Expression CasePatterns -> Expression
makeCase expr guard
@@ -1330,6 +1323,10 @@ where
copy (BasicPatterns type patterns) cp_info
# (patterns, cp_info) = copy patterns cp_info
= (BasicPatterns type patterns, cp_info)
+ copy (OverloadedListPatterns type decons_expr patterns) cp_info
+ # (patterns, cp_info) = copy patterns cp_info
+ # (decons_expr, cp_info) = copy decons_expr cp_info
+ = (OverloadedListPatterns type decons_expr patterns, cp_info)
instance copy AlgebraicPattern
where
@@ -1338,7 +1335,6 @@ where
# (ap_expr, cp_info) = copy ap_expr { cp_info & cp_local_vars = cp_local_vars, cp_var_heap = cp_var_heap}
= ({ pattern & ap_expr = ap_expr }, cp_info)
where
-
bind_pattern_var pattern_var=:{fv_info_ptr} (local_vars, var_heap)
= ([pattern_var : local_vars], var_heap <:= (fv_info_ptr, VI_LocalVar))
@@ -1668,6 +1664,3 @@ mergeCases (case_expr=:(Case first_case=:{case_default, case_default_pos}), case
var_heap, symbol_heap, error)
mergeCases expr_and_pos _ var_heap symbol_heap error
= (expr_and_pos, var_heap, symbol_heap, /* checkWarning "" " alternative will never match" */ error)
-
-
-
diff --git a/frontend/mergecases.icl b/frontend/mergecases.icl
index e147145..b74b2f1 100644
--- a/frontend/mergecases.icl
+++ b/frontend/mergecases.icl
@@ -78,6 +78,17 @@ where
No
-> (No, var_heap, symbol_heap)
+ OverloadedListPatterns type decons_expr [overloaded_list_pattern]
+ # (split_result, var_heap, symbol_heap) = split_case split_var_info_ptr overloaded_list_pattern.ap_expr var_heap symbol_heap
+ -> case split_result of
+ Yes split_case
+ # (cees,symbol_heap) = push_expression_into_guards_and_default
+ ( \ guard_expr -> { this_case & case_guards = OverloadedListPatterns type decons_expr [{ overloaded_list_pattern & ap_expr = guard_expr }] } )
+ split_case symbol_heap
+ -> (Yes cees, var_heap, symbol_heap)
+
+ No
+ -> (No, var_heap, symbol_heap)
DynamicPatterns [dynamic_pattern]
# (split_result, var_heap, symbol_heap) = split_case split_var_info_ptr dynamic_pattern.dp_rhs var_heap symbol_heap
-> case split_result of
@@ -121,14 +132,7 @@ where
= var_heap <:= (fv_info_ptr, VI_Alias var)
set_alias _ var_heap
= var_heap
-/*
- push_expression_into_guards expr_fun (AlgebraicPatterns type patterns)
- = AlgebraicPatterns type (map (\algpattern -> { algpattern & ap_expr = expr_fun algpattern.ap_expr }) patterns)
- push_expression_into_guards expr_fun (BasicPatterns type patterns)
- = BasicPatterns type (map (\baspattern -> { baspattern & bp_expr = expr_fun baspattern.bp_expr }) patterns)
- push_expression_into_guards expr_fun (DynamicPatterns patterns)
- = DynamicPatterns (map (\dynpattern -> { dynpattern & dp_rhs = expr_fun dynpattern.dp_rhs }) patterns)
-*/
+
push_expression_into_guards_and_default expr_fun split_case symbol_heap
= push_expression_into_guards_and_default split_case symbol_heap
where
@@ -144,6 +148,9 @@ where
push_expression_into_guards split_case=:{case_guards=BasicPatterns type patterns} symbol_heap
# (new_patterns,symbol_heap) = push_expression_into_patterns patterns symbol_heap
= ({split_case & case_guards=BasicPatterns type new_patterns},symbol_heap)
+ push_expression_into_guards split_case=:{case_guards=OverloadedListPatterns type decons_expr patterns} symbol_heap
+ # (new_patterns,symbol_heap) = push_expression_into_patterns patterns symbol_heap
+ = ({split_case & case_guards=OverloadedListPatterns type decons_expr new_patterns},symbol_heap)
push_expression_into_guards split_case=:{case_guards=DynamicPatterns patterns} symbol_heap
# (new_patterns,symbol_heap) = push_expression_into_patterns patterns symbol_heap
= ({split_case & case_guards=DynamicPatterns new_patterns},symbol_heap)
@@ -192,13 +199,6 @@ where
push_let_expression_into_guards lad (AlgebraicPatterns type patterns) var_heap expr_heap
# (patterns, var_heap, expr_heap) = push_let_expression_into_algebraic_pattern lad patterns var_heap expr_heap
= (AlgebraicPatterns type patterns, var_heap, expr_heap)
- where
- push_let_expression_into_algebraic_pattern lad [pattern=:{ap_expr}] var_heap expr_heap
- = ([{ pattern & ap_expr = Let { lad & let_expr = ap_expr}}], var_heap, expr_heap)
- push_let_expression_into_algebraic_pattern lad [pattern=:{ap_expr}:patterns] var_heap expr_heap
- # (ap_expr, var_heap, expr_heap) = rebuild_let_expression lad ap_expr var_heap expr_heap
- (patterns, var_heap, expr_heap) = push_let_expression_into_algebraic_pattern lad patterns var_heap expr_heap
- = ([{pattern & ap_expr = ap_expr} : patterns], var_heap, expr_heap)
push_let_expression_into_guards lad (BasicPatterns type patterns) var_heap expr_heap
# (patterns, var_heap, expr_heap) = push_let_expression_into_basic_pattern lad patterns var_heap expr_heap
= (BasicPatterns type patterns, var_heap, expr_heap)
@@ -209,6 +209,9 @@ where
# (bp_expr, var_heap, expr_heap) = rebuild_let_expression lad bp_expr var_heap expr_heap
(patterns, var_heap, expr_heap) = push_let_expression_into_basic_pattern lad patterns var_heap expr_heap
= ([{pattern & bp_expr = bp_expr} : patterns], var_heap, expr_heap)
+ push_let_expression_into_guards lad (OverloadedListPatterns type decons_expr patterns) var_heap expr_heap
+ # (patterns, var_heap, expr_heap) = push_let_expression_into_algebraic_pattern lad patterns var_heap expr_heap
+ = (OverloadedListPatterns type decons_expr patterns, var_heap, expr_heap)
push_let_expression_into_guards lad (DynamicPatterns patterns) var_heap expr_heap
# (patterns, var_heap, expr_heap) = push_let_expression_into_dynamic_pattern lad patterns var_heap expr_heap
= (DynamicPatterns patterns, var_heap, expr_heap)
@@ -220,27 +223,104 @@ where
(patterns, var_heap, expr_heap) = push_let_expression_into_dynamic_pattern lad patterns var_heap expr_heap
= ([{pattern & dp_rhs = dp_rhs} : patterns], var_heap, expr_heap)
+ push_let_expression_into_algebraic_pattern lad [pattern=:{ap_expr}] var_heap expr_heap
+ = ([{ pattern & ap_expr = Let { lad & let_expr = ap_expr}}], var_heap, expr_heap)
+ push_let_expression_into_algebraic_pattern lad [pattern=:{ap_expr}:patterns] var_heap expr_heap
+ # (ap_expr, var_heap, expr_heap) = rebuild_let_expression lad ap_expr var_heap expr_heap
+ (patterns, var_heap, expr_heap) = push_let_expression_into_algebraic_pattern lad patterns var_heap expr_heap
+ = ([{pattern & ap_expr = ap_expr} : patterns], var_heap, expr_heap)
+
merge_guards guards=:(AlgebraicPatterns type1 patterns1) (AlgebraicPatterns type2 patterns2) var_heap symbol_heap error
| type1 == type2
- # (merged_patterns, var_heap, symbol_heap, error) = merge_algebraic_patterns patterns1 patterns2 var_heap symbol_heap error
- = (AlgebraicPatterns type1 merged_patterns, var_heap, symbol_heap, error)
- = (guards, var_heap, symbol_heap, checkError "" "incompatible patterns in case" error)
+ = merge_algebraic_patterns type1 patterns1 patterns2 var_heap symbol_heap error
+ = (guards, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
merge_guards guards=:(BasicPatterns basic_type1 patterns1) (BasicPatterns basic_type2 patterns2) var_heap symbol_heap error
| basic_type1 == basic_type2
# (merged_patterns, var_heap, symbol_heap, error) = merge_basic_patterns patterns1 patterns2 var_heap symbol_heap error
= (BasicPatterns basic_type1 merged_patterns, var_heap, symbol_heap, error)
- = (guards, var_heap, symbol_heap, checkError "" "incompatible patterns in case" error)
+ = (guards, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
+ merge_guards guards=:(OverloadedListPatterns type1 decons_expr1 patterns1) (OverloadedListPatterns type2 decons_expr2 patterns2) var_heap symbol_heap error
+ | type1 == type2
+ = merge_overloaded_list_patterns type1 decons_expr1 patterns1 patterns2 var_heap symbol_heap error
+ = case (type1,type2) of
+ (OverloadedList _ _ _ _,UnboxedList type_symbol stdStrictLists_index decons_index nil_index)
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_UnboxedConsSymbol PD_UnboxedNilSymbol
+ -> merge_overloaded_list_patterns type2 decons_expr2 patterns1 patterns2 var_heap symbol_heap error
+ (OverloadedList _ _ _ _,UnboxedTailStrictList type_symbol stdStrictLists_index decons_index nil_index)
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_UnboxedTailStrictConsSymbol PD_UnboxedTailStrictNilSymbol
+ -> merge_overloaded_list_patterns type2 decons_expr2 patterns1 patterns2 var_heap symbol_heap error
+ (UnboxedList type_symbol stdStrictLists_index decons_index nil_index,OverloadedList _ _ _ _)
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_UnboxedConsSymbol PD_UnboxedNilSymbol
+ -> merge_overloaded_list_patterns type1 decons_expr1 patterns1 patterns2 var_heap symbol_heap error
+ (UnboxedTailStrictList type_symbol stdStrictLists_index decons_index nil_index,OverloadedList _ _ _ _)
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_UnboxedTailStrictConsSymbol PD_UnboxedTailStrictNilSymbol
+ -> merge_overloaded_list_patterns type1 decons_expr1 patterns1 patterns2 var_heap symbol_heap error
+ _
+ -> (guards, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
merge_guards guards=:(DynamicPatterns patterns1) (DynamicPatterns patterns2) var_heap symbol_heap error
# (merged_patterns, var_heap, symbol_heap, error) = merge_dynamic_patterns patterns1 patterns2 var_heap symbol_heap error
= (DynamicPatterns merged_patterns, var_heap, symbol_heap, error)
+ merge_guards guards=:(AlgebraicPatterns type1 patterns1) (OverloadedListPatterns type2 decons_expr2 patterns2) var_heap symbol_heap error
+ | type1.glob_module==cPredefinedModuleIndex
+ # index=type1.glob_object+FirstTypePredefinedSymbolIndex
+ | index==PD_ListType
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_ConsSymbol PD_NilSymbol
+ = merge_algebraic_patterns type1 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_StrictListType
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_StrictConsSymbol PD_StrictNilSymbol
+ = merge_algebraic_patterns type1 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_TailStrictListType
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_TailStrictConsSymbol PD_TailStrictNilSymbol
+ = merge_algebraic_patterns type1 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_StrictTailStrictListType
+ # patterns2=replace_overloaded_symbols_in_patterns patterns2 PD_StrictTailStrictConsSymbol PD_StrictTailStrictNilSymbol
+ = merge_algebraic_patterns type1 patterns1 patterns2 var_heap symbol_heap error
+ = (guards, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
+ merge_guards guards=:(OverloadedListPatterns type1 decons_expr1 patterns1) (AlgebraicPatterns type2 patterns2) var_heap symbol_heap error
+ | type2.glob_module==cPredefinedModuleIndex
+ # index=type2.glob_object+FirstTypePredefinedSymbolIndex
+ | index==PD_ListType
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_ConsSymbol PD_NilSymbol
+ = merge_algebraic_patterns type2 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_StrictListType
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_StrictConsSymbol PD_StrictNilSymbol
+ = merge_algebraic_patterns type2 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_TailStrictListType
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_TailStrictConsSymbol PD_TailStrictNilSymbol
+ = merge_algebraic_patterns type2 patterns1 patterns2 var_heap symbol_heap error
+ | index==PD_StrictTailStrictListType
+ # patterns1=replace_overloaded_symbols_in_patterns patterns1 PD_StrictTailStrictConsSymbol PD_StrictTailStrictNilSymbol
+ = merge_algebraic_patterns type2 patterns1 patterns2 var_heap symbol_heap error
+ = (guards, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
merge_guards patterns1 patterns2 var_heap symbol_heap error
- = (patterns1, var_heap, symbol_heap, checkError "" "incompatible patterns in case" error)
+ = (patterns1, var_heap, symbol_heap, incompatible_patterns_in_case_error error)
- merge_algebraic_patterns patterns [alg_pattern : alg_patterns] var_heap symbol_heap error
- # (patterns, var_heap, symbol_heap, error) = merge_algebraic_pattern_with_patterns alg_pattern patterns var_heap symbol_heap error
- = merge_algebraic_patterns patterns alg_patterns var_heap symbol_heap error
- merge_algebraic_patterns patterns [] var_heap symbol_heap error
+ merge_algebraic_patterns type patterns1 patterns2 var_heap symbol_heap error
+ # (merged_patterns, var_heap, symbol_heap, error) = merge_algebraic_or_overloaded_list_patterns patterns1 patterns2 var_heap symbol_heap error
+ = (AlgebraicPatterns type merged_patterns, var_heap, symbol_heap, error)
+
+ merge_overloaded_list_patterns type decons_expr patterns1 patterns2 var_heap symbol_heap error
+ # (merged_patterns, var_heap, symbol_heap, error) = merge_algebraic_or_overloaded_list_patterns patterns1 patterns2 var_heap symbol_heap error
+ = (OverloadedListPatterns type decons_expr merged_patterns, var_heap, symbol_heap, error)
+
+ merge_algebraic_or_overloaded_list_patterns patterns [] var_heap symbol_heap error
= (patterns, var_heap, symbol_heap, error)
+ merge_algebraic_or_overloaded_list_patterns patterns [alg_pattern : alg_patterns] var_heap symbol_heap error
+ # (patterns, var_heap, symbol_heap, error) = merge_algebraic_pattern_with_patterns alg_pattern patterns var_heap symbol_heap error
+ = merge_algebraic_or_overloaded_list_patterns patterns alg_patterns var_heap symbol_heap error
+ where
+ merge_algebraic_pattern_with_patterns new_pattern [pattern=:{ap_symbol,ap_vars,ap_expr} : patterns] var_heap symbol_heap error
+ | new_pattern.ap_symbol == ap_symbol
+ | isEmpty new_pattern.ap_vars
+ # ((ap_expr, _), var_heap, symbol_heap, error) = mergeCases (ap_expr, NoPos) [(new_pattern.ap_expr, NoPos)] var_heap symbol_heap error
+ = ([{ pattern & ap_expr = ap_expr} : patterns], var_heap, symbol_heap, error)
+ # (new_expr, var_heap, symbol_heap) = replace_variables new_pattern.ap_vars new_pattern.ap_expr ap_vars var_heap symbol_heap
+ ((ap_expr, _), var_heap, symbol_heap, error) = mergeCases (ap_expr, NoPos) [(new_expr, NoPos)] var_heap symbol_heap error
+ = ([{ pattern & ap_expr = ap_expr} : patterns], var_heap, symbol_heap, error)
+ # (patterns, var_heap, symbol_heap, error) = merge_algebraic_pattern_with_patterns new_pattern patterns var_heap symbol_heap error
+ = ([ pattern : patterns ], var_heap, symbol_heap, error)
+ merge_algebraic_pattern_with_patterns new_pattern [] var_heap symbol_heap error
+ = ([new_pattern], var_heap, symbol_heap, error)
merge_basic_patterns patterns [alg_pattern : alg_patterns] var_heap symbol_heap error
# (patterns, var_heap, symbol_heap, error) = merge_basic_pattern_with_patterns alg_pattern patterns var_heap symbol_heap error
@@ -248,35 +328,21 @@ where
merge_basic_patterns patterns [] var_heap symbol_heap error
= (patterns, var_heap, symbol_heap, error)
- merge_dynamic_patterns patterns1 patterns2 var_heap symbol_heap error
- = (patterns1 ++ patterns2, var_heap, symbol_heap, error)
-
- merge_algebraic_pattern_with_patterns new_pattern [pattern=:{ap_symbol,ap_vars,ap_expr} : patterns] var_heap symbol_heap error
- | new_pattern.ap_symbol == ap_symbol
- | isEmpty new_pattern.ap_vars
- # ((ap_expr, _), var_heap, symbol_heap, error) = mergeCases (ap_expr, NoPos) [(new_pattern.ap_expr, NoPos)] var_heap symbol_heap error
- = ([{ pattern & ap_expr = ap_expr} : patterns], var_heap, symbol_heap, error)
- # (new_expr, var_heap, symbol_heap) = replace_variables new_pattern.ap_vars new_pattern.ap_expr ap_vars var_heap symbol_heap
- ((ap_expr, _), var_heap, symbol_heap, error) = mergeCases (ap_expr, NoPos) [(new_expr, NoPos)] var_heap symbol_heap error
- = ([{ pattern & ap_expr = ap_expr} : patterns], var_heap, symbol_heap, error)
- # (patterns, var_heap, symbol_heap, error) = merge_algebraic_pattern_with_patterns new_pattern patterns var_heap symbol_heap error
- = ([ pattern : patterns ], var_heap, symbol_heap, error)
+ replace_variables vars expr ap_vars var_heap symbol_heap
+ # var_heap = build_aliases vars ap_vars var_heap
+ # us = { us_var_heap = var_heap, us_symbol_heap = symbol_heap, us_opt_type_heaps = No,us_cleanup_info=[], us_local_macro_functions = No }
+ ui = {ui_handle_aci_free_vars = RemoveThem, ui_convert_module_n= -1, ui_conversion_table=No }
+ (expr, us) = unfold expr ui us
+ = (expr, us.us_var_heap, us.us_symbol_heap)
where
- replace_variables vars expr ap_vars var_heap symbol_heap
- # var_heap = build_aliases vars ap_vars var_heap
- # us = { us_var_heap = var_heap, us_symbol_heap = symbol_heap, us_opt_type_heaps = No,us_cleanup_info=[], us_local_macro_functions = No }
- ui = {ui_handle_aci_free_vars = RemoveThem, ui_convert_module_n= -1, ui_conversion_table=No }
- (expr, us) = unfold expr ui us
- = (expr, us.us_var_heap, us.us_symbol_heap)
-
build_aliases [var1 : vars1] [ {fv_name,fv_info_ptr} : vars2 ] var_heap
= build_aliases vars1 vars2 (writePtr var1.fv_info_ptr (VI_Variable fv_name fv_info_ptr) var_heap)
build_aliases [] [] var_heap
= var_heap
- merge_algebraic_pattern_with_patterns new_pattern [] var_heap symbol_heap error
- = ([new_pattern], var_heap, symbol_heap, error)
-
+ merge_dynamic_patterns patterns1 patterns2 var_heap symbol_heap error
+ = (patterns1 ++ patterns2, var_heap, symbol_heap, error)
+
merge_basic_pattern_with_patterns new_pattern [pattern=:{bp_value,bp_expr} : patterns] var_heap symbol_heap error
| new_pattern.bp_value == bp_value
# ((bp_expr, _), var_heap, symbol_heap, error) = mergeCases (bp_expr, NoPos) [(new_pattern.bp_expr, NoPos)] var_heap symbol_heap error
@@ -286,6 +352,31 @@ where
merge_basic_pattern_with_patterns new_pattern [] var_heap symbol_heap error
= ([new_pattern], var_heap, symbol_heap, error)
+ replace_overloaded_symbols_in_patterns [] pd_cons_symbol pd_nil_symbol
+ = []
+ replace_overloaded_symbols_in_patterns [pattern=:{ap_symbol={glob_module,glob_object}}:patterns] pd_cons_symbol pd_nil_symbol
+ # pattern = replace_overloaded_symbol_in_pattern pattern pd_cons_symbol pd_nil_symbol
+ # patterns = replace_overloaded_symbols_in_patterns patterns pd_cons_symbol pd_nil_symbol
+ = [pattern:patterns]
+ where
+ replace_overloaded_symbol_in_pattern pattern=:{ap_symbol={glob_module,glob_object}} pd_cons_symbol pd_nil_symbol
+ | glob_module==cPredefinedModuleIndex
+ # index=glob_object.ds_index+FirstConstructorPredefinedSymbolIndex
+ | index==PD_OverloadedConsSymbol
+ # new_cons_index=pd_cons_symbol-FirstConstructorPredefinedSymbolIndex
+ # new_cons_ident=cons_and_nil_idents.[new_cons_index]
+ # glob_object = {glob_object & ds_index=new_cons_index,ds_ident=new_cons_ident}
+ = {pattern & ap_symbol.glob_object=glob_object}
+ | index==PD_OverloadedNilSymbol
+ # new_nil_index=pd_nil_symbol-FirstConstructorPredefinedSymbolIndex
+ # new_nil_ident=cons_and_nil_idents.[new_nil_index]
+ # glob_object = {glob_object & ds_index=new_nil_index,ds_ident=new_nil_ident}
+ = {pattern & ap_symbol.glob_object=glob_object}
+ = abort "replace_overloaded_symbol_in_pattern"
+
+ incompatible_patterns_in_case_error error
+ = checkError "" "incompatible patterns in case" error
+
mergeCases (case_expr=:(Case first_case=:{case_default, case_default_pos}), case_pos) [expr : exprs] var_heap symbol_heap error
= case case_default of
Yes default_expr