diff options
author | alimarin | 2001-05-03 17:38:15 +0000 |
---|---|---|
committer | alimarin | 2001-05-03 17:38:15 +0000 |
commit | 496bcc2d8011ff2ef0cf8c983a41d6f2deacdaec (patch) | |
tree | 60c2168a2bf4708618d006091e10371026b94d44 | |
parent | replaced corrupted cDirectory.obj (diff) |
added preliminary support for cons info by type
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@382 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
-rw-r--r-- | frontend/check.icl | 2 | ||||
-rw-r--r-- | frontend/generics.icl | 534 | ||||
-rw-r--r-- | frontend/parse.icl | 1 | ||||
-rw-r--r-- | frontend/syntax.dcl | 6 | ||||
-rw-r--r-- | frontend/syntax.icl | 6 | ||||
-rw-r--r-- | frontend/transform.dcl | 14 | ||||
-rw-r--r-- | frontend/transform.icl | 1 |
7 files changed, 470 insertions, 94 deletions
diff --git a/frontend/check.icl b/frontend/check.icl index 95f3e39..4a035e2 100644 --- a/frontend/check.icl +++ b/frontend/check.icl @@ -34,6 +34,7 @@ checkGenerics , KindArrow [KindConst, KindConst] ] # (kinds_ptr, th_vars) = newPtr (TVI_Kinds kinds) th_vars + # (cons_ptr, th_vars) = newPtr (TVI_Empty) th_vars # cs = {cs & cs_error = cs_error, cs_symbol_table = cs_symbol_table } # type_heaps = {type_heaps & th_vars = th_vars} @@ -50,6 +51,7 @@ checkGenerics { generic_def & gen_type = { gen_type & gt_vars = gt_vars, gt_type = gt_type } , gen_kinds_ptr = kinds_ptr + , gen_cons_ptr = cons_ptr } # generic_defs = {generic_defs & [gen_index] = generic_def} diff --git a/frontend/generics.icl b/frontend/generics.icl index 510ba6f..f8fbff9 100644 --- a/frontend/generics.icl +++ b/frontend/generics.icl @@ -9,8 +9,15 @@ import check from transform import Group import analtypes -supportConsInfo :== True -supportConsInfoByType :== True +// whether to generate CONS +// (needed for function that use CONS, like toString) +supportCons :== True + +// whether to bind _cons_info to actual constructor info +// (needed for functions that create CONS, like fromString) +supportConsInfo :== True && supportCons + +// whether generate missing alternatives supportPartialInstances :== False :: *GenericState = { @@ -31,7 +38,7 @@ supportPartialInstances :== False :: GenericTypeDefInfo = GTDI_Empty // no generic rep needed - | GTDI_Generic GenericTypeRep // generic representataion + | GTDI_Generic GenericTypeRep // generic representataion :: GenericTypeDefInfos :== {# .{GenericTypeDefInfo}} @@ -123,7 +130,12 @@ convertGenerics #! (ok,gs) = gs!gs_error.ea_ok | not ok = return gs predefs hash_table dcl_modules - + + #! (cons_funs, cons_groups, gs) = buildConsInstances gs + | not ok + //---> "*** bind function for CONS" + = return gs predefs hash_table dcl_modules + #! (td_indexes, gs) = collectGenericTypeDefs generic_types instance_types gs //---> "*** collect type definitions for which a generic representation must be created" #! (ok,gs) = gs!gs_error.ea_ok @@ -163,8 +175,8 @@ convertGenerics // the order in the lists below is important! // Indexes are allocated in that order. - #! new_funs = iso_funs ++ isomap_type_funs ++ isomap_gen_funs ++ instance_funs ++ star_funs - #! new_groups = iso_groups ++ isomap_type_groups ++ isomap_gen_groups ++ instance_groups ++ star_groups + #! new_funs = cons_funs ++ iso_funs ++ isomap_type_funs ++ isomap_gen_funs ++ instance_funs ++ star_funs + #! new_groups = cons_groups ++ iso_groups ++ isomap_type_groups ++ isomap_gen_groups ++ instance_groups ++ star_groups #! gs = addFunsAndGroups new_funs new_groups gs //---> "*** add geenrated functions" @@ -281,12 +293,19 @@ where convert_instance :: !Index !Index !*{#ClassInstance} !*GenericState -> (![Global Index], !*{#ClassInstance}, !*GenericState) - convert_instance module_index instance_index instance_defs gs=:{gs_td_infos, gs_modules, gs_error} - + convert_instance + module_index instance_index instance_defs + gs=:{gs_td_infos, gs_modules, gs_error, gs_fun_defs, gs_predefs, gs_heaps} #! (instance_def=:{ins_class,ins_ident,ins_pos}, instance_defs) = instance_defs ! [instance_index] | not instance_def.ins_is_generic - = ([], instance_defs, {gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error}) - + # gs = { gs + & gs_td_infos = gs_td_infos + , gs_modules = gs_modules + , gs_fun_defs = gs_fun_defs + , gs_heaps = gs_heaps + , gs_error = gs_error } + = ([], instance_defs, gs) + // determine the kind of the instance type #! it_type = hd instance_def.ins_type.it_types #! (kind, gs_td_infos) = kindOfType it_type gs_td_infos @@ -296,32 +315,59 @@ where | not ok = abort ("no class " +++ ins_ident.id_name +++ "for kind" +++ toString kind) + // bind the instance to the class #! instance_def = { instance_def & ins_class = {glob_module=ins_class.glob_module, glob_object=class_ds} , ins_ident = makeIdent (ins_ident.id_name +++ ":" +++ (toString kind)) } + #! (instance_def, gs_fun_defs) = check_if_partial instance_def gs_fun_defs + #! instance_defs = { instance_defs & [instance_index] = instance_def} - #! (ok, gs_modules, gs_error) = check_instance instance_def gs_modules gs_error + #! (ok, gs_modules, gs_error) = check_instance_args instance_def gs_modules gs_error | not ok - = ([], instance_defs, { gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error }) + # gs = { gs + & gs_td_infos = gs_td_infos + , gs_modules = gs_modules + , gs_fun_defs = gs_fun_defs + , gs_heaps = gs_heaps + , gs_error = gs_error } + = ([], instance_defs, gs) + # gs_heaps = check_cons_instance generic_def instance_def it_type gs_predefs gs_heaps + # (maybe_td_index, gs_modules, gs_error) = determine_type_def_index it_type instance_def gs_modules gs_error - = (maybe_td_index, instance_defs, { gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error }) + # gs = { gs + & gs_td_infos = gs_td_infos + , gs_modules = gs_modules + , gs_fun_defs = gs_fun_defs + , gs_heaps = gs_heaps + , gs_error = gs_error } + = (maybe_td_index, instance_defs, gs) determine_type_def_index (TA {type_index} _) - {ins_generate, ins_ident, ins_pos} + {ins_generate, ins_partial, ins_ident, ins_pos} gs_modules gs_error # ({td_rhs, td_index}, gs_modules) = getTypeDef type_index.glob_module type_index.glob_object gs_modules = determine_td_index td_rhs gs_modules gs_error where determine_td_index (AlgType _) gs_modules gs_error - = (if ins_generate [type_index] [], gs_modules, gs_error) + | ins_generate + = ([type_index], gs_modules, gs_error) + | supportPartialInstances && ins_partial + = ([type_index], gs_modules, gs_error) + | otherwise + = ([], gs_modules, gs_error) determine_td_index (RecordType _) gs_modules gs_error - = (if ins_generate [type_index] [], gs_modules, gs_error) + | ins_generate + = ([type_index], gs_modules, gs_error) + | supportPartialInstances && ins_partial + = ([type_index], gs_modules, gs_error) + | otherwise + = ([], gs_modules, gs_error) determine_td_index (SynType _) gs_modules gs_error # gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) @@ -344,8 +390,36 @@ where "generic instance type must be a type constructor" gs_error = ([], gs_modules, gs_error) - - check_instance + + check_if_partial :: !ClassInstance !*{#FunDef} -> (!ClassInstance, !*{#FunDef}) + check_if_partial instance_def=:{ins_members} gs_fun_defs + = case supportPartialInstances of + True + # ins_fun_ds = ins_members.[0] + # (fun_def, gs_fun_defs) = gs_fun_defs ! [ins_fun_ds.ds_index] + # (TransformedBody {tb_rhs}) = fun_def.fun_body + # ok = case tb_rhs of + Case {case_default=No} -> True + _ -> False + -> ({instance_def & ins_partial = ok}, gs_fun_defs) + False -> (instance_def, gs_fun_defs) + + check_cons_instance + {gen_cons_ptr} {ins_members} + (TA {type_index={glob_module, glob_object}} _) + predefs heaps + | not supportConsInfo + = heaps + # {pds_module, pds_def} = predefs.[PD_TypeCONS] + | glob_module <> pds_module || glob_object <> pds_def + = heaps + # {hp_type_heaps=hp_type_heaps=:{th_vars}}=heaps + # th_vars = writePtr gen_cons_ptr (TVI_ConsInstance ins_members.[0]) th_vars + = {heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars}} + check_cons_instance _ _ _ _ heaps + = heaps + + check_instance_args instance_def=:{ins_class={glob_module,glob_object}, ins_ident, ins_pos, ins_type, ins_generate} gs_modules gs_error | ins_generate @@ -378,6 +452,94 @@ where = ([at_type \\ {at_type} <- [st_result:st_args]] ++ types, gs_modules) +buildConsInstances :: !*GenericState -> (![FunDef], ![Group], !*GenericState) +buildConsInstances gs + | supportConsInfo + = build_cons_instances 0 0 gs + = ([], [], gs) +where + build_cons_instances module_index generic_index gs=:{gs_modules} + #! size_gs_modules = size gs_modules + | module_index == size_gs_modules + = ([], [], {gs & gs_modules = gs_modules}) + # (generic_defs, gs_modules) = gs_modules ! [module_index].com_generic_defs + # gs = {gs & gs_modules = gs_modules} + #! size_generic_defs = size generic_defs + | generic_index == size_generic_defs + = build_cons_instances (inc module_index) 0 gs + # (fun, group, gs) = build_cons_instance generic_defs.[generic_index] gs + # (funs, groups, gs) = build_cons_instances module_index (inc generic_index) gs + = ([fun:funs], [group:groups], gs) + + build_cons_instance generic_def gs + #! (fun_index, group_index, gs) = newFunAndGroupIndex gs + #! (ins_fun_def_sym, gs) = get_cons_fun generic_def gs + #! {gs_fun_defs, gs_predefs, gs_heaps} = gs + #! fun_def_sym = + { ds_ident = makeIdent (ins_fun_def_sym.ds_ident.id_name +++ ":cons_info") + , ds_arity = ins_fun_def_sym.ds_arity + 1 + , ds_index = fun_index + } + #! gs_heaps = set_cons_fun generic_def fun_def_sym gs_heaps + + #! (ins_fun_def, gs_fun_defs) = gs_fun_defs ! [ins_fun_def_sym.ds_index] + + #! (fun_def, gs_heaps) = copyFunDef ins_fun_def fun_index group_index gs_heaps + + #! (fun_def, gs_heaps) = parametrize_with_cons_info fun_def gs_predefs gs_heaps + + #! group = {group_members = [fun_index]} + + = (fun_def, group, {gs & gs_fun_defs = gs_fun_defs, gs_heaps = gs_heaps}) + //---> ("build_cons_instance", ins_fun_def, fun_def) + where + parametrize_with_cons_info fun_def=:{fun_arity, fun_body} predefs heaps + # (var_expr, var, heaps) = buildVarExpr "cons_info" heaps + # (TransformedBody tb=:{tb_args, tb_rhs}) = fun_body + # (tb_rhs, heaps) = mapExprSt (replace_cons_info var_expr) tb_rhs heaps + # fun_def = + { fun_def + & fun_arity = fun_arity + 1 + , fun_body = TransformedBody {tb & tb_args = [var:tb_args], tb_rhs = tb_rhs} + } + = (fun_def, heaps) + where + {pds_module,pds_def} = predefs.[PD_cons_info] + replace_cons_info + var_expr + expr=:(App {app_symb={symb_kind=SK_Function {glob_object, glob_module}}}) + heaps + | pds_module == glob_module && pds_def == glob_object + = (var_expr, heaps) + //---> ("replace_cons_info", expr, var_expr) + = (expr, heaps) + //---> ("replace_cons_info: App expr1", expr) + + replace_cons_info var_expr expr=:(App app) heaps + = (expr, heaps) + //---> ("replace_cons_info: App expr2", expr) + + replace_cons_info var_expr expr heaps + = (expr, heaps) + + get_cons_fun + {gen_cons_ptr, gen_pos, gen_name} + gs=:{gs_heaps=gs_heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}}, gs_error} + # (info, th_vars) = readPtr gen_cons_ptr th_vars + # gs_heaps = { gs_heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars }} + # (fun_def_sym, gs_error) = case info of + TVI_ConsInstance fun_def_sym + -> (fun_def_sym, gs_error) + TVI_Empty + -> (EmptyDefinedSymbol, reportError gen_name gen_pos "no CONS instance provided" gs_error) + = (fun_def_sym, {gs & gs_heaps = gs_heaps, gs_error = gs_error}) + + set_cons_fun + {gen_cons_ptr} fun_def_sym + gs_heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}} + # th_vars = writePtr gen_cons_ptr (TVI_ConsInstance fun_def_sym) th_vars + = { gs_heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars }} + collectInstanceKinds :: !*GenericState -> !*GenericState collectInstanceKinds gs = collect_instance_kinds 0 0 gs @@ -596,7 +758,8 @@ where # {gs_gtd_infos, gs_modules, gs_predefs, gs_error} = gs # (type_def=:{td_name}, gs_modules) = getTypeDef glob_module glob_object gs_modules # (common_defs, gs_modules) = gs_modules ! [glob_module] - # (ok, generic_rep_type, gs_error) = buildGenericRepType glob_module type_def gs_predefs common_defs gs_error + # (ok, generic_rep_type, gs_error) = + buildGenericRepType glob_module type_def gs_predefs common_defs gs_error # iso_def_sym = { ds_ident = {id_name="iso:"+++type_def.td_name.id_name, id_info = nilPtr }, @@ -638,7 +801,7 @@ where # funs = cons_info_fun_defs ++ [ from_fun_def, to_fun_def, iso_fun_def ] # cons_groups = - if supportConsInfo + if supportCons [{group_members = [ds_index]} \\ {ds_index} <- cons_info_def_syms] [] # groups = cons_groups ++ @@ -655,11 +818,11 @@ where # gs = {gs & gs_modules = gs_modules} = case td_rhs of (AlgType alts) - -> case supportConsInfo of + -> case supportCons of True -> build_alg_cons_infos alts common_defs gs False -> (repeatn (length alts) EmptyDefinedSymbol, [], [], gs) (RecordType {rt_constructor}) - -> case supportConsInfo of + -> case supportCons of True -> build_alg_cons_infos [rt_constructor] common_defs gs False -> ([EmptyDefinedSymbol], [], [], gs) _ -> ([], [], [], gs) @@ -892,8 +1055,7 @@ where #! instance_defs = {instance_defs & [instance_index] = instance_def} = ([fun_def], [{group_members = [fun_def.fun_index]}], instance_defs, gs) - # (ok, gs) = check_whether_to_add_alternative instance_def gs - | supportPartialInstances && ok + | supportPartialInstances && instance_def.ins_partial #! (fun_def, fun_def_sym, gs) = build_instance_fun instance_def gs #! (instance_def, ins_fun_def, gs) = move_instance instance_def gs @@ -907,36 +1069,7 @@ where | otherwise = ([], [], instance_defs, gs) - - check_whether_to_add_alternative {ins_members,ins_type} gs=:{gs_predefs} - #! it_type = hd ins_type.it_types - = case it_type of - (TA {type_index={glob_module,glob_object}} _) - #! pd_unit = gs_predefs . [PD_TypeUNIT] - #! pd_pair = gs_predefs . [PD_TypePAIR] - #! pd_either = gs_predefs . [PD_TypeEITHER] - #! pd_arrow = gs_predefs . [PD_TypePAIR] - | glob_module == pd_unit.pds_module && - ( glob_object == pd_unit.pds_def || - glob_object == pd_either.pds_def || - glob_object == pd_pair.pds_def || - glob_object == pd_arrow.pds_def) - -> (False, gs) - # ins_fun_ds = ins_members.[0] - # (ins_fun_def, gs) = get_fun_def ins_fun_ds.ds_index gs - with - get_fun_def fun_index gs=:{gs_fun_defs} - # (fun_def, gs_fun_defs) = gs_fun_defs ! [fun_index] - = (fun_def, {gs & gs_fun_defs = gs_fun_defs}) - - # (TransformedBody {tb_rhs}) = ins_fun_def.fun_body - # ok = case tb_rhs of - Case {case_default=No} -> True - _ -> False - -> (ok, gs) - _ -> (False, gs) - - + add_generic_alternative ins_fun_def gen_fun_def gs=:{gs_heaps, gs_main_dcl_module_n} # (TransformedBody tb) = ins_fun_def.fun_body # (Case cas) = tb.tb_rhs @@ -1101,6 +1234,7 @@ where ins_pos = ins_pos, ins_is_generic = True, ins_generate = False, + ins_partial = False, ins_generic = ins_generic } //---> fun_def @@ -1597,7 +1731,7 @@ where build_sum [{ds_index}] predefs cons_defs # cons_args = cons_defs.[ds_index].cons_type.st_args # atype = buildProductType cons_args predefs - = case supportConsInfo of + = case supportCons of True -> buildATypeCONS atype predefs False -> atype build_sum alts predefs cons_defs @@ -1607,7 +1741,7 @@ where buildGenericRepType td_module {td_rhs=(RecordType {rt_constructor={ds_index}})} predefs common_defs error #! {cons_type={st_args}} = common_defs . com_cons_defs . [ds_index] #! atype = buildProductType st_args predefs - #! atype = case supportConsInfo of + #! atype = case supportCons of True -> buildATypeCONS atype predefs False -> atype = (True, atype, error) @@ -1705,7 +1839,7 @@ where # names = ["x" +++ toString (i+1) +++ toString k \\ k <- [1..ds_arity]] # (var_exprs, vars, gs_heaps) = buildVarExprs names gs_heaps # (expr, gs_heaps) = build_prod var_exprs gs_predefs gs_heaps - # (expr, gs_heaps) = case supportConsInfo of + # (expr, gs_heaps) = case supportCons of True //# (cons_info_expr, gs_heaps) = buildUndefFunApp [] gs_predefs gs_heaps # (cons_info_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n cons_info [] gs_heaps @@ -1778,7 +1912,7 @@ where build_sum type_def_mod [def_symbol] predefs heaps error # (cons_app_expr, cons_args, heaps) = build_cons_app type_def_mod def_symbol heaps # (alt_expr, free_vars, heaps) = build_prod cons_app_expr cons_args predefs heaps - = case supportConsInfo of + = case supportCons of True # (var_expr, var, heaps) = buildVarExpr "c" heaps # (info_var, heaps) = buildFreeVar0 "i" heaps @@ -2090,7 +2224,7 @@ buildInstance #! (original_arg_exprs, original_arg_vars, gs_heaps) = buildVarExprs original_arg_names gs_heaps #! arg_vars = generated_arg_vars ++ original_arg_vars - #! (gt=:{gtr_type, gtr_type_args}, gs) = get_generic_type ins_type {gs & gs_heaps = gs_heaps } + #! (gt=:{gtr_type, gtr_type_args, gtr_cons_infos}, gs) = get_generic_type ins_type {gs & gs_heaps = gs_heaps } #! gen_glob_def_sym = { glob_module = ins_generic.glob_module, glob_object = { @@ -2103,8 +2237,12 @@ buildInstance #! (adaptor_expr, gs) = build_adaptor_expr gt gen_isomap gs //---> ("generic type", gtr_type) - #! (instance_expr, gs) = build_instance_expr gtr_type gtr_type_args generated_arg_vars gen_glob_def_sym gs + #! (instance_expr, cons_infos, gs) = build_instance_expr gtr_type gtr_cons_infos gtr_type_args generated_arg_vars gen_glob_def_sym gs //---> ("build_instance_expr", gtr_type_args, generated_arg_vars) + + | supportConsInfo && (not (isEmpty cons_infos)) + = abort "not all cons infos consumed" + #! body_expr = if (isEmpty original_arg_exprs) (adaptor_expr @ [instance_expr]) ((adaptor_expr @ [instance_expr]) @ original_arg_exprs) @@ -2120,6 +2258,7 @@ where TA type_symb_ident _ -> type_symb_ident _ -> abort "no generic type represetation" # (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [type_index.glob_module, type_index.glob_object] + //# (type_def, gs_modules) = getTypeDef type_index.glob_module type_index.glob_object gs_modules # (GTDI_Generic gt) = gtd_info = (gt, {gs & gs_gtd_infos = gs_gtd_infos, gs_modules = gs_modules}) @@ -2142,41 +2281,52 @@ where // eqEITHER // (eqCONS info_Nil eqUNIT) // (eqCONS info_Cons (eqPAIR eqElt (eqList eqElt))) - build_instance_expr :: !AType ![TypeVar] ![FreeVar] !(Global DefinedSymbol) !*GenericState - -> (Expression, !*GenericState) - build_instance_expr {at_type} type_vars vars gen_sym gs - = build_instance_expr1 at_type type_vars vars gen_sym gs - - build_instance_expr1 (TA {type_name, type_index, type_arity} type_args) type_vars vars gen_sym gs - # (arg_exprs, gs=:{gs_heaps}) = - mapSt (\t gs -> build_instance_expr t type_vars vars gen_sym gs) type_args gs - # (kind, gs) = get_kind_of_type_def type_index gs - = build_generic_app gen_sym kind arg_exprs gs - - build_instance_expr1 (arg_type --> res_type) type_vars vars gen_sym gs=:{gs_error} + build_instance_expr :: !AType ![DefinedSymbol] ![TypeVar] ![FreeVar] !(Global DefinedSymbol) !*GenericState + -> (Expression, ![DefinedSymbol], !*GenericState) + build_instance_expr {at_type} cons_infos type_vars vars gen_sym gs + = build_instance_expr1 at_type cons_infos type_vars vars gen_sym gs + + build_instance_expr1 (TA {type_name, type_index, type_arity} type_args) cons_infos type_vars vars gen_sym gs + # (arg_exprs, cons_infos, gs=:{gs_heaps}) = build_args type_args cons_infos gs + with + build_args [] cons_infos gs = ([], cons_infos, gs) + build_args [t:ts] cons_infos gs + # (e, cons_infos, gs) = build_instance_expr t cons_infos type_vars vars gen_sym gs + # (es, cons_infos, gs) = build_args ts cons_infos gs + = ([e:es], cons_infos, gs) + + # (is_cons, gs) = is_cons_instance type_index gs + | supportConsInfo && is_cons + = build_cons_fun_app gen_sym arg_exprs cons_infos gs + + | otherwise + # (kind, gs) = get_kind_of_type_def type_index gs + = build_generic_app gen_sym kind arg_exprs cons_infos gs + + build_instance_expr1 (arg_type --> res_type) cons_infos type_vars vars gen_sym gs=:{gs_error} # gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) "arrow types are not yet supported" gs_error - = (EE, {gs & gs_error = gs_error}) - build_instance_expr1 (type_cons_var :@: type_args) type_vars vars gen_sym gs=:{gs_error} + = (EE, cons_infos, {gs & gs_error = gs_error}) + build_instance_expr1 (type_cons_var :@: type_args) cons_infos type_vars vars gen_sym gs=:{gs_error} # gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) "application of type constructor variable is not supported" gs_error - = (EE, {gs & gs_error = gs_error}) - build_instance_expr1 (TB basic_type) type_vars vars gen_sym gs - = build_generic_app gen_sym KindConst [] gs - build_instance_expr1 (TV type_var) type_vars vars gen_sym gs - = build_expr_for_type_var type_var type_vars vars gs - build_instance_expr1 (GTV type_var) type_vars vars gen_sym gs - = build_expr_for_type_var type_var type_vars vars gs - build_instance_expr1 (TQV type_var) type_vars vars gen_sym gs - = build_expr_for_type_var type_var type_vars vars gs - build_instance_expr1 _ type_vars vars gen_sym gs + = (EE, cons_infos, {gs & gs_error = gs_error}) + build_instance_expr1 (TB basic_type) cons_infos type_vars vars gen_sym gs + = build_generic_app gen_sym KindConst [] cons_infos gs + build_instance_expr1 (TV type_var) cons_infos type_vars vars gen_sym gs + = build_expr_for_type_var type_var type_vars vars cons_infos gs + build_instance_expr1 (GTV type_var) cons_infos type_vars vars gen_sym gs + = build_expr_for_type_var type_var type_vars vars cons_infos gs + build_instance_expr1 (TQV type_var) cons_infos type_vars vars gen_sym gs + = build_expr_for_type_var type_var type_vars vars cons_infos gs + build_instance_expr1 _ _ _ _ _ gs = abort "build_instance_expr1: type does not match\n" - build_expr_for_type_var type_var type_vars vars gs=:{gs_predefs, gs_heaps} + build_expr_for_type_var type_var type_vars vars cons_infos gs=:{gs_predefs, gs_heaps} # (var_expr, gs_heaps) = buildExprForTypeVar type_var type_vars vars gs_predefs gs_heaps - = (var_expr, {gs & gs_heaps = gs_heaps}) + = (var_expr, cons_infos, {gs & gs_heaps = gs_heaps}) - build_generic_app {glob_module, glob_object} kind arg_exprs gs=:{gs_heaps} + build_generic_app {glob_module, glob_object} kind arg_exprs cons_infos gs=:{gs_heaps} # (expr, gs_heaps) = buildGenericApp glob_module glob_object kind arg_exprs gs_heaps - = (expr, {gs & gs_heaps = gs_heaps}) + = (expr, cons_infos, {gs & gs_heaps = gs_heaps}) get_kind_of_type_def {glob_module, glob_object} gs=:{gs_td_infos} # (td_info, gs_td_infos) = gs_td_infos ! [glob_module, glob_object] @@ -2185,7 +2335,36 @@ where make_kind [] = KindConst make_kind ks = KindArrow (ks ++ [KindConst]) - + is_cons_instance {glob_module, glob_object} gs=:{gs_predefs} + # {pds_def, pds_module} = gs_predefs.[PD_TypeCONS] + = (pds_module == glob_module && pds_def == glob_object, gs) + + build_cons_fun_app + gen=:{glob_module, glob_object} + arg_exprs + [cons_info:cons_infos] + gs=:{ gs_heaps=gs_heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}}, + gs_main_dcl_module_n, + gs_modules, + gs_error} + + #! (generic_def=:{gen_name, gen_pos, gen_cons_ptr}, gs_modules) + = getGenericDef glob_module glob_object.ds_index gs_modules + #! (info, th_vars) = readPtr gen_cons_ptr th_vars + #! gs_heaps = { gs_heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars }} + + # (cons_info_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n cons_info [] gs_heaps + + #! (fun_def_sym, gs_error) = case info of + TVI_ConsInstance fun_def_sym + -> (fun_def_sym, gs_error) + TVI_Empty + -> (EmptyDefinedSymbol, reportError gen_name gen_pos "no CONS instance provided" gs_error) + + #! (app_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n fun_def_sym [cons_info_expr:arg_exprs] gs_heaps + = (app_expr, cons_infos, {gs & gs_heaps = gs_heaps, gs_modules = gs_modules, gs_error = gs_error}) + //---> ("build_cons_app", cons_info.ds_ident, fun_def_sym.ds_ident) + buildExprForTypeVar :: TypeVar [TypeVar] [FreeVar] !PredefinedSymbols !*Heaps -> (!Expression, !*Heaps) buildExprForTypeVar type_var type_vars vars predefs heaps @@ -2789,6 +2968,7 @@ buildFreeVar0 name heaps=:{hp_var_heap} # var = { fv_def_level = NotALevel, fv_count = 0, fv_info_ptr = var_info_ptr, fv_name = var_name} = (var, {heaps & hp_var_heap = hp_var_heap}) + buildFreeVars :: ![String] !*Heaps -> (![FreeVar], !*Heaps) buildFreeVars names heaps = mapSt buildFreeVar names heaps @@ -2810,6 +2990,177 @@ buildBoundVarExprs [free_var:free_vars] heaps = ([expr:exprs], [free_var:free_vars], heaps) +copyVar :: FreeVar !*Heaps -> (!FreeVar, !*Heaps) +copyVar var heaps=:{hp_var_heap} + # (var_info_ptr, hp_var_heap) = newPtr VI_Empty hp_var_heap + = ({var & fv_info_ptr = var_info_ptr}, {heaps & hp_var_heap = hp_var_heap}) + //---> ("copyVar", var, ptrToInt var_info_ptr) +copyVars vars heaps = mapSt copyVar vars heaps + +setVarInfo var=:{fv_info_ptr} var_info heaps=:{hp_var_heap} + # hp_var_heap = writePtr fv_info_ptr var_info hp_var_heap + = {heaps & hp_var_heap = hp_var_heap} +setVarInfos vars var_infos heaps + = fold2St setVarInfo vars var_infos heaps +clearVarInfos vars heaps + = setVarInfos vars (repeatn (length vars) VI_Empty) heaps + +copyExpr :: !Expression !*Heaps -> (!Expression, !*Heaps) +copyExpr expr heaps=:{hp_var_heap, hp_expression_heap} + #! state = + { us_var_heap = hp_var_heap + , us_symbol_heap = hp_expression_heap + , us_opt_type_heaps = No + , us_cleanup_info = [] + , us_local_macro_functions = No + } + #! info = + { ui_handle_aci_free_vars = LeaveThem + , ui_convert_module_n = -1 + , ui_conversion_table = No + } + #! (expr, {us_var_heap, us_symbol_heap}) = unfold expr info state + = (expr, {heaps & hp_var_heap = us_var_heap, hp_expression_heap = us_symbol_heap}) + //---> ("copy Expr") + +mapExprSt :: (Expression .st->(Expression, .st)) Expression .st -> (Expression, .st) +mapExprSt f (App app=:{app_args}) st + # (app_args, st) = mapSt (mapExprSt f) app_args st + = f (App { app & app_args = app_args }) st + +mapExprSt f (Let lad=:{let_lazy_binds, let_strict_binds, let_expr}) st + # (let_lazy_binds, st) = mapSt map_bind let_lazy_binds st + # (let_strict_binds, st) = mapSt map_bind let_strict_binds st + # (let_expr, st) = mapExprSt f let_expr st + # lad = + { lad + & let_expr = let_expr + , let_lazy_binds = let_lazy_binds + , let_strict_binds = let_strict_binds + } + = f (Let lad) st +where + map_bind b=:{lb_src} st + # (lb_src, st) = mapExprSt f lb_src st + = ({b & lb_src = lb_src}, st) + +mapExprSt f (Selection a expr b) st + # (expr, st) = mapExprSt f expr st + = f (Selection a expr b) st + +mapExprSt f (Update e1 x e2) st + # (e1, st) = mapExprSt f e1 st + # (e2, st) = mapExprSt f e2 st + = f (Update e1 x e2) st + +mapExprSt f (RecordUpdate x expr binds) st + # (expr, st) = mapExprSt f expr st + # (binds, st) = mapSt map_bind binds st + = f (RecordUpdate x expr binds) st +where + map_bind b=:{bind_src} st + # (bind_dst, st) = mapExprSt f bind_src st + = ({b & bind_src = bind_src}, st) + +mapExprSt f (TupleSelect x y expr) st + # (expr, st) = mapExprSt f expr st + = f (TupleSelect x y expr) st + +mapExprSt f (Conditional cond=:{if_cond, if_then, if_else}) st + # (if_cond, st) = mapExprSt f if_cond st + # (if_then, st) = mapExprSt f if_then st + # (if_else, st) = case if_else of + (Yes x) + # (x, st) = mapExprSt f x st + -> (Yes x, st) + No -> (No, st) + = f (Conditional {cond & if_cond = if_cond, if_then = if_then, if_else = if_else}) st + +mapExprSt f (MatchExpr x y expr) st + # (expr, st) = mapExprSt f expr st + = f (MatchExpr x y expr) st + +mapExprSt f (DynamicExpr dyn=:{dyn_expr}) st + # (dyn_expr, st) = mapExprSt f dyn_expr st + = f (DynamicExpr {dyn& dyn_expr = dyn_expr}) st + +mapExprSt f (Case c=:{case_expr, case_guards, case_default=case_default}) st + # (case_expr, st) = mapExprSt f case_expr st + # (case_guards, st) = map_patterns case_guards st + # (case_default, st) = case case_default of + (Yes x) + # (x, st) = mapExprSt f x st + -> (Yes x, st) + No -> (No, st) + # new_case = {c & case_expr=case_expr, case_guards=case_guards, case_default=case_default} + = f (Case new_case) st +where + map_patterns (AlgebraicPatterns index pats) st + # (pats, st) = mapSt map_alg_pattern pats st + = (AlgebraicPatterns index pats, st) + map_patterns (BasicPatterns bt pats) st + # (pats, st) = mapSt map_basic_pattern pats st + = (BasicPatterns bt pats, st) + map_patterns (DynamicPatterns pats) st + # (pats, st) = mapSt map_dyn_pattern pats st + = (DynamicPatterns pats, st) + + map_alg_pattern pat=:{ap_expr} st + # (ap_expr, st) = mapExprSt f ap_expr st + = ({pat & ap_expr = ap_expr}, st) + map_basic_pattern pat=:{bp_expr} st + # (bp_expr, st) = mapExprSt f bp_expr st + = ({pat & bp_expr = bp_expr}, st) + map_dyn_pattern pat=:{dp_rhs} st + # (dp_rhs, st) = mapExprSt f dp_rhs st + = ({pat & dp_rhs = dp_rhs}, st) + +mapExprSt f expr st = f expr st + + +copyFunDef :: !FunDef !Index !Index !*Heaps -> (!FunDef, !*Heaps) +copyFunDef fun_def=:{fun_symb,fun_arity,fun_body,fun_info} fun_index group_index gs_heaps + # (TransformedBody {tb_args, tb_rhs}) = fun_body + + #! (fresh_arg_vars, gs_heaps) = copy_vars tb_args gs_heaps + #! (copied_rhs, gs_heaps) = copyExpr tb_rhs gs_heaps + + #! (copied_rhs, fresh_arg_vars, fresh_local_vars, gs_heaps) = + collect_local_vars copied_rhs fresh_arg_vars gs_heaps + + #! gs_heaps = clearVarInfos tb_args gs_heaps + + #! fun_def = + { fun_def + & fun_index = fun_index + //, fun_symb = makeIdent "zzzzzzzzzzzz" + , fun_body = TransformedBody { tb_args = fresh_arg_vars, tb_rhs = copied_rhs } + , fun_info = + { fun_info + & fi_group_index = group_index + , fi_local_vars = fresh_local_vars + } + } + = (fun_def, gs_heaps) +where + copy_vars vars heaps + #! (fresh_vars, heaps) = copyVars vars heaps + #! infos = [VI_Variable fv_name fv_info_ptr\\ {fv_name,fv_info_ptr} <- fresh_vars] + #! heaps = setVarInfos vars infos heaps + = (fresh_vars, heaps) + + collect_local_vars body_expr fun_arg_vars heaps=:{hp_var_heap, hp_expression_heap} + #! cs = + { cos_error = {ea_file = stderr, ea_ok = True, ea_loc=[]} + , cos_var_heap = hp_var_heap + , cos_symbol_heap = hp_expression_heap + , cos_alias_dummy = {pds_ident=makeIdent "dummy", pds_module=NoIndex,pds_def=NoIndex} + } + #! (body_expr, fun_arg_vars, local_vars, {cos_symbol_heap, cos_var_heap}) = + determineVariablesAndRefCounts fun_arg_vars body_expr cs + #! heaps = { heaps & hp_var_heap = cos_var_heap, hp_expression_heap = cos_symbol_heap } + = (body_expr, fun_arg_vars, local_vars, heaps) + makeIdent :: String -> Ident makeIdent str = {id_name = str, id_info = nilPtr} @@ -2826,5 +3177,8 @@ transpose [] = [] transpose [[] : xss] = transpose xss transpose [[x:xs] : xss] = [[x : [hd l \\ l <- xss]] : transpose [xs : [ tl l \\ l <- xss]]] + +reportError name pos msg error + = checkErrorWithIdentPos (newPosition name pos) msg error -
\ No newline at end of file +
\ No newline at end of file diff --git a/frontend/parse.icl b/frontend/parse.icl index bdc3736..ec54a7c 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -1231,6 +1231,7 @@ wantGenericDefinition context pos pState , gen_kinds_ptr = nilPtr , gen_classes = [] , gen_isomap = MakeDefinedSymbol {id_name="",id_info=nilPtr} NoIndex 0 + , gen_cons_ptr = nilPtr } = (PD_Generic gen_def, pState) where diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index fc1476b..1a69cf7 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -270,6 +270,7 @@ cNameLocationDependent :== True , gen_type :: !GenericType , gen_pos :: !Position , gen_kinds_ptr :: !TypeVarInfoPtr // hack: contains all used kinds + , gen_cons_ptr :: !TypeVarInfoPtr // hack: cons instance function , gen_classes :: !GenericClassInfos // generated classes , gen_isomap :: !DefinedSymbol // isomap function } @@ -307,6 +308,7 @@ addGenericKind :: !GenericDef !TypeKind -> !GenericDef , ins_pos :: !Position , ins_is_generic :: !Bool //AA , ins_generate :: !Bool //AA + , ins_partial :: !Bool //AA , ins_generic :: !Global Index //AA } @@ -867,6 +869,7 @@ cNonRecursiveAppl :== False | TVI_TypeCode !TypeCodeExpression | TVI_CPSLocalTypeVar !Int /* MdM - the index of the variable as generated by the theorem prover */ | TVI_Kinds ![TypeKind] // AA: used to collect kinds during checking + | TVI_ConsInstance !DefinedSymbol //AA: generic cons instance function | TVI_Normalized !Int /* MV - position of type variable in its definition */ :: TypeVarInfoPtr :== Ptr TypeVarInfo @@ -1309,7 +1312,8 @@ ParsedInstanceToClassInstance pi members :== it_context = pi.pi_context }, ins_members = members, ins_specials = pi.pi_specials, ins_pos = pi.pi_pos, /*AA*/ ins_is_generic = False, - ins_generate = pi.pi_generate, + ins_generate = pi.pi_generate, + ins_partial = False, ins_generic = {glob_module = NoIndex, glob_object = NoIndex}} MakeTypeDef name lhs rhs attr contexts pos :== diff --git a/frontend/syntax.icl b/frontend/syntax.icl index 64c62b4..3b95cb9 100644 --- a/frontend/syntax.icl +++ b/frontend/syntax.icl @@ -260,6 +260,7 @@ cNameLocationDependent :== True , gen_type :: !GenericType , gen_pos :: !Position , gen_kinds_ptr :: !TypeVarInfoPtr // hack: contains all used kinds + , gen_cons_ptr :: !TypeVarInfoPtr // hack: cons instance function , gen_classes :: !GenericClassInfos // generated classes , gen_isomap :: !DefinedSymbol // isomap function } @@ -315,6 +316,7 @@ addGenericKind generic_def=:{gen_name, gen_classes} kind , ins_pos :: !Position , ins_is_generic :: !Bool //AA , ins_generate :: !Bool //AA + , ins_partial :: !Bool //AA , ins_generic :: !Global Index //AA } @@ -837,6 +839,7 @@ cNotVarNumber :== -1 | TVI_TypeCode !TypeCodeExpression | TVI_CPSLocalTypeVar !Int /* MdM - the index of the variable as generated by the theorem prover */ | TVI_Kinds ![TypeKind] // AA: used to collect kinds during checking + | TVI_ConsInstance !DefinedSymbol //AA: generic cons instance function | TVI_Normalized !Int /* MV - position of type variable in its definition */ :: TypeVarInfoPtr :== Ptr TypeVarInfo @@ -2093,7 +2096,8 @@ ParsedInstanceToClassInstance pi members :== it_context = pi.pi_context }, ins_members = members, ins_specials = pi.pi_specials, ins_pos = pi.pi_pos, /*AA*/ ins_is_generic = False, - ins_generate = pi.pi_generate, + ins_generate = pi.pi_generate, + ins_partial = False, ins_generic = {glob_module = NoIndex, glob_object = NoIndex}} MakeTypeDef name lhs rhs attr contexts pos :== diff --git a/frontend/transform.dcl b/frontend/transform.dcl index d8845ed..26cd02a 100644 --- a/frontend/transform.dcl +++ b/frontend/transform.dcl @@ -14,6 +14,19 @@ partitionateMacros :: !IndexRange !Index !PredefinedSymbol !*{# FunDef} !*{# Dcl :: CopiedLocalFunctions +// AA.. + +:: CollectState = + { cos_var_heap :: !.VarHeap + , cos_symbol_heap :: !.ExpressionHeap + , cos_error :: !.ErrorAdmin + , cos_alias_dummy :: !PredefinedSymbol + } + +determineVariablesAndRefCounts :: ![FreeVar] !Expression !*CollectState -> (!Expression , ![FreeVar], ![FreeVar], !*CollectState) + +// ..AA + :: UnfoldState = { us_var_heap :: !.VarHeap , us_symbol_heap :: !.ExpressionHeap @@ -31,5 +44,4 @@ partitionateMacros :: !IndexRange !Index !PredefinedSymbol !*{# FunDef} !*{# Dcl :: AciFreeVarHandleMode = LeaveThem | RemoveThem | SubstituteThem class unfold a :: !a !UnfoldInfo !*UnfoldState -> (!a, !*UnfoldState) - instance unfold Expression, CasePatterns diff --git a/frontend/transform.icl b/frontend/transform.icl index 8f34eb7..d4c5643 100644 --- a/frontend/transform.icl +++ b/frontend/transform.icl @@ -331,7 +331,6 @@ where unfold fv=:{fv_info_ptr,fv_name} ui us=:{us_var_heap} # (new_info_ptr, us_var_heap) = newPtr VI_Empty us_var_heap = ({ fv & fv_info_ptr = new_info_ptr }, { us & us_var_heap = writePtr fv_info_ptr (VI_Variable fv_name new_info_ptr) us_var_heap }) - instance unfold App where unfold app=:{app_symb={symb_kind}, app_args, app_info_ptr} ui=:{ui_convert_module_n,ui_conversion_table} us |