aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjohnvg2001-08-31 11:11:51 +0000
committerjohnvg2001-08-31 11:11:51 +0000
commit3d39c6929e0ae1ef652febabfa6c4a75676d5392 (patch)
treeea8bae3d352a5943319e32c81577dfd92eab4616
parentadded code for OverloadedListPatterns (diff)
added code for strict and unboxed list comprehensions
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@713 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r--frontend/postparse.icl47
1 files changed, 26 insertions, 21 deletions
diff --git a/frontend/postparse.icl b/frontend/postparse.icl
index 7ae7c1f..f469d38 100644
--- a/frontend/postparse.icl
+++ b/frontend/postparse.icl
@@ -164,16 +164,15 @@ where
collectFunctions (PE_Let strict locals in_expr) icl_module ca
# ((node_defs,in_expr), ca) = collectFunctions (locals,in_expr) icl_module ca
= (PE_Let strict node_defs in_expr, ca)
- collectFunctions (PE_Compr gen_kind expr qualifiers) icl_module ca
- # (compr, ca)
- = transformComprehension gen_kind expr qualifiers ca
-// | fst (ferror (stderr <<< compr))
-// = collectFunctions compr icl_module ca
+ collectFunctions (PE_ListCompr predef_cons_index predef_nil_index expr qualifiers) icl_module ca
+ # (compr, ca) = transformListComprehension predef_cons_index predef_nil_index expr qualifiers ca
+ = collectFunctions compr icl_module ca
+ collectFunctions (PE_ArrayCompr expr qualifiers) icl_module ca
+ # (compr, ca) = transformArrayComprehension expr qualifiers ca
= collectFunctions compr icl_module ca
collectFunctions (PE_UpdateComprehension expr updateExpr identExpr qualifiers) icl_module ca
- # (compr, ca)
- = transformUpdateComprehension [expr] [updateExpr] [identExpr] identExpr qualifiers ca
- = collectFunctions compr icl_module ca
+ # (compr, ca) = transformUpdateComprehension [expr] [updateExpr] [identExpr] identExpr qualifiers ca
+ = collectFunctions compr icl_module ca
collectFunctions (PE_Sequ sequence) icl_module ca=:{ca_predefs}
= collectFunctions (transformSequence sequence ca_predefs) icl_module ca
collectFunctions (PE_ArrayDenot exprs) icl_module ca=:{ca_predefs}
@@ -377,15 +376,19 @@ transformLambda lam_ident args result pos icl_module
lam_body = [{pb_args = args, pb_rhs = lam_rhs, pb_position = pos }]
= MakeNewImpOrDefFunction icl_module lam_ident (length args) lam_body (FK_Function cNameLocationDependent) NoPrio No pos
-makeNilExpression :: *CollectAdmin -> (ParsedExpr,*CollectAdmin)
-makeNilExpression ca=:{ca_predefs}
- #! nil_id = ca_predefs.[PD_NilSymbol]
+makeLazyConsExpression :: ParsedExpr ParsedExpr *CollectAdmin -> (ParsedExpr,*CollectAdmin)
+makeLazyConsExpression a1 a2 ca=:{ca_predefs}
+ #! cons_id = ca_predefs.[PD_ConsSymbol]
+ = (PE_List [PE_Ident cons_id, a1, a2], ca)
+
+makeNilExpression :: Int *CollectAdmin -> (ParsedExpr,*CollectAdmin)
+makeNilExpression predef_nil_index ca=:{ca_predefs}
+ #! nil_id = ca_predefs.[predef_nil_index]
= (PE_Ident nil_id, ca)
-// = (PE_List [PE_Ident nil_id], ca)
-makeConsExpression :: ParsedExpr ParsedExpr *CollectAdmin -> (ParsedExpr,*CollectAdmin)
-makeConsExpression a1 a2 ca=:{ca_predefs}
- #! cons_id = ca_predefs.[PD_ConsSymbol]
+makeConsExpression :: Int ParsedExpr ParsedExpr *CollectAdmin -> (ParsedExpr,*CollectAdmin)
+makeConsExpression predef_cons_index a1 a2 ca=:{ca_predefs}
+ #! cons_id = ca_predefs.[predef_cons_index]
= (PE_List [PE_Ident cons_id, a1, a2], ca)
// +++ change to accessor functions
@@ -527,7 +530,7 @@ transformGenerator {gen_kind=IsListGenerator, gen_expr, gen_pattern, gen_positio
(tl, ca) = prefixAndPositionToIdentExp "g_t" gen_position ca
(gen_var_case1, ca) = prefixAndPositionToIdent "g_c1" gen_position ca
(gen_var_case2, ca) = prefixAndPositionToIdent "g_c2" gen_position ca
- (cons, ca) = makeConsExpression hd tl ca
+ (cons, ca) = makeLazyConsExpression hd tl ca
# transformed_generator
= { tg_expr = ([],[gen_expr])
, tg_lhs_arg = [list]
@@ -745,11 +748,11 @@ CreateTransformedQualifierFromTransformedGenerators transformedGenerators array
, tq_fun_pos = LinePos qual_filename qual_position.lc_line
}, ca)
-transformComprehension :: Bool ParsedExpr [Qualifier] *CollectAdmin -> (ParsedExpr, *CollectAdmin)
-transformComprehension IsListGenerator expr qualifiers ca
+transformListComprehension :: Int Int ParsedExpr [Qualifier] *CollectAdmin -> (ParsedExpr, *CollectAdmin)
+transformListComprehension predef_cons_index predef_nil_index expr qualifiers ca
# (transformed_qualifiers, ca) = mapSt transformQualifier qualifiers ca
- (success, ca) = makeConsExpression expr (last transformed_qualifiers).tq_continue ca
- (nil, ca) = makeNilExpression ca
+ (success, ca) = makeConsExpression predef_cons_index expr (last transformed_qualifiers).tq_continue ca
+ (nil, ca) = makeNilExpression predef_nil_index ca
transformed_qualifiers
= [ {qual & tq_success = success, tq_end = end}
\\ qual <- transformed_qualifiers
@@ -757,7 +760,9 @@ transformComprehension IsListGenerator expr qualifiers ca
& end <- [nil : [qual.tq_continue \\ qual <- transformed_qualifiers]]
]
= makeComprehensions transformed_qualifiers success [] ca
-transformComprehension IsArrayGenerator expr qualifiers ca
+
+transformArrayComprehension :: ParsedExpr [Qualifier] *CollectAdmin -> (ParsedExpr, *CollectAdmin)
+transformArrayComprehension expr qualifiers ca
# [hd_qualifier:_] = qualifiers
qual_position = hd_qualifier.qual_position
(c_i_ident_exp, ca) = prefixAndPositionToIdentExp "c_i" qual_position ca