aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsjakie2000-01-19 12:22:48 +0000
committersjakie2000-01-19 12:22:48 +0000
commit101f5e9d1d828d830bb66cf9f7a21318f43272e3 (patch)
tree37f70eb508e7b89d3090c7e18900134a0b2d0a67
parentbugfix: TryScanComment did not work when a single slash was followed by a new... (diff)
bug fix (changed syntax tree)
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@79 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/check.icl14
-rw-r--r--frontend/convertDynamics.icl29
-rw-r--r--frontend/convertcases.icl78
-rw-r--r--frontend/explicitimports.icl4
-rw-r--r--frontend/overloading.icl8
-rw-r--r--frontend/refmark.icl17
-rw-r--r--frontend/syntax.dcl10
-rw-r--r--frontend/syntax.icl11
-rw-r--r--frontend/trans.icl31
-rw-r--r--frontend/transform.icl51
-rw-r--r--frontend/type.icl7
11 files changed, 144 insertions, 116 deletions
diff --git a/frontend/check.icl b/frontend/check.icl
index 1e49d63..3c55525 100644
--- a/frontend/check.icl
+++ b/frontend/check.icl
@@ -1402,7 +1402,7 @@ where
# (let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
(var_binds, expr_heap) = build_binds vars [] expr_heap
let_binds = [{ bind_src = expr, bind_dst = hd vars }:var_binds]
- = (Let {let_strict = cIsNotStrict, let_binds = let_binds, let_expr = result_expr, let_info_ptr = let_expr_ptr }, expr_heap)
+ = (Let {let_strict_binds = [], let_lazy_binds = let_binds, let_expr = result_expr, let_info_ptr = let_expr_ptr }, expr_heap)
where
build_binds [var] accu expr_heap
= (accu, expr_heap)
@@ -1673,7 +1673,9 @@ buildLetExpression [] is_strict expr expr_heap
= (expr, expr_heap)
buildLetExpression binds is_strict expr expr_heap
# (let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
- = (Let {let_strict = is_strict, let_binds = binds, let_expr = expr, let_info_ptr = let_expr_ptr }, expr_heap)
+ | is_strict
+ = (Let {let_strict_binds = binds, let_lazy_binds = [], let_expr = expr, let_info_ptr = let_expr_ptr }, expr_heap)
+ = (Let {let_strict_binds = [], let_lazy_binds = binds, let_expr = expr, let_info_ptr = let_expr_ptr }, expr_heap)
checkLhssOfLocalDefs def_level mod_index (CollectedLocalDefs {loc_functions={ir_from,ir_to},loc_nodes}) e_state=:{es_var_heap,es_fun_defs} e_info cs
# (loc_defs, var_env, {ps_fun_defs,ps_var_heap}, e_info, cs)
@@ -2063,14 +2065,14 @@ where
| bind_dst == fv_info_ptr
# (var_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
(let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
- -> (Let { let_strict = cIsStrict, let_binds = [
+ -> (Let { let_lazy_binds = [], let_strict_binds = [
{ bind_src = Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr },
bind_dst = { fv_name = name, fv_info_ptr = var_info, fv_def_level = NotALevel, fv_count = 0 }}],
let_expr = result_expr, let_info_ptr = let_expr_ptr}, var_store, expr_heap, opt_dynamics, cs)
# (var_expr_ptr1, expr_heap) = newPtr EI_Empty expr_heap
(var_expr_ptr2, expr_heap) = newPtr EI_Empty expr_heap
(let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
- -> (Let { let_strict = cIsStrict, let_binds = [
+ -> (Let { let_lazy_binds = [], let_strict_binds = [
{ bind_src = Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr1 },
bind_dst = { fv_name = name, fv_info_ptr = var_info, fv_def_level = NotALevel, fv_count = 0 }},
{ bind_src = Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr2 },
@@ -2081,7 +2083,7 @@ where
-> (result_expr, var_store, expr_heap, opt_dynamics, cs)
# (var_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
(let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
- -> (Let { let_strict = cIsStrict, let_binds =
+ -> (Let { let_lazy_binds = [], let_strict_binds =
[{ bind_src = Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr },
bind_dst = { fv_name = name, fv_info_ptr = var_info, fv_def_level = NotALevel, fv_count = 0 }}],
let_expr = result_expr, let_info_ptr = let_expr_ptr}, var_store, expr_heap, opt_dynamics, cs)
@@ -2122,7 +2124,7 @@ where
(var_expr_ptr2, expr_heap) = newPtr EI_Empty expr_heap
(let_expr_ptr, expr_heap) = newPtr EI_Empty expr_heap
= (Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr1 },
- Let { let_strict = cIsNotStrict, let_binds =
+ Let { let_strict_binds = [], let_lazy_binds =
[{ bind_src = Var { var_name = fv_name, var_info_ptr = fv_info_ptr, var_expr_ptr = var_expr_ptr2 },
bind_dst = { fv_name = bind_src, fv_info_ptr = bind_dst, fv_def_level = NotALevel, fv_count = 0 }}],
let_expr = result_expr, let_info_ptr = let_expr_ptr}, expr_heap)
diff --git a/frontend/convertDynamics.icl b/frontend/convertDynamics.icl
index 11c2a05..fa89919 100644
--- a/frontend/convertDynamics.icl
+++ b/frontend/convertDynamics.icl
@@ -118,12 +118,13 @@ where
# (expr, ci) = convertDynamics cinp bound_vars default_expr expr ci
(exprs, ci) = convertDynamics cinp bound_vars default_expr exprs ci
= (expr @ exprs, ci)
- convertDynamics cinp bound_vars default_expr (Let letje=:{let_binds, let_expr,let_info_ptr}) ci
+ convertDynamics cinp bound_vars default_expr (Let letje=:{let_strict_binds, let_lazy_binds, let_expr,let_info_ptr}) ci
# (let_types, ci) = determine_let_types let_info_ptr ci
- bound_vars = bindVarsToTypes [ bind.bind_dst \\ bind <- let_binds ] let_types bound_vars
- (let_binds, ci) = convertDynamics cinp bound_vars default_expr let_binds ci
- (let_expr, ci) = convertDynamics cinp bound_vars default_expr let_expr ci
- = (Let { letje & let_binds = let_binds, let_expr = let_expr}, ci)
+ bound_vars = bindVarsToTypes [ bind.bind_dst \\ bind <- let_strict_binds ++ let_lazy_binds ] let_types bound_vars
+ (let_strict_binds, ci) = convertDynamics cinp bound_vars default_expr let_strict_binds ci
+ (let_lazy_binds, ci) = convertDynamics cinp bound_vars default_expr let_lazy_binds ci
+ (let_expr, ci) = convertDynamics cinp bound_vars default_expr let_expr ci
+ = (Let { letje & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr}, ci)
where
determine_let_types let_info_ptr ci=:{ci_expr_heap}
# (EI_LetType let_types, ci_expr_heap) = readPtr let_info_ptr ci_expr_heap
@@ -183,12 +184,12 @@ where
app_args = [dyn_expr, dyn_type_code],
app_info_ptr = nilPtr }, ci)
_ # (let_info_ptr, ci) = let_ptr ci
- -> ( Let { let_strict = False,
- let_binds = let_binds,
- let_expr = App { app_symb = twoTuple_symb,
- app_args = [dyn_expr, dyn_type_code],
- app_info_ptr = nilPtr },
- let_info_ptr = let_info_ptr}, ci)
+ -> ( Let { let_strict_binds = [],
+ let_lazy_binds = let_binds,
+ let_expr = App { app_symb = twoTuple_symb,
+ app_args = [dyn_expr, dyn_type_code],
+ app_info_ptr = nilPtr },
+ let_info_ptr = let_info_ptr}, ci)
convertDynamics cinp bound_vars default_expr (TypeCodeExpression type_code) ci
= convertTypecode cinp type_code ci
convertDynamics cinp bound_vars default_expr EE ci
@@ -283,7 +284,7 @@ convertDynamicPatterns cinp bound_vars {case_expr, case_guards = DynamicPatterns
(addToBoundVars c_1 result_type (add_dynamic_bound_vars patterns bound_vars)))
(binds, expr, ci) = convert_dynamic_pattern cinp bound_vars new_default 1 opened_dynamic result_type case_default patterns ci
(let_info_ptr, ci) = let_ptr ci
- = (Let {let_strict = False, let_binds = [ dt_bind : binds ], let_expr = expr, let_info_ptr = let_info_ptr}, ci)
+ = (Let {let_strict_binds = [], let_lazy_binds = [ dt_bind : binds ], let_expr = expr, let_info_ptr = let_info_ptr}, ci)
where
convert_dynamic_pattern :: !ConversionInput !BoundVariables DefaultExpression Int OpenedDynamic AType (Optional Expression) ![DynamicPattern] *ConversionInfo
-> (Env Expression FreeVar, Expression, *ConversionInfo)
@@ -320,8 +321,8 @@ where
(let_binds, ci) = bind_indirection_var ind_var unify_result_var twotuple ci
a_ij_binds = add_x_i_bind opened_dynamic.opened_dynamic_expr dp_var a_ij_binds
- let_expr = Let { let_strict = False,
- let_binds = [{ bind_src = App { app_symb = unify_symb, app_args = [opened_dynamic.opened_dynamic_type, type_code], app_info_ptr = nilPtr },
+ let_expr = Let { let_strict_binds = [],
+ let_lazy_binds = [{ bind_src = App { app_symb = unify_symb, app_args = [opened_dynamic.opened_dynamic_type, type_code], app_info_ptr = nilPtr },
bind_dst = unify_result_fv },
{ bind_src = TupleSelect twotuple 0 (Var unify_result_var),
bind_dst = unify_bool_fv } : let_binds
diff --git a/frontend/convertcases.icl b/frontend/convertcases.icl
index e472dad..442deb7 100644
--- a/frontend/convertcases.icl
+++ b/frontend/convertcases.icl
@@ -42,13 +42,16 @@ where
instance convertCases Let
where
- convertCases bound_vars group_index common_defs lad=:{let_binds,let_expr,let_info_ptr} ci=:{ci_expr_heap}
+ convertCases bound_vars group_index common_defs lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr} ci=:{ci_expr_heap}
# (let_info, ci_expr_heap) = readPtr let_info_ptr ci_expr_heap
ci = { ci & ci_expr_heap = ci_expr_heap }
= case let_info of
EI_LetType let_type
- # ((let_binds,let_expr), ci) = convertCases (addLetVars let_binds let_type bound_vars) group_index common_defs (let_binds,let_expr) ci
- -> ({ lad & let_binds = let_binds, let_expr = let_expr }, ci)
+ # bound_vars = addLetVars (let_strict_binds ++ let_lazy_binds) let_type bound_vars
+ # (let_strict_binds, ci) = convertCases bound_vars group_index common_defs let_strict_binds ci
+ # (let_lazy_binds, ci) = convertCases bound_vars group_index common_defs let_lazy_binds ci
+ # (let_expr, ci) = convertCases bound_vars group_index common_defs let_expr ci
+ -> ({ lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, ci)
_
-> abort "convertCases [Let] (convertcases 53)" // <<- let_info
@@ -483,7 +486,7 @@ where
convert_function group_index dcl_functions common_defs fun (fun_defs, collected_imports, ci)
#! fun_def = fun_defs.[fun]
# {fun_body,fun_type} = fun_def
- (fun_body, (collected_imports, ci)) = eliminate_code_sharing_in_function dcl_functions common_defs (fun_body ==> ("convert_function", fun_def.fun_symb)) (collected_imports, ci)
+ (fun_body, (collected_imports, ci)) = eliminate_code_sharing_in_function dcl_functions common_defs fun_body /* (fun_body ---> ("convert_function", fun_def.fun_symb, fun_body)) */(collected_imports, ci)
(fun_body, ci) = convert_cases_into_function_patterns fun_body fun_type group_index common_defs ci
= ({fun_defs & [fun] = { fun_def & fun_body = fun_body }}, collected_imports, ci)
@@ -635,12 +638,13 @@ where
(sd_type, imported_types, conses, type_heaps, var_heap) = convertSymbolType common_defs sd_type imported_types conses type_heaps var_heap
= (imported_types, conses, type_heaps, var_heap <:= (sd_type_ptr, VI_ExpandedType sd_type))
-convertRootExpression bound_vars group_index common_defs default_ptr (Let lad=:{let_binds,let_expr,let_info_ptr}) ci=:{ci_expr_heap}
+convertRootExpression bound_vars group_index common_defs default_ptr (Let lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr}) ci=:{ci_expr_heap}
# (EI_LetType let_type, ci_expr_heap) = readPtr let_info_ptr ci_expr_heap
- bound_vars = addLetVars let_binds let_type bound_vars
- (let_binds, ci) = convertCases bound_vars group_index common_defs let_binds { ci & ci_expr_heap = ci_expr_heap }
- (let_expr, ci) = convertRootExpression bound_vars group_index common_defs default_ptr let_expr ci
- = (Let { lad & let_binds = let_binds, let_expr = let_expr }, ci)
+ bound_vars = addLetVars (let_strict_binds ++ let_lazy_binds) let_type bound_vars
+ (let_strict_binds, ci) = convertCases bound_vars group_index common_defs let_strict_binds { ci & ci_expr_heap = ci_expr_heap }
+ (let_lazy_binds, ci) = convertCases bound_vars group_index common_defs let_lazy_binds ci
+ (let_expr, ci) = convertRootExpression bound_vars group_index common_defs default_ptr let_expr ci
+ = (Let { lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, ci)
convertRootExpression bound_vars group_index common_defs default_ptr (Case kees=:{case_expr, case_guards, case_default, case_info_ptr}) ci
= case case_guards of
BasicPatterns BT_Bool patterns
@@ -760,7 +764,7 @@ where
{ cp_info & cp_free_vars = [ (var_info_ptr, type) : cp_info.cp_free_vars ],
cp_var_heap = cp_var_heap <:= (var_info_ptr, VI_FreeVar var_name new_info_ptr 1 type) })
_
- -> abort "copy [BoundVar] (convertcases, 612)" // <<- (var_info ---> (var_name, ptrToInt var_info_ptr))
+ -> abort "copy [BoundVar] (convertcases, 612)" <<- (var_info ---> (var_name, ptrToInt var_info_ptr))
instance copy Expression
where
@@ -773,10 +777,13 @@ where
copy (fun_expr @ exprs) cp_info
# ((fun_expr, exprs), cp_info) = copy (fun_expr, exprs) cp_info
= (fun_expr @ exprs, cp_info)
- copy (Let lad=:{let_binds,let_expr}) cp_info=:{cp_var_heap, cp_local_vars}
- # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_binds (cp_local_vars, cp_var_heap)
- # ((let_binds,let_expr), cp_info) = copy (let_binds,let_expr) {cp_info & cp_var_heap = cp_var_heap, cp_local_vars = cp_local_vars }
- = (Let {lad & let_expr = let_expr, let_binds = let_binds }, cp_info)
+ copy (Let lad=:{let_strict_binds,let_lazy_binds, let_expr}) cp_info=:{cp_var_heap, cp_local_vars}
+ # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_strict_binds (cp_local_vars, cp_var_heap)
+ # (cp_local_vars, cp_var_heap) = foldSt bind_let_var let_lazy_binds (cp_local_vars, cp_var_heap)
+ # (let_strict_binds, cp_info) = copy let_strict_binds {cp_info & cp_var_heap = cp_var_heap, cp_local_vars = cp_local_vars }
+ # (let_lazy_binds, cp_info) = copy let_lazy_binds cp_info
+ # (let_expr, cp_info) = copy let_expr cp_info
+ = (Let {lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr }, cp_info)
where
bind_let_var {bind_dst} (local_vars, var_heap)
= ([bind_dst : local_vars], var_heap <:= (bind_dst.fv_info_ptr, VI_LocalVar))
@@ -977,7 +984,8 @@ where
= weightedRefCount dcl_functions common_defs depth app rc_info
weightedRefCount dcl_functions common_defs depth (fun_expr @ exprs) rc_info
= weightedRefCount dcl_functions common_defs depth (fun_expr, exprs) rc_info
- weightedRefCount dcl_functions common_defs depth (Let {let_binds,let_expr, let_info_ptr}) rc_info=:{rc_var_heap}
+ weightedRefCount dcl_functions common_defs depth (Let {let_strict_binds,let_lazy_binds,let_expr, let_info_ptr}) rc_info=:{rc_var_heap}
+ # let_binds = let_strict_binds ++ let_lazy_binds
# rc_info = weightedRefCount dcl_functions common_defs depth let_expr { rc_info & rc_var_heap = foldSt store_binding let_binds rc_var_heap }
(let_info, rc_expr_heap) = readPtr let_info_ptr rc_info.rc_expr_heap
rc_info = { rc_info & rc_expr_heap = rc_expr_heap }
@@ -1270,24 +1278,22 @@ where
distributeLets depth (TupleSelect tuple_symbol arg_nr expr) dl_info
# (expr, dl_info) = distributeLets depth expr dl_info
= (TupleSelect tuple_symbol arg_nr expr, dl_info)
- distributeLets depth (Let lad=:{let_binds,let_expr,let_strict,let_info_ptr}) dl_info=:{di_expr_heap,di_var_heap}
+ distributeLets depth (Let lad=:{let_strict_binds,let_lazy_binds,let_expr,let_info_ptr}) dl_info=:{di_expr_heap,di_var_heap}
# (let_info, di_expr_heap) = readPtr let_info_ptr di_expr_heap
- ok = case let_info of
- EI_LetTypeAndRefCounts let_type ref_counts -> True
- x -> abort ("abort [distributeLets (EI_LetTypeAndRefCounts)]") // ->> x)
- | ok
- # (EI_LetTypeAndRefCounts let_type ref_counts) = let_info
- di_var_heap = set_let_expression_info depth let_strict let_binds ref_counts let_type di_var_heap
- (let_expr, dl_info) = distributeLets depth let_expr { dl_info & di_var_heap = di_var_heap, di_expr_heap = di_expr_heap }
- = (let_expr, foldSt (distribute_lets_in_non_distributed_let depth) let_binds dl_info)
- = undef
+ # (EI_LetTypeAndRefCounts let_type ref_counts) = let_info
+ let_binds = [(True, bind) \\ bind <- let_strict_binds] ++ [(False, bind) \\ bind <- let_lazy_binds]
+ di_var_heap = set_let_expression_info depth let_binds ref_counts let_type di_var_heap
+ (let_expr, dl_info) = distributeLets depth let_expr { dl_info & di_var_heap = di_var_heap, di_expr_heap = di_expr_heap }
+ dl_info = foldSt (distribute_lets_in_non_distributed_let depth) let_strict_binds dl_info
+ dl_info = foldSt (distribute_lets_in_non_distributed_let depth) let_lazy_binds dl_info
+ = (let_expr, dl_info)
where
- set_let_expression_info depth let_strict [{bind_src,bind_dst}:binds][ref_count:ref_counts][type:types] var_heap
+ set_let_expression_info depth [(let_strict, {bind_src,bind_dst}):binds][ref_count:ref_counts][type:types] var_heap
# (new_info_ptr, var_heap) = newPtr VI_Empty var_heap
lei = { lei_count = ref_count, lei_depth = depth, lei_strict = let_strict, /* lei_moved = False, */
lei_var = { bind_dst & fv_info_ptr = new_info_ptr }, lei_expression = bind_src, lei_type = type, lei_status = LES_Untouched }
- = set_let_expression_info depth let_strict binds ref_counts types (var_heap <:= (bind_dst.fv_info_ptr, VI_LetExpression lei))
- set_let_expression_info depth let_strict [] _ _ var_heap
+ = set_let_expression_info depth binds ref_counts types (var_heap <:= (bind_dst.fv_info_ptr, VI_LetExpression lei))
+ set_let_expression_info depth [] _ _ var_heap
= var_heap
distribute_lets_in_non_distributed_let depth {bind_dst={fv_name,fv_info_ptr}} dl_info=:{di_var_heap}
@@ -1422,18 +1428,10 @@ distributeLetsInLetExpression depth let_var_info_ptr lei=:{lei_expression, lei_s
buildLetExpr :: ![VarInfoPtr] !Expression !*(!*VarHeap, !*ExpressionHeap) -> (!Expression, !(!*VarHeap, !*ExpressionHeap))
buildLetExpr let_vars let_expr (var_heap, expr_heap)
# (strict_binds, strict_bind_types, lazy_binds, lazy_binds_types, var_heap) = foldr build_bind ([], [], [], [], var_heap) let_vars
- | isEmpty strict_binds
- | isEmpty lazy_binds
- = (let_expr, (var_heap, expr_heap))
- # (let_info_ptr, expr_heap) = newPtr (EI_LetType lazy_binds_types) expr_heap
- = (Let { let_binds = lazy_binds, let_strict = cIsNotStrict, let_expr = let_expr, let_info_ptr = let_info_ptr }, (var_heap, expr_heap))
- | isEmpty lazy_binds
- # (let_info_ptr, expr_heap) = newPtr (EI_LetType strict_bind_types) expr_heap
- = (Let { let_binds = strict_binds, let_strict = cIsStrict, let_expr = let_expr, let_info_ptr = let_info_ptr }, (var_heap, expr_heap))
- # (strict_let_info_ptr, expr_heap) = newPtr (EI_LetType strict_bind_types) expr_heap
- (lazy_let_info_ptr, expr_heap) = newPtr (EI_LetType lazy_binds_types) expr_heap
- = (Let { let_binds = strict_binds, let_strict = cIsStrict, let_info_ptr = strict_let_info_ptr, let_expr =
- Let { let_binds = lazy_binds, let_strict = cIsNotStrict, let_info_ptr = lazy_let_info_ptr, let_expr = let_expr }}, (var_heap, expr_heap))
+ | isEmpty strict_binds && isEmpty lazy_binds
+ = (let_expr, (var_heap, expr_heap))
+ # (let_info_ptr, expr_heap) = newPtr (EI_LetType (strict_bind_types ++ lazy_binds_types)) expr_heap
+ = (Let { let_strict_binds = strict_binds, let_lazy_binds = lazy_binds, let_expr = let_expr, let_info_ptr = let_info_ptr }, (var_heap, expr_heap))
where
build_bind :: !VarInfoPtr !(!Env Expression FreeVar, ![AType], !Env Expression FreeVar, ![AType], !*VarHeap)
diff --git a/frontend/explicitimports.icl b/frontend/explicitimports.icl
index cda2e2e..e6e67b1 100644
--- a/frontend/explicitimports.icl
+++ b/frontend/explicitimports.icl
@@ -788,8 +788,8 @@ instance consequences InstanceType
consequences {it_types, it_context} = consequences it_types++consequences it_context
instance consequences Let
- where consequences { let_binds, let_expr }
- = consequences let_expr++(flatten [consequences bind_src \\ {bind_src}<-let_binds] )
+ where consequences { let_strict_binds, let_lazy_binds, let_expr }
+ = consequences let_expr++(flatten [consequences bind_src \\ {bind_src}<-let_strict_binds ++ let_lazy_binds] )
instance consequences MemberDef
where
diff --git a/frontend/overloading.icl b/frontend/overloading.icl
index 0e51e27..51bdaed 100644
--- a/frontend/overloading.icl
+++ b/frontend/overloading.icl
@@ -1018,9 +1018,11 @@ where
updateExpression group_index type_contexts (expr @ exprs) ui
# ((expr, exprs), ui) = updateExpression group_index type_contexts (expr, exprs) ui
= (expr @ exprs, ui)
- updateExpression group_index type_contexts (Let lad=:{let_binds, let_expr}) ui
- # ((let_binds, let_expr), ui) = updateExpression group_index type_contexts (let_binds, let_expr) ui
- = (Let {lad & let_binds = let_binds, let_expr = let_expr}, ui)
+ updateExpression group_index type_contexts (Let lad=:{let_lazy_binds, let_strict_binds, let_expr}) ui
+ # (let_lazy_binds, ui) = updateExpression group_index type_contexts let_lazy_binds ui
+ # (let_strict_binds, ui) = updateExpression group_index type_contexts let_strict_binds ui
+ # (let_expr, ui) = updateExpression group_index type_contexts let_expr ui
+ = (Let {lad & let_lazy_binds = let_lazy_binds, let_strict_binds = let_strict_binds, let_expr = let_expr}, ui)
updateExpression group_index type_contexts (Case kees=:{case_expr,case_guards,case_default}) ui
# ((case_expr,(case_guards,case_default)), ui) = updateExpression group_index type_contexts (case_expr,(case_guards,case_default)) ui
= (Case { kees & case_expr = case_expr, case_guards = case_guards, case_default = case_default }, ui)
diff --git a/frontend/refmark.icl b/frontend/refmark.icl
index a450ca2..894b97b 100644
--- a/frontend/refmark.icl
+++ b/frontend/refmark.icl
@@ -95,19 +95,20 @@ where
= refMark free_vars NotASelector app_args var_heap
refMark free_vars sel (fun @ args) var_heap
= refMark free_vars NotASelector args (refMark free_vars NotASelector fun var_heap)
- refMark free_vars sel (Let {let_strict,let_binds,let_expr}) var_heap
- # let_vars = [ bind_dst \\ {bind_dst} <- let_binds ]
- new_free_vars = [ let_vars : free_vars]
- | let_strict
- # (observing, var_heap) = binds_are_observing let_binds var_heap
+ refMark free_vars sel (Let {let_strict_binds,let_lazy_binds,let_expr}) var_heap
+ | isEmpty let_lazy_binds
+ # new_free_vars = [ [ bind_dst \\ {bind_dst} <- let_strict_binds ] : free_vars]
+ # (observing, var_heap) = binds_are_observing let_strict_binds var_heap
| observing
# var_heap = saveOccurrences free_vars var_heap
- var_heap = refMark new_free_vars NotASelector let_binds var_heap
+ var_heap = refMark new_free_vars NotASelector let_strict_binds var_heap
var_heap = saveOccurrences new_free_vars var_heap
var_heap = refMark new_free_vars sel let_expr var_heap
= let_combine free_vars var_heap
- = refMark new_free_vars sel let_expr (refMark new_free_vars NotASelector let_binds var_heap)
- # var_heap = foldSt bind_variable let_binds var_heap
+ = refMark new_free_vars sel let_expr (refMark new_free_vars NotASelector let_strict_binds var_heap)
+ # new_free_vars = [ [ bind_dst \\ {bind_dst} <- let_strict_binds ++ let_lazy_binds ] : free_vars]
+ var_heap = foldSt bind_variable let_strict_binds var_heap
+ var_heap = foldSt bind_variable let_lazy_binds var_heap
= refMark new_free_vars sel let_expr var_heap
where
diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl
index 7273de5..139f5c7 100644
--- a/frontend/syntax.dcl
+++ b/frontend/syntax.dcl
@@ -1025,13 +1025,21 @@ cIsNotStrict :== False
, case_ident :: !Optional Ident
, case_info_ptr :: !ExprInfoPtr
}
-
+/*
:: Let =
{ let_strict :: !Bool
, let_binds :: !(Env Expression FreeVar)
, let_expr :: !Expression
, let_info_ptr :: !ExprInfoPtr
}
+*/
+
+:: Let =
+ { let_strict_binds :: !Env Expression FreeVar
+ , let_lazy_binds :: !Env Expression FreeVar
+ , let_expr :: !Expression
+ , let_info_ptr :: !ExprInfoPtr
+ }
:: Conditional =
{ if_cond :: !Expression
diff --git a/frontend/syntax.icl b/frontend/syntax.icl
index 72c7ca5..9e489b9 100644
--- a/frontend/syntax.icl
+++ b/frontend/syntax.icl
@@ -964,13 +964,12 @@ cIsNotStrict :== False
}
:: Let =
- { let_strict :: !Bool
- , let_binds :: !(Env Expression FreeVar)
- , let_expr :: !Expression
- , let_info_ptr :: !ExprInfoPtr
+ { let_strict_binds :: !Env Expression FreeVar
+ , let_lazy_binds :: !Env Expression FreeVar
+ , let_expr :: !Expression
+ , let_info_ptr :: !ExprInfoPtr
}
-
:: DynamicExpr =
{ dyn_expr :: !Expression
, dyn_opt_type :: !Optional DynamicType
@@ -1332,7 +1331,7 @@ where
// = file <<< app_symb <<< ' ' <<< app_args
= file <<< app_symb <<< " <" <<< ptrToInt app_info_ptr <<< "> " <<< app_args
(<<<) file (f_exp @ a_exp) = file <<< '(' <<< f_exp <<< " @ " <<< a_exp <<< ')'
- (<<<) file (Let {let_info_ptr, let_binds, let_expr}) = write_binds (file <<< "let" <<< '\n') let_binds <<< "in\n" <<< let_expr
+ (<<<) file (Let {let_info_ptr, let_strict_binds, let_lazy_binds, let_expr}) = write_binds (file <<< "let" <<< '\n') (let_strict_binds ++ let_lazy_binds) <<< "in\n" <<< let_expr
where
write_binds file []
= file
diff --git a/frontend/trans.icl b/frontend/trans.icl
index e6cfc3d..90d8503 100644
--- a/frontend/trans.icl
+++ b/frontend/trans.icl
@@ -220,7 +220,8 @@ instance consumerRequirements Expression where
# (cc_fun, _, ai) = consumerRequirements fun_expr common_defs ai
ai_class_subst = unifyClassifications cActive cc_fun ai.ai_class_subst
= consumerRequirements exprs common_defs { ai & ai_class_subst = ai_class_subst }
- consumerRequirements (Let {let_binds,let_expr}) common_defs ai=:{ai_next_var,ai_next_var_of_fun,ai_var_heap}
+ consumerRequirements (Let {let_strict_binds, let_lazy_binds,let_expr}) common_defs ai=:{ai_next_var,ai_next_var_of_fun,ai_var_heap}
+ # let_binds = let_strict_binds ++ let_lazy_binds
# (new_next_var, new_ai_next_var_of_fun, ai_var_heap) = init_variables let_binds ai_next_var ai_next_var_of_fun ai_var_heap
# ai = acc_requirements_of_let_binds let_binds ai_next_var common_defs
{ ai & ai_next_var = new_next_var, ai_next_var_of_fun = new_ai_next_var_of_fun, ai_var_heap = ai_var_heap }
@@ -646,13 +647,15 @@ where
-> transformApplication app exprs ro ti
_
-> (expr @ exprs, ti)
- transform (Let lad=:{let_binds, let_expr}) ro ti
+ transform (Let lad=:{let_strict_binds, let_lazy_binds, let_expr}) ro ti
# ti = store_type_info_of_bindings_in_heap lad ti
- (let_binds, ti) = transform let_binds ro ti
+ (let_strict_binds, ti) = transform let_strict_binds ro ti
+ (let_lazy_binds, ti) = transform let_lazy_binds ro ti
(let_expr, ti) = transform let_expr ro ti
- = (Let { lad & let_binds = let_binds, let_expr = let_expr}, ti)
+ = (Let { lad & let_lazy_binds = let_lazy_binds, let_strict_binds = let_strict_binds, let_expr = let_expr}, ti)
where
- store_type_info_of_bindings_in_heap {let_binds,let_info_ptr} ti
+ store_type_info_of_bindings_in_heap {let_strict_binds, let_lazy_binds,let_info_ptr} ti
+ # let_binds = let_strict_binds ++ let_lazy_binds
# (EI_LetType var_types, ti_symbol_heap) = readExprInfo let_info_ptr ti.ti_symbol_heap
ti_var_heap = foldSt (\(var_type, {bind_dst={fv_info_ptr}}) var_heap
->setExtendedVarInfo fv_info_ptr (EVI_VarType var_type) var_heap)
@@ -800,9 +803,10 @@ transformCase this_case=:{case_expr,case_guards,case_default,case_ident,case_inf
Let lad
| not is_active
-> skip_over this_case ro ti
- # (new_let_binds, ti) = transform lad.let_binds { ro & ro_root_case_mode = NotRootCase } ti
+ # (let_strict_binds, ti) = transform lad.let_strict_binds { ro & ro_root_case_mode = NotRootCase } ti
+ (let_lazy_binds, ti) = transform lad.let_lazy_binds { ro & ro_root_case_mode = NotRootCase } ti
(new_let_expr, ti) = transform (Case { this_case & case_expr = lad.let_expr }) ro ti
- -> (Let { lad & let_expr = new_let_expr, let_binds = new_let_binds }, ti)
+ -> (Let { lad & let_expr = new_let_expr, let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds }, ti)
_ -> skip_over this_case ro ti
where
equal (SK_Function glob_index1) (SK_Function glob_index2)
@@ -917,10 +921,10 @@ transformCase this_case=:{case_expr,case_guards,case_default,case_ident,case_inf
# {cons_type} = ro.ro_common_defs.[glob_module].com_cons_defs.[glob_index]
let_type = filterWith not_unfoldable cons_type.st_args
(new_info_ptr, ti_symbol_heap) = newPtr (EI_LetType let_type) ti_symbol_heap
- = ( Let { let_strict = False
- , let_binds = [ {bind_src=bind_src, bind_dst=bind_dst} \\ (bind_dst,bind_src)<-non_unfoldable_args]
- , let_expr = ap_expr
- , let_info_ptr = new_info_ptr
+ = ( Let { let_strict_binds = []
+ , let_lazy_binds = [ {bind_src=bind_src, bind_dst=bind_dst} \\ (bind_dst,bind_src)<-non_unfoldable_args]
+ , let_expr = ap_expr
+ , let_info_ptr = new_info_ptr
}
, ti_symbol_heap
)
@@ -2088,8 +2092,9 @@ where
= freeVariables app_args fvi
freeVariables (fun @ args) fvi
= freeVariables args (freeVariables fun fvi)
- freeVariables (Let {let_binds,let_expr,let_info_ptr}) fvi=:{fvi_variables = global_variables}
- # (removed_variables, fvi_var_heap) = removeVariables global_variables fvi.fvi_var_heap
+ freeVariables (Let {let_strict_binds,let_lazy_binds,let_expr,let_info_ptr}) fvi=:{fvi_variables = global_variables}
+ # let_binds = let_strict_binds ++ let_lazy_binds
+ (removed_variables, fvi_var_heap) = removeVariables global_variables fvi.fvi_var_heap
fvi = freeVariables let_binds { fvi & fvi_variables = [], fvi_var_heap = fvi_var_heap }
{fvi_expr_heap, fvi_variables, fvi_var_heap, fvi_expr_ptrs} = freeVariables let_expr fvi
(fvi_variables, fvi_var_heap) = removeLocalVariables [bind_dst \\ {bind_dst} <- let_binds] fvi_variables [] fvi_var_heap
diff --git a/frontend/transform.icl b/frontend/transform.icl
index 75e0487..122b290 100644
--- a/frontend/transform.icl
+++ b/frontend/transform.icl
@@ -43,9 +43,11 @@ where
lift (expr @ exprs) ls
# ((expr,exprs), ls) = lift (expr,exprs) ls
= (expr @ exprs, ls)
- lift (Let lad=:{let_binds, let_expr}) ls
- # ((let_binds,let_expr), ls) = lift (let_binds,let_expr) ls
- = (Let {lad & let_binds = let_binds, let_expr = let_expr}, ls)
+ lift (Let lad=:{let_strict_binds, let_lazy_binds, let_expr}) ls
+ # (let_strict_binds, ls) = lift let_strict_binds ls
+ (let_lazy_binds, ls) = lift let_lazy_binds ls
+ (let_expr, ls) = lift let_expr ls
+ = (Let {lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr}, ls)
lift (Case case_expr) ls
# (case_expr, ls) = lift case_expr ls
= (Case case_expr, ls)
@@ -406,13 +408,16 @@ where
instance unfold Let
where
- unfold lad=:{let_binds, let_expr, let_info_ptr} us
- # (let_binds, us) = copy_bound_vars let_binds us
- # ((let_binds,let_expr), us) = unfold (let_binds,let_expr) us
+ unfold lad=:{let_strict_binds, let_lazy_binds, let_expr, let_info_ptr} us
+ # (let_strict_binds, us) = copy_bound_vars let_strict_binds us
+ # (let_lazy_binds, us) = copy_bound_vars let_lazy_binds us
+ # (let_strict_binds, us) = unfold let_strict_binds us
+ # (let_lazy_binds, us) = unfold let_lazy_binds us
+ # (let_expr, us) = unfold let_expr us
(old_let_info, us_symbol_heap) = readPtr let_info_ptr us.us_symbol_heap
(new_let_info, us_opt_type_heaps) = substitute_let_or_case_type old_let_info us.us_opt_type_heaps
(new_info_ptr, us_symbol_heap) = newPtr new_let_info us_symbol_heap
- = ({lad & let_binds = let_binds, let_expr = let_expr, let_info_ptr = new_info_ptr},
+ = ({lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds, let_expr = let_expr, let_info_ptr = new_info_ptr},
{ us & us_symbol_heap = us_symbol_heap, us_opt_type_heaps = us_opt_type_heaps })
where
copy_bound_vars [bind=:{bind_dst} : binds] us
@@ -498,7 +503,7 @@ unfoldMacro {fun_body = TransformedBody {tb_args,tb_rhs}, fun_info = {fi_calls}}
| isEmpty let_binds
= (result_expr, fun_defs, (calls, { es & es_var_heap = us_var_heap, es_symbol_heap = us_symbol_heap, es_symbol_table = es_symbol_table }))
# (new_info_ptr, us_symbol_heap) = newPtr EI_Empty us_symbol_heap
- = (Let { let_strict = cIsNotStrict, let_binds = let_binds, let_expr = result_expr, let_info_ptr = new_info_ptr}, fun_defs,
+ = (Let { let_strict_binds = [], let_lazy_binds = let_binds, let_expr = result_expr, let_info_ptr = new_info_ptr}, fun_defs,
(calls, { es & es_var_heap = us_var_heap, es_symbol_heap = us_symbol_heap, es_symbol_table = es_symbol_table }))
where
@@ -1033,9 +1038,11 @@ where
expand (expr @ exprs) fun_and_macro_defs mod_index modules es
# ((expr,exprs), fun_and_macro_defs, modules, es) = expand (expr,exprs) fun_and_macro_defs mod_index modules es
= (expr @ exprs, fun_and_macro_defs, modules, es)
- expand (Let lad=:{let_binds, let_expr}) fun_and_macro_defs mod_index modules es
- # ((let_binds,let_expr), fun_and_macro_defs, modules, es) = expand (let_binds,let_expr) fun_and_macro_defs mod_index modules es
- = (Let {lad & let_expr = let_expr, let_binds = let_binds}, fun_and_macro_defs, modules, es)
+ expand (Let lad=:{let_strict_binds, let_lazy_binds, let_expr}) fun_and_macro_defs mod_index modules es
+ # (let_strict_binds, fun_and_macro_defs, modules, es) = expand let_strict_binds fun_and_macro_defs mod_index modules es
+ # (let_lazy_binds, fun_and_macro_defs, modules, es) = expand let_lazy_binds fun_and_macro_defs mod_index modules es
+ # (let_expr, fun_and_macro_defs, modules, es) = expand let_expr fun_and_macro_defs mod_index modules es
+ = (Let {lad & let_expr = let_expr, let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds}, fun_and_macro_defs, modules, es)
expand (Case case_expr) fun_and_macro_defs mod_index modules es
# (case_expr, fun_and_macro_defs, modules, es) = expand case_expr fun_and_macro_defs mod_index modules es
= (Case case_expr, fun_and_macro_defs, modules, es)
@@ -1177,17 +1184,21 @@ where
collectVariables (expr @ exprs) free_vars cos
# ((expr, exprs), free_vars, cos) = collectVariables (expr, exprs) free_vars cos
= (expr @ exprs, free_vars, cos)
- collectVariables (Let lad=:{let_binds, let_expr}) free_vars cos=:{cos_var_heap}
- # cos_var_heap = determine_aliases let_binds cos_var_heap
- (is_cyclic, let_binds, cos_var_heap) = detect_cycles_and_remove_alias_binds let_binds cos_var_heap
- | is_cyclic
- = (Let {lad & let_binds = let_binds }, free_vars, { cos & cos_var_heap = cos_var_heap, cos_error = checkError "" "cyclic let definition" cos.cos_error})
+ collectVariables (Let lad=:{let_strict_binds, let_lazy_binds, let_expr}) free_vars cos=:{cos_var_heap}
+ # cos_var_heap = determine_aliases let_strict_binds cos_var_heap
+ # cos_var_heap = determine_aliases let_lazy_binds cos_var_heap
+ (is_cyclic_s, let_strict_binds, cos_var_heap) = detect_cycles_and_remove_alias_binds let_strict_binds cos_var_heap
+ (is_cyclic_l, let_lazy_binds, cos_var_heap) = detect_cycles_and_remove_alias_binds let_lazy_binds cos_var_heap
+ | is_cyclic_s || is_cyclic_l
+ = (Let {lad & let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds }, free_vars,
+ { cos & cos_var_heap = cos_var_heap, cos_error = checkError "" "cyclic let definition" cos.cos_error})
| otherwise
- # (let_expr, free_vars, cos) = collectVariables let_expr free_vars { cos & cos_var_heap = cos_var_heap }
- (let_binds, free_vars, cos) = collect_variables_in_binds let_binds [] free_vars cos
- | isEmpty let_binds
+ # (let_expr, free_vars, cos) = collectVariables let_expr free_vars { cos & cos_var_heap = cos_var_heap }
+ (let_strict_binds, free_vars, cos) = collect_variables_in_binds let_strict_binds [] free_vars cos
+ (let_lazy_binds, free_vars, cos) = collect_variables_in_binds let_lazy_binds [] free_vars cos
+ | isEmpty let_strict_binds && isEmpty let_lazy_binds
= (let_expr, free_vars, cos)
- = (Let {lad & let_expr = let_expr, let_binds = let_binds}, free_vars, cos)
+ = (Let {lad & let_expr = let_expr, let_strict_binds = let_strict_binds, let_lazy_binds = let_lazy_binds}, free_vars, cos)
where
/* Set the 'var_info_field' of each bound variable to either 'VI_Alias var' (if
diff --git a/frontend/type.icl b/frontend/type.icl
index 8ad360d..de16283 100644
--- a/frontend/type.icl
+++ b/frontend/type.icl
@@ -916,8 +916,9 @@ where
instance requirements Let
where
- requirements ti {let_binds, let_expr, let_info_ptr} (reqs, ts)
- # (rev_var_types, ts) = make_base let_binds [] ts
+ requirements ti {let_lazy_binds, let_strict_binds, let_expr, let_info_ptr} (reqs, ts)
+ # let_binds = let_strict_binds ++ let_lazy_binds
+ (rev_var_types, ts) = make_base let_binds [] ts
var_types = reverse rev_var_types
(res_type, opt_expr_ptr, reqs_ts) = requirements ti let_expr (reqs, ts)
(reqs, ts) = requirements_of_binds ti let_binds var_types reqs_ts
@@ -1496,7 +1497,7 @@ where
type_component comp class_instances ti=:{ti_common_defs} (type_error, fun_defs, predef_symbols, special_instances, ts)
# (fun_defs, predef_symbols, cons_variables, ts) = CreateInitialSymbolTypes ti_common_defs comp (fun_defs, predef_symbols, [], ts)
(names, fun_defs) = show_component comp fun_defs
- (fun_reqs, (cons_variables, fun_defs, ts)) = type_functions comp ti cons_variables fun_defs (ts ---> names)
+ (fun_reqs, (cons_variables, fun_defs, ts)) = type_functions comp ti cons_variables fun_defs ts //(ts ---> names)
#! nr_of_type_variables = ts.ts_var_store
# (subst, ts_type_heaps, ts_error)