diff options
-rw-r--r-- | frontend/generics1.icl | 585 | ||||
-rw-r--r-- | frontend/syntax.dcl | 7 |
2 files changed, 408 insertions, 184 deletions
diff --git a/frontend/generics1.icl b/frontend/generics1.icl index 0c97b31..399a7e9 100644 --- a/frontend/generics1.icl +++ b/frontend/generics1.icl @@ -337,13 +337,13 @@ where # (expanded_type, th) = expandSynonymType type_def attr args heaps.hp_type_heaps -> convert {at_type = expanded_type, at_attribute = attr} (modules, td_infos, {heaps & hp_type_heaps = th}, error) - _ + _ #! {pds_module, pds_def} = predefs.[PD_UnboxedArrayType] | type_index.glob_module == pds_module && type_index.glob_object == pds_def && (case args of [{at_type=TB _}] -> True; _ -> False) -> (GTSAppCons KindConst [], (modules, td_infos, heaps, error)) - | otherwise + | otherwise #! ({tdi_kinds}, td_infos) = td_infos ! [type_index.glob_module,type_index.glob_object] #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds) #! (args, st) = mapSt convert args (modules, td_infos, heaps, error) @@ -373,29 +373,79 @@ where # error = reportError predefined_idents.[PD_GenericBimap] pos ("can not build generic representation for this type", type) error = (GTSE, (modules, td_infos, heaps, error)) - convert_type_app {type_index} attr args (modules, td_infos, heaps, error) - # (type_def, modules) = modules![type_index.glob_module].com_type_defs.[type_index.glob_object] + convert_type_app {type_index=type_index=:{glob_module,glob_object},type_arity} attr args (modules, td_infos, heaps, error) + # (type_def, modules) = modules![glob_module].com_type_defs.[glob_object] = case type_def.td_rhs of SynType atype - # (expanded_type, th) = expandSynonymType type_def attr args heaps.hp_type_heaps + # (expanded_type, th) = expandSynonymType type_def attr args heaps.hp_type_heaps -> convert {at_type = expanded_type, at_attribute = attr} (modules, td_infos, {heaps & hp_type_heaps = th}, error) - _ + AbstractType _ #! {pds_module, pds_def} = predefs.[PD_UnboxedArrayType] - | type_index.glob_module == pds_module && type_index.glob_object == pds_def + | glob_module == pds_module && glob_object == pds_def && (case args of [{at_type=TB _}] -> True; _ -> False) -> (GTSAppCons KindConst [], (modules, td_infos, heaps, error)) + RecordType _ # {pds_module, pds_def} = predefs.[PD_TypeBimap] - | type_index.glob_module == pds_module && type_index.glob_object == pds_def + | glob_module == pds_module && glob_object == pds_def && case args of [_,_] -> True; _ -> False - #! ({tdi_kinds}, td_infos) = td_infos ! [type_index.glob_module,type_index.glob_object] + #! (tdi_kinds,td_infos) = td_infos![glob_module,glob_object].tdi_kinds #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds) - #! (args, st) = mapSt convert args (modules, td_infos, heaps, error) + #! (args, st) = convert_args args (modules, td_infos, heaps, error) -> (GTSAppBimap kind args, st) - #! ({tdi_kinds}, td_infos) = td_infos ! [type_index.glob_module,type_index.glob_object] - #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds) - #! (args, st) = mapSt convert args (modules, td_infos, heaps, error) - -> (GTSAppCons kind args, st) + AlgType alts + # n_args = length args + | n_args>0 && type_arity==n_args + # (can_generate_bimap_to_or_from,modules,heaps) + = can_generate_bimap_to_or_from_for_this_type type_def glob_module alts modules heaps + | can_generate_bimap_to_or_from + #! (tdi_kinds,td_infos) = td_infos![glob_module,glob_object].tdi_kinds + #! (args, st) = convert_args args (modules, td_infos, heaps, error) + -> (GTSAppConsSimpleType type_index (KindArrow tdi_kinds) args, st) + -> convert_type_app_to_GTSAppCons glob_module glob_object args modules td_infos heaps error + _ + -> convert_type_app_to_GTSAppCons glob_module glob_object args modules td_infos heaps error + where + convert_type_app_to_GTSAppCons glob_module glob_object args modules td_infos heaps error + #! (tdi_kinds,td_infos) = td_infos![glob_module,glob_object].tdi_kinds + #! kind = if (isEmpty tdi_kinds) KindConst (KindArrow tdi_kinds) + #! (args, st) = convert_args args (modules, td_infos, heaps, error) + = (GTSAppCons kind args, st) + + can_generate_bimap_to_or_from_for_this_type :: !CheckedTypeDef !Index ![DefinedSymbol] !*Modules !*Heaps -> (!Bool,!*Modules,!*Heaps) + can_generate_bimap_to_or_from_for_this_type type_def=:{td_args} type_def_module_n alts modules heaps=:{hp_type_heaps} + # th_vars = number_type_arguments td_args 0 hp_type_heaps.th_vars + #! ok = check_constructors alts type_def_module_n modules th_vars + # th_vars = remove_type_argument_numbers td_args th_vars + # heaps = {heaps & hp_type_heaps={hp_type_heaps & th_vars=th_vars}} + = (ok,modules,heaps) + where + check_constructors :: ![DefinedSymbol] !Index !Modules !TypeVarHeap -> Bool + check_constructors [{ds_index}:constructors] type_def_module_n modules th_vars + # {cons_type,cons_exi_vars} = modules.[type_def_module_n].com_cons_defs.[ds_index] + = isEmpty cons_exi_vars && + isEmpty cons_type.st_context && + check_constructor cons_type.st_args 0 th_vars && + check_constructors constructors type_def_module_n modules th_vars + check_constructors [] type_def_module_n modules th_vars + = True + + check_constructor :: ![AType] !Int !TypeVarHeap -> Bool + check_constructor [{at_type=TV {tv_info_ptr}}:atypes] used_type_vars th_vars + = case sreadPtr tv_info_ptr th_vars of + TVI_GenTypeVarNumber arg_n + # arg_mask = 1<<arg_n + | used_type_vars bitand arg_mask<>0 + -> False + # used_type_vars = used_type_vars bitor arg_mask + -> check_constructor atypes used_type_vars th_vars + check_constructor [_:_] used_type_vars th_vars + = False + check_constructor [] used_type_vars th_vars + = True + + convert_args args st + = mapSt convert args st // the structure type of a generic type can often be simplified // because bimaps for types not containing generic variables are indentity bimaps @@ -416,6 +466,12 @@ where = (GTSAppConsBimapKindConst, st) # (args, st) = mapSt simplify args st = (GTSAppCons kind args, st) + simplify (GTSAppConsSimpleType type_symbol_n kind args) st + # contains_gen_vars = occurs_list args st + | not contains_gen_vars + = (GTSAppConsBimapKindConst, st) + # (args, st) = mapSt simplify args st + = (GTSAppConsSimpleType type_symbol_n kind args, st) simplify t=:(GTSAppBimap KindConst []) st = (t, st) simplify (GTSAppBimap kind=:(KindArrow kinds) args) st @@ -457,8 +513,9 @@ where = (GTSObject type_info_ds x, st) occurs (GTSAppCons _ args) st = occurs_list args st + occurs (GTSAppConsSimpleType _ _ args) st = occurs_list args st occurs (GTSAppBimap _ args) st = occurs_list args st - occurs (GTSAppVar tv args) st = occurs (GTSVar tv) st || occurs_list args st + occurs (GTSAppVar tv args) st = type_var_occurs tv st || occurs_list args st occurs (GTSVar tv) st = type_var_occurs tv st occurs (GTSArrow x y) st = occurs2 x y st occurs (GTSPair x y) st = occurs2 x y st @@ -486,7 +543,6 @@ where = case tv_info of TVI_Empty = writePtr tv_info_ptr TVI_Used th_vars _ = abort "type var is not empty" - ---> ("type var is not empty", tv, tv_info) clear_type_var {tv_info_ptr} th_vars = writePtr tv_info_ptr TVI_Empty th_vars @@ -503,7 +559,6 @@ buildStructType :: buildStructType {gi_module,gi_index} type_info cons_infos predefs (modules, td_infos, heaps, error) # (type_def=:{td_ident}, modules) = modules![gi_module].com_type_defs.[gi_index] = build_type type_def type_info cons_infos (modules, td_infos, heaps, error) - //---> ("buildStructureType", td_ident, atype) where build_type {td_rhs=AlgType alts, td_ident, td_pos} type_info cons_infos st # (cons_args, st) = zipWithSt (build_alt td_ident td_pos) alts cons_infos st @@ -634,7 +689,7 @@ buildTypeDefInfo1 td_module {td_ident, td_pos, td_arity} alts fields main_module # (type_def_dsc_fun, heaps) = build_type_def_dsc group_index cons_dsc_dss type_def_dsc_ds heaps # (cons_dsc_funs, (modules, heaps)) = zipWithSt (build_cons_dsc group_index type_def_dsc_ds field_dsc_dss) cons_dsc_dss alts (modules, heaps) - + # (field_dsc_funs, (modules, heaps)) = zipWithSt (build_field_dsc group_index (hd cons_dsc_dss)) field_dsc_dss fields (modules, heaps) // NOTE: reverse order (new functions are added at the head) @@ -658,7 +713,7 @@ buildTypeDefInfo1 td_module {td_ident, td_pos, td_arity} alts fields main_module = (type_info_ds, cons_infos, funs_and_groups, modules, heaps, error) where - build_type_def_dsc group_index cons_info_dss {ds_ident} heaps + build_type_def_dsc group_index cons_info_dss {ds_ident} heaps # td_name_expr = makeStringExpr td_ident.id_name # td_arity_expr = makeIntExpr td_arity # num_conses_expr = makeIntExpr (length alts) @@ -869,7 +924,7 @@ buildConversionIso type_def=:{td_ident, td_pos} from_fun to_fun build_bimap_record to_expr from_expr predefs heaps = buildPredefConsApp PD_ConsBimap [to_expr, from_expr] predefs heaps - + // conversion from type to generic buildConversionTo :: !Index // type def module @@ -891,11 +946,9 @@ buildConversionTo # (def_sym, funs_and_groups) = (buildFunAndGroup fun_name [] EE No main_module_index td_pos funs_and_groups) = (def_sym, funs_and_groups, heaps, error) - //---> ("buildConversionTo failed", td_ident) # (def_sym, funs_and_groups) = (buildFunAndGroup fun_name [arg_var] body_expr No main_module_index td_pos funs_and_groups) = (def_sym, funs_and_groups, heaps, error) - //---> ("buildConversionTo", td_ident, let (_,_,fs,_) = funs_and_groups in hd fs) where // build conversion for type rhs build_expr_for_type_rhs :: @@ -907,8 +960,7 @@ where !*ErrorAdmin -> ( !Expression // generated expression , !*Heaps // state - , !*ErrorAdmin - ) + , !*ErrorAdmin) build_expr_for_type_rhs type_def_mod type_def_index (AlgType def_symbols) arg_expr heaps error = build_expr_for_conses False type_def_mod type_def_index def_symbols arg_expr heaps error build_expr_for_type_rhs type_def_mod type_def_index (RecordType {rt_constructor}) arg_expr heaps error @@ -919,25 +971,25 @@ where build_expr_for_type_rhs type_def_mod type_def_index (SynType _) arg_expr heaps error #! error = checkErrorWithIdentPos (newPosition td_ident td_pos) "cannot build isomorphisms for a synonym type" error = (EE, heaps, error) - + // build conversion for constructors of a type def build_expr_for_conses is_record type_def_mod type_def_index cons_def_syms arg_expr heaps error - # (case_alts, heaps, error) = - build_exprs_for_conses is_record 0 (length cons_def_syms) type_def_mod cons_def_syms heaps error + # (case_alts, heaps, error) + = build_exprs_for_conses is_record 0 (length cons_def_syms) type_def_mod cons_def_syms heaps error # case_patterns = AlgebraicPatterns {glob_module = type_def_mod, glob_object = type_def_index} case_alts # (case_expr, heaps) = buildCaseExpr arg_expr case_patterns heaps = (case_expr, heaps, error) - //---> (free_vars, case_expr) - + // build conversions for constructors build_exprs_for_conses :: !Bool !Int !Int !Int ![DefinedSymbol] !*Heaps !*ErrorAdmin -> ([AlgebraicPattern], !*Heaps, !*ErrorAdmin) - build_exprs_for_conses is_record i n type_def_mod [] heaps error = ([], heaps, error) + build_exprs_for_conses is_record i n type_def_mod [] heaps error + = ([], heaps, error) build_exprs_for_conses is_record i n type_def_mod [cons_def_sym:cons_def_syms] heaps error #! (alt, heaps, error) = build_expr_for_cons is_record i n type_def_mod cons_def_sym heaps error #! (alts, heaps, error) = build_exprs_for_conses is_record (i+1) n type_def_mod cons_def_syms heaps error = ([alt:alts], heaps, error) - + // build conversion for a constructor build_expr_for_cons :: !Bool !Int !Int !Int !DefinedSymbol !*Heaps !*ErrorAdmin -> (AlgebraicPattern, !*Heaps, !*ErrorAdmin) @@ -1006,23 +1058,18 @@ buildConversionFrom # (def_sym, funs_and_groups) = (buildFunAndGroup fun_name [] EE No main_module_index td_pos funs_and_groups) = (def_sym, funs_and_groups, heaps, error) - //---> ("buildConversionFrom failed", td_ident) # (def_sym, funs_and_groups) = (buildFunAndGroup fun_name [arg_var] body_expr No main_module_index td_pos funs_and_groups) = (def_sym, funs_and_groups, heaps, error) - //---> ("buildConversionFrom", td_ident, let (_,_,fs,_) = funs_and_groups in hd fs) where // build expression for type def rhs build_expr_for_type_rhs :: !Index // type def module !TypeRhs // type rhs - !*Heaps - !*ErrorAdmin + !*Heaps !*ErrorAdmin -> ( !Expression // body expresssion , !FreeVar - , !*Heaps - , !*ErrorAdmin - ) + , !*Heaps, !*ErrorAdmin) build_expr_for_type_rhs type_def_mod (AlgType def_symbols) heaps error #! (expr, var, heaps, error) = build_sum False type_def_mod def_symbols heaps error #! (expr, var, heaps) = build_case_object var expr predefs heaps @@ -1031,7 +1078,6 @@ where # (expr, var, heaps, error) = build_sum True type_def_mod [rt_constructor] heaps error #! (expr, var, heaps) = build_case_object var expr predefs heaps = (expr, var, heaps, error) - build_expr_for_type_rhs type_def_mod (AbstractType _) heaps error #! error = reportError td_ident td_pos "cannot build isomorphisms for an abstract type" error # dummy_fv = {fv_def_level=(-1), fv_count=0, fv_ident=makeIdent "dummy", fv_info_ptr=nilPtr} @@ -1961,7 +2007,7 @@ buildGenericCaseBody :: !FunsAndGroups !*TypeDefInfos !*{#CommonDefs} !*Heaps !*ErrorAdmin -> (!FunctionBody, !FunsAndGroups, !*TypeDefInfos,!*{#CommonDefs},!*Heaps,!*ErrorAdmin) -buildGenericCaseBody main_module_index gc=:{gc_type_cons=TypeConsSymb {type_ident,type_index},gc_kind,gc_generic} has_generic_info st predefs +buildGenericCaseBody main_module_index gc=:{gc_type_cons=TypeConsSymb {type_ident,type_index},gc_kind,gc_generic,gc_ident,gc_pos} has_generic_info st predefs funs_and_groups td_infos modules heaps error #! (gen_def, modules) = modules![gc_generic.gi_module].com_generic_defs.[gc_generic.gi_index] #! (td_info=:{tdi_gen_rep}, td_infos) = td_infos![type_index.glob_module,type_index.glob_object] @@ -1982,13 +2028,12 @@ buildGenericCaseBody main_module_index gc=:{gc_type_cons=TypeConsSymb {type_iden False -> (arg_vars,heaps) - #! (optional_adaptor_expr, adapted_arg_exprs, original_arg_exprs, funs_and_groups, modules, td_infos, heaps, error) - = build_adaptor_expr gc gen_def gen_type_rep original_arg_exprs funs_and_groups modules td_infos heaps error - #! (specialized_expr, funs_and_groups, td_infos, heaps, error) - = build_specialized_expr gc gtr_type td_args generated_arg_exprs gen_def.gen_info_ptr funs_and_groups td_infos heaps error + = build_specialized_expr gc_pos gc_ident gc_generic gtr_type td_args generated_arg_exprs gen_def.gen_info_ptr funs_and_groups td_infos heaps error + + #! (body_expr, funs_and_groups, modules, td_infos, heaps, error) + = adapt_specialized_expr gc_pos gen_def gen_type_rep original_arg_exprs specialized_expr funs_and_groups modules td_infos heaps error - # body_expr = build_body_expr optional_adaptor_expr specialized_expr adapted_arg_exprs original_arg_exprs = (TransformedBody {tb_args=arg_vars, tb_rhs=body_expr}, funs_and_groups, td_infos, modules, heaps, error) where build_generic_info_arg heaps=:{hp_var_heap} @@ -2008,9 +2053,33 @@ where heaps = (generated_arg_exprs, original_arg_exprs, generated_arg_vars ++ original_arg_vars, heaps) + // generic function specialized to the generic representation of the type + build_specialized_expr gc_pos gc_ident gcf_generic gtr_type td_args generated_arg_exprs gen_info_ptr funs_and_groups td_infos heaps error + #! spec_env = [(atv_variable, TVI_Expr expr) \\ {atv_variable} <- td_args & expr <- generated_arg_exprs] + # generic_bimap = predefs.[PD_GenericBimap] + | gcf_generic.gi_module==generic_bimap.pds_module && gcf_generic.gi_index==generic_bimap.pds_def + + // JvG: can probably make special version of simplify_bimap_GenTypeStruct that doesn't simplify if any var occurs, because all vars are passed + # (gtr_type, heaps) = simplify_bimap_GenTypeStruct [atv_variable \\ {atv_variable} <- td_args] gtr_type heaps + + # (expr,funs_and_groups,heaps,error) + = specialize_generic_bimap gcf_generic gtr_type spec_env gc_ident gc_pos main_module_index predefs funs_and_groups heaps error + = (expr,funs_and_groups,td_infos,heaps,error) + + # ({gen_OBJECT_CONS_FIELD_indices},generic_heap) = readPtr gen_info_ptr heaps.hp_generic_heap + heaps = {heaps & hp_generic_heap=generic_heap} + + # (expr,td_infos,heaps,error) + = specializeGeneric gcf_generic gtr_type spec_env gc_ident gc_pos gen_OBJECT_CONS_FIELD_indices main_module_index td_infos heaps error + = (expr,funs_and_groups,td_infos,heaps,error) + // adaptor that converts a function for the generic representation into a // function for the type itself - build_adaptor_expr {gc_pos} {gen_type, gen_vars, gen_info_ptr} {gtr_iso,gtr_to,gtr_from} original_arg_exprs funs_and_groups modules td_infos heaps error + adapt_specialized_expr :: Position GenericDef GenericTypeRep [Expression] Expression + !FunsAndGroups !*Modules !*TypeDefInfos !*Heaps !*ErrorAdmin + -> (!Expression,!FunsAndGroups,!*Modules,!*TypeDefInfos,!*Heaps,!*ErrorAdmin) + adapt_specialized_expr gc_pos {gen_type, gen_vars, gen_info_ptr} {gtr_iso,gtr_to,gtr_from} original_arg_exprs specialized_expr + funs_and_groups modules td_infos heaps error #! (var_kinds, heaps) = get_var_kinds gen_info_ptr heaps #! non_gen_var_kinds = drop (length gen_vars) var_kinds @@ -2028,11 +2097,11 @@ where #! (struct_gen_type, heaps) = simplify_bimap_GenTypeStruct gen_vars struct_gen_type heaps # bimap_gi = {gi_module=bimap_module,gi_index=bimap_index} - #! (adaptor_expr, adapted_arg_exprs, original_arg_exprs, funs_and_groups, heaps, error) - = specialize_generic_from_bimap bimap_gi struct_gen_type spec_env bimap_ident gc_pos original_arg_exprs main_module_index predefs - funs_and_groups heaps error + #! (body_expr, funs_and_groups, modules, heaps, error) + = adapt_with_specialized_generic_bimap bimap_gi struct_gen_type spec_env bimap_ident gc_pos original_arg_exprs specialized_expr main_module_index predefs + funs_and_groups modules heaps error - = (adaptor_expr, adapted_arg_exprs, original_arg_exprs, funs_and_groups, modules, td_infos, heaps, error) + = (body_expr, funs_and_groups, modules, td_infos, heaps, error) where {pds_module = bimap_module, pds_def=bimap_index} = predefs.[PD_GenericBimap] bimap_ident = predefined_idents.[PD_GenericBimap] @@ -2065,46 +2134,6 @@ where = buildGenericApp bimap_module bimap_index bimap_ident kind [] heaps = ((non_gen_var, TVI_Expr expr), funs_and_groups, heaps) - // generic function specialzied to the generic representation of the type - build_specialized_expr :: GenericCaseDef GenTypeStruct [ATypeVar] [Expression] GenericInfoPtr !FunsAndGroups !*TypeDefInfos !*Heaps !*ErrorAdmin - -> (!Expression,!FunsAndGroups,!*TypeDefInfos,!*Heaps,!*ErrorAdmin) - build_specialized_expr {gc_ident, gc_pos, gc_generic} gtr_type td_args generated_arg_exprs gen_info_ptr funs_and_groups td_infos heaps error - #! spec_env = [(atv_variable, TVI_Expr expr) \\ {atv_variable} <- td_args & expr <- generated_arg_exprs] - # generic_bimap = predefs.[PD_GenericBimap] - | gc_generic.gi_module==generic_bimap.pds_module && gc_generic.gi_index==generic_bimap.pds_def - - // can probably make special version of simplify_bimap_GenTypeStruct that doesn't simplify if a var occurs, because all vars are passed - # (gtr_type, heaps) = simplify_bimap_GenTypeStruct [atv_variable \\ {atv_variable} <- td_args] gtr_type heaps - - # (expr,funs_and_groups,heaps,error) - = specialize_generic_bimap gc_generic gtr_type spec_env gc_ident gc_pos main_module_index predefs funs_and_groups heaps error - = (expr,funs_and_groups,td_infos,heaps,error) - - # ({gen_OBJECT_CONS_FIELD_indices},generic_heap) = readPtr gen_info_ptr heaps.hp_generic_heap - heaps = {heaps & hp_generic_heap=generic_heap} - - # (expr,td_infos,heaps,error) - = specializeGeneric gc_generic gtr_type spec_env gc_ident gc_pos gen_OBJECT_CONS_FIELD_indices main_module_index td_infos heaps error - = (expr,funs_and_groups,td_infos,heaps,error) - - // the body expression - build_body_expr No specialized_expr [] [] - = specialized_expr - build_body_expr No specialized_expr [] original_arg_exprs - = specialized_expr @ original_arg_exprs - build_body_expr No specialized_expr adapted_arg_exprs [] - = specialized_expr @ adapted_arg_exprs - build_body_expr No specialized_expr adapted_arg_exprs original_arg_exprs - = specialized_expr @ (adapted_arg_exprs++original_arg_exprs) - build_body_expr (Yes adaptor_expr) specialized_expr [] [] - = adaptor_expr @ [specialized_expr] - build_body_expr (Yes adaptor_expr) specialized_expr [] original_arg_exprs - = (adaptor_expr @ [specialized_expr]) @ original_arg_exprs - build_body_expr (Yes adaptor_expr) specialized_expr adapted_arg_exprs [] - = adaptor_expr @ [specialized_expr @ adapted_arg_exprs] - build_body_expr (Yes adaptor_expr) specialized_expr adapted_arg_exprs original_arg_exprs - = (adaptor_expr @ [specialized_expr @ adapted_arg_exprs]) @ original_arg_exprs - buildGenericCaseBody main_module_index {gc_ident,gc_pos} has_generic_info st predefs funs_and_groups td_infos modules heaps error # error = reportError gc_ident gc_pos "cannot specialize to this type" error = (TransformedBody {tb_args=[], tb_rhs=EE}, funs_and_groups, td_infos, modules, heaps, error) @@ -2466,44 +2495,101 @@ is_bimap_id (GTSAppCons KindConst []) = True is_bimap_id GTSAppConsBimapKindConst = True is_bimap_id _ = False -specialize_generic_from_bimap :: +adapt_with_specialized_generic_bimap :: !GlobalIndex // generic index !GenTypeStruct // type to specialize to ![(TypeVar, TypeVarInfo)] // specialization environment !Ident // generic/generic case !Position // of generic case ![Expression] + !Expression !Index // main_module index !PredefinedSymbols - !FunsAndGroups !*Heaps !*ErrorAdmin - -> (!Optional Expression, ![Expression], ![Expression], - !FunsAndGroups,!*Heaps,!*ErrorAdmin) -specialize_generic_from_bimap gen_index type spec_env gen_ident gen_pos arg_exprs main_module_index predefs funs_and_groups heaps error + !FunsAndGroups !*Modules !*Heaps !*ErrorAdmin + -> (!Expression, + !FunsAndGroups,!*Modules,!*Heaps,!*ErrorAdmin) +adapt_with_specialized_generic_bimap gen_index type spec_env gen_ident gen_pos arg_exprs specialized_expr main_module_index predefs + funs_and_groups modules heaps error #! heaps = set_tvs spec_env heaps - #! (optional_adaptor_expr, adapted_arg_exprs, arg_exprs, (funs_and_groups, heaps, error)) - = specialize_args_and_result arg_exprs type (funs_and_groups, heaps, error) + #! (adapted_arg_exprs, arg_exprs, type, st) + = adapt_args arg_exprs type (funs_and_groups, modules, heaps, error) + #! (body_expr, (funs_and_groups, modules, heaps, error)) + = adapt_result arg_exprs type specialized_expr adapted_arg_exprs st # heaps = clear_tvs spec_env heaps - = (optional_adaptor_expr, adapted_arg_exprs, arg_exprs, funs_and_groups, heaps, error) + = (body_expr, funs_and_groups, modules, heaps, error) where - specialize_args_and_result [arg_expr:arg_exprs] (GTSArrow arg_type args_type) st + adapt_args [arg_expr:arg_exprs] (GTSArrow arg_type args_type) st # (adapted_arg_expr,st) = adapt_arg arg_type arg_expr st - (adaptor_expr,adapted_arg_exprs,arg_exprs,st) - = specialize_args_and_result arg_exprs args_type st - = (adaptor_expr,[adapted_arg_expr:adapted_arg_exprs],arg_exprs,st) - specialize_args_and_result arg_exprs type st - | is_bimap_id type - = (No, [], arg_exprs, st) - # (adaptor_expr,st) - = specialize_from type st - = (Yes adaptor_expr,[],arg_exprs,st) + (adapted_arg_exprs,arg_exprs,args_type,st) + = adapt_args arg_exprs args_type st + = ([adapted_arg_expr:adapted_arg_exprs],arg_exprs,args_type,st) + adapt_args arg_exprs args_type st + = ([],arg_exprs,args_type,st) adapt_arg arg_type arg_expr st | is_bimap_id arg_type = (arg_expr,st) - # (arg_adaptor_expr,st) - = specialize_to arg_type st - = (arg_adaptor_expr @ [arg_expr],st) + = specialize_to_with_arg arg_type arg_expr st + + adapt_result arg_exprs type specialized_expr adapted_arg_exprs st + | is_bimap_id type + = (build_body_expr specialized_expr adapted_arg_exprs arg_exprs,st) + with + build_body_expr specialized_expr [] [] + = specialized_expr + build_body_expr specialized_expr [] original_arg_exprs + = specialized_expr @ original_arg_exprs + build_body_expr specialized_expr adapted_arg_exprs [] + = specialized_expr @ adapted_arg_exprs + build_body_expr specialized_expr adapted_arg_exprs original_arg_exprs + = specialized_expr @ (adapted_arg_exprs++original_arg_exprs) + + #! specialized_expr_with_adapted_args + = case adapted_arg_exprs of + [] -> specialized_expr + _ -> specialized_expr @ adapted_arg_exprs + = case arg_exprs of + [] + -> specialize_from_with_arg type specialized_expr_with_adapted_args st + _ + # (adapted_expr,st) + = specialize_from_with_arg type specialized_expr_with_adapted_args st + -> (adapted_expr @ arg_exprs, st) + + specialize_to_with_arg (GTSVar tv=:{tv_info_ptr}) arg (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + # (expr, th_vars) = readPtr tv_info_ptr th_vars + # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} + = case expr of + TVI_Expr expr + # expr = build_map_to_expr expr predefs @ [arg] + -> (expr, (funs_and_groups, modules, heaps, error)) + TVI_Iso iso_ds to_ds from_ds + # (expr,heaps) = buildFunApp main_module_index to_ds [arg] heaps + -> (expr, (funs_and_groups, modules, heaps, error)) + specialize_to_with_arg (GTSAppConsSimpleType type_symbol_n kind arg_types) arg st + = bimap_to_simple_type type_symbol_n kind arg_types arg st + specialize_to_with_arg type arg st + # (adaptor_expr,st) + = specialize_to type st + = (adaptor_expr @ [arg],st) + + specialize_from_with_arg (GTSVar tv=:{tv_info_ptr}) arg (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + # (expr, th_vars) = readPtr tv_info_ptr th_vars + # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} + = case expr of + TVI_Expr expr + # expr = build_map_from_expr expr predefs @ [arg] + -> (expr, (funs_and_groups, modules, heaps, error)) + TVI_Iso iso_ds to_ds from_ds + # (expr,heaps) = buildFunApp main_module_index from_ds [arg] heaps + -> (expr, (funs_and_groups, modules, heaps, error)) + specialize_from_with_arg (GTSAppConsSimpleType type_symbol_n kind arg_types) arg st + = bimap_from_simple_type type_symbol_n kind arg_types arg st + specialize_from_with_arg type arg st + # (adaptor_expr,st) + = specialize_from type st + = (adaptor_expr @ [arg],st) specialize_from (GTSArrow (GTSAppCons KindConst []) y) st = specialize_from_arrow_arg_id y st @@ -2513,7 +2599,7 @@ where = specialize_from_arrow_res_id x st specialize_from (GTSArrow x GTSAppConsBimapKindConst) st = specialize_from_arrow_res_id x st - specialize_from (GTSArrow (GTSVar {tv_info_ptr=xp}) (GTSVar {tv_info_ptr=yp})) (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + specialize_from (GTSArrow (GTSVar {tv_info_ptr=xp}) (GTSVar {tv_info_ptr=yp})) (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) # (x_expr, th_vars) = readPtr xp th_vars (y_expr, th_vars) = readPtr yp th_vars heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} @@ -2521,115 +2607,123 @@ where # (y,heaps) = build_map_from_tvi_expr y_expr main_module_index predefs heaps (expr, funs_and_groups, heaps) = bimap_from_arrow_arg_id_expression [y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) | is_bimap_id_expression y_expr main_module_index funs_and_groups # (x,heaps) = build_map_to_tvi_expr x_expr main_module_index predefs heaps (expr, funs_and_groups, heaps) = bimap_from_arrow_res_id_expression [x] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) # (x,heaps) = build_map_to_tvi_expr x_expr main_module_index predefs heaps (y,heaps) = build_map_from_tvi_expr y_expr main_module_index predefs heaps (expr, funs_and_groups, heaps) = bimap_from_arrow_expression [x,y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) - specialize_from (GTSArrow (GTSVar {tv_info_ptr}) y) (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize_from (GTSArrow (GTSVar {tv_info_ptr}) y) (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) #! (expr, th_vars) = readPtr tv_info_ptr th_vars # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} | is_bimap_id_expression expr main_module_index funs_and_groups - # st = (funs_and_groups, heaps, error) + # st = (funs_and_groups, modules, heaps, error) = specialize_from_arrow_arg_id y st # (x,heaps) = build_map_to_tvi_expr expr main_module_index predefs heaps - (y, (funs_and_groups, heaps, error)) = specialize_from y (funs_and_groups, heaps, error) + (y, (funs_and_groups, modules, heaps, error)) + = specialize_from y (funs_and_groups, modules, heaps, error) (expr, funs_and_groups, heaps) = bimap_from_arrow_expression [x,y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) - specialize_from (GTSArrow x (GTSVar {tv_info_ptr})) (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize_from (GTSArrow x (GTSVar {tv_info_ptr})) (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) #! (expr, th_vars) = readPtr tv_info_ptr th_vars # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} | is_bimap_id_expression expr main_module_index funs_and_groups - # st = (funs_and_groups, heaps, error) + # st = (funs_and_groups, modules, heaps, error) = specialize_from_arrow_res_id x st # (y,heaps) = build_map_from_tvi_expr expr main_module_index predefs heaps - (x, (funs_and_groups, heaps, error)) = specialize_to x (funs_and_groups, heaps, error) + (x, (funs_and_groups, modules, heaps, error)) + = specialize_to x (funs_and_groups, modules, heaps, error) (expr, funs_and_groups, heaps) = bimap_from_arrow_expression [x,y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) specialize_from (GTSArrow x y) st #! (x, st) = specialize_to x st #! (y, st) = specialize_from y st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_from_arrow_expression [x,y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) - specialize_from (GTSVar tv=:{tv_info_ptr}) (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize_from (GTSVar tv=:{tv_info_ptr}) (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) # (expr, th_vars) = readPtr tv_info_ptr th_vars # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} = case expr of TVI_Expr expr # from_expr = build_map_from_expr expr predefs - -> (from_expr, (funs_and_groups, heaps, error)) + -> (from_expr, (funs_and_groups, modules, heaps, error)) TVI_Iso iso_ds to_ds from_ds # (expr,heaps) = buildFunApp main_module_index from_ds [] heaps - -> (expr, (funs_and_groups, heaps, error)) + -> (expr, (funs_and_groups, modules, heaps, error)) specialize_from type=:(GTSAppBimap (KindArrow [KindConst,KindConst]) [arg1,arg2]) st # (arg1,st) = specialize arg1 st (arg2,st) = specialize arg2 st - (funs_and_groups, heaps, error) = st + (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_from_Bimap_expression [arg1,arg2] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) - specialize_from type (funs_and_groups, heaps, error) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize_from type (funs_and_groups, modules, heaps, error) #! (bimap_expr, st) - = specialize type (funs_and_groups, heaps, error) + = specialize type (funs_and_groups, modules, heaps, error) # adaptor_expr = build_map_from_expr bimap_expr predefs = (adaptor_expr, st) specialize_from_arrow_arg_id y st #! (y, st) = specialize_from y st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_from_arrow_arg_id_expression [y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) specialize_from_arrow_res_id x st #! (x, st) = specialize_to x st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_from_arrow_res_id_expression [x] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) - specialize_to (GTSVar tv=:{tv_info_ptr}) (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + specialize_to (GTSVar tv=:{tv_info_ptr}) (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) # (expr, th_vars) = readPtr tv_info_ptr th_vars # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} = case expr of TVI_Expr expr # from_expr = build_map_to_expr expr predefs - -> (from_expr, (funs_and_groups, heaps, error)) + -> (from_expr, (funs_and_groups, modules, heaps, error)) TVI_Iso iso_ds to_ds from_ds # (expr,heaps) = buildFunApp main_module_index to_ds [] heaps - -> (expr, (funs_and_groups, heaps, error)) - specialize_to type (funs_and_groups, heaps, error) + -> (expr, (funs_and_groups, modules, heaps, error)) + specialize_to type (funs_and_groups, modules, heaps, error) #! (bimap_expr, st) - = specialize type (funs_and_groups, heaps, error) + = specialize type (funs_and_groups, modules, heaps, error) # adaptor_expr = build_map_to_expr bimap_expr predefs = (adaptor_expr, st) - specialize (GTSAppCons KindConst []) (funs_and_groups, heaps, error) + specialize (GTSAppCons KindConst []) (funs_and_groups, modules, heaps, error) # (expr, funs_and_groups, heaps) = bimap_id_expression main_module_index predefs funs_and_groups heaps - = (expr ,(funs_and_groups, heaps, error)) + = (expr ,(funs_and_groups, modules, heaps, error)) specialize (GTSAppCons kind arg_types) st #! (arg_exprs, st) = mapSt specialize arg_types st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, heaps) = build_generic_app kind arg_exprs gen_index gen_ident heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize (GTSAppConsSimpleType _ kind arg_types) st + #! (arg_exprs, st) = mapSt specialize arg_types st + # (funs_and_groups, modules, heaps, error) = st + (expr, heaps) + = build_generic_app kind arg_exprs gen_index gen_ident heaps + = (expr, (funs_and_groups, modules, heaps, error)) specialize (GTSAppBimap kind arg_types) st #! (arg_exprs, st) = mapSt specialize arg_types st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, heaps) = build_generic_app kind arg_exprs gen_index gen_ident heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) specialize (GTSAppVar tv arg_types) st #! (arg_exprs, st) = mapSt specialize arg_types st #! (expr, st) = specialize_type_var tv st @@ -2639,43 +2733,172 @@ where specialize (GTSArrow x y) st | is_bimap_id x #! (y, st) = specialize y st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_arrow_arg_id_expression [y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) | is_bimap_id y #! (x, st) = specialize x st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_arrow_res_id_expression [x] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) + = (expr, (funs_and_groups, modules, heaps, error)) #! (x, st) = specialize x st #! (y, st) = specialize y st - # (funs_and_groups, heaps, error) = st + # (funs_and_groups, modules, heaps, error) = st (expr, funs_and_groups, heaps) = bimap_arrow_expression [x,y] main_module_index predefs funs_and_groups heaps - = (expr, (funs_and_groups, heaps, error)) - specialize GTSAppConsBimapKindConst (funs_and_groups, heaps, error) + = (expr, (funs_and_groups, modules, heaps, error)) + specialize GTSAppConsBimapKindConst (funs_and_groups, modules, heaps, error) # (expr, funs_and_groups, heaps) = bimap_id_expression main_module_index predefs funs_and_groups heaps - = (expr ,(funs_and_groups, heaps, error)) - specialize type (funs_and_groups, heaps, error) + = (expr ,(funs_and_groups, modules, heaps, error)) + specialize type (funs_and_groups, modules, heaps, error) #! error = reportError gen_ident gen_pos "cannot specialize " error - = (EE, (funs_and_groups, heaps, error)) + = (EE, (funs_and_groups, modules, heaps, error)) - specialize_type_var tv=:{tv_info_ptr} (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error) + specialize_type_var tv=:{tv_info_ptr} (funs_and_groups, modules, heaps=:{hp_type_heaps=th=:{th_vars}}, error) # (expr, th_vars) = readPtr tv_info_ptr th_vars # heaps = {heaps & hp_type_heaps = {th & th_vars = th_vars}} = case expr of TVI_Expr expr - -> (expr, (funs_and_groups, heaps, error)) + -> (expr, (funs_and_groups, modules, heaps, error)) TVI_Iso iso_ds to_ds from_ds # (expr,heaps) = buildFunApp main_module_index iso_ds [] heaps - -> (expr, (funs_and_groups, heaps, error)) + -> (expr, (funs_and_groups, modules, heaps, error)) build_generic_app kind arg_exprs gen_index gen_ident heaps = buildGenericApp gen_index.gi_module gen_index.gi_index gen_ident kind arg_exprs heaps + bimap_to_simple_type :: !(Global Index) !TypeKind ![GenTypeStruct] !Expression !*(!FunsAndGroups,!*{#CommonDefs},!*Heaps,!*ErrorAdmin) + -> *(!Expression,!*(!FunsAndGroups,!*{#CommonDefs},!*Heaps,!*ErrorAdmin)) + bimap_to_simple_type global_type_def_index=:{glob_module} (KindArrow kinds) arg_types arg (funs_and_groups,modules,heaps,error) + # (alts,constructors_arg_types,modules,heaps) + = determine_constructors_arg_types global_type_def_index arg_types modules heaps + # (alg_patterns,funs_and_groups,modules,heaps,error) + = build_to_alg_patterns alts constructors_arg_types glob_module funs_and_groups modules heaps error + = build_bimap_case global_type_def_index arg alg_patterns funs_and_groups modules heaps error + where + build_to_alg_patterns [cons_ds=:{ds_ident,ds_index,ds_arity}:alts] [constructor_arg_types:constructors_arg_types] type_module_n funs_and_groups modules heaps error + # arg_names = ["x" +++ toString k \\ k <- [1..ds_arity]] + # (var_exprs, vars, heaps) = buildVarExprs arg_names heaps + # (args,(funs_and_groups,modules,heaps,error)) + = specialize_to_with_args constructor_arg_types var_exprs (funs_and_groups,modules,heaps,error) + # (alg_pattern,heaps) + = build_alg_pattern cons_ds vars args type_module_n heaps + # (alg_patterns,funs_and_groups,modules,heaps,error) + = build_to_alg_patterns alts constructors_arg_types type_module_n funs_and_groups modules heaps error + = ([alg_pattern:alg_patterns],funs_and_groups,modules,heaps,error) + build_to_alg_patterns [] [] type_module_n funs_and_groups modules heaps error + = ([],funs_and_groups,modules,heaps,error) + + specialize_to_with_args [type:types] [arg:args] st + | is_bimap_id type + # (args,st) + = specialize_to_with_args types args st + = ([arg:args],st) + # (arg,st) + = specialize_to_with_arg type arg st + # (args,st) + = specialize_to_with_args types args st + = ([arg:args],st) + specialize_to_with_args [] [] st + = ([],st) + + bimap_from_simple_type :: !(Global Index) !TypeKind ![GenTypeStruct] !Expression !*(!FunsAndGroups,!*{#CommonDefs},!*Heaps,!*ErrorAdmin) + -> *(!Expression,!*(!FunsAndGroups,!*{#CommonDefs},!*Heaps,!*ErrorAdmin)) + bimap_from_simple_type global_type_def_index=:{glob_module} (KindArrow kinds) arg_types arg (funs_and_groups,modules,heaps,error) + # (alts,constructors_arg_types,modules,heaps) + = determine_constructors_arg_types global_type_def_index arg_types modules heaps + # (alg_patterns,funs_and_groups,modules,heaps,error) + = build_from_alg_patterns alts constructors_arg_types glob_module funs_and_groups modules heaps error + = build_bimap_case global_type_def_index arg alg_patterns funs_and_groups modules heaps error + where + build_from_alg_patterns [cons_ds=:{ds_ident,ds_index,ds_arity}:alts] [constructor_arg_types:constructors_arg_types] type_module_n funs_and_groups modules heaps error + # arg_names = ["x" +++ toString k \\ k <- [1..ds_arity]] + # (var_exprs, vars, heaps) = buildVarExprs arg_names heaps + # (args,(funs_and_groups,modules,heaps,error)) + = specialize_from_with_args constructor_arg_types var_exprs (funs_and_groups,modules,heaps,error) + # (alg_pattern,heaps) + = build_alg_pattern cons_ds vars args type_module_n heaps + # (alg_patterns,funs_and_groups,modules,heaps,error) + = build_from_alg_patterns alts constructors_arg_types type_module_n funs_and_groups modules heaps error + = ([alg_pattern:alg_patterns],funs_and_groups,modules,heaps,error) + build_from_alg_patterns [] [] type_module_n funs_and_groups modules heaps error + = ([],funs_and_groups,modules,heaps,error) + + specialize_from_with_args [type:types] [arg:args] st + | is_bimap_id type + # (args,st) + = specialize_from_with_args types args st + = ([arg:args],st) + # (arg,st) + = specialize_from_with_arg type arg st + # (args,st) + = specialize_from_with_args types args st + = ([arg:args],st) + specialize_from_with_args [] [] st + = ([],st) + + determine_constructors_arg_types :: !(Global Index) ![GenTypeStruct] !*Modules !*Heaps + -> (![DefinedSymbol],![[GenTypeStruct]],!*Modules,!*Heaps) + determine_constructors_arg_types {glob_module,glob_object} arg_types modules heaps + # ({td_args,td_rhs=AlgType alts},modules) = modules![glob_module].com_type_defs.[glob_object] + + # {hp_type_heaps} = heaps + # th_vars = number_type_arguments td_args 0 hp_type_heaps.th_vars + # arg_types_a = {!arg_type\\arg_type<-arg_types} + # (constructors_arg_types,modules,th_vars) + = compute_constructors_arg_types alts glob_module arg_types_a modules th_vars + # th_vars = remove_type_argument_numbers td_args th_vars + # heaps = {heaps & hp_type_heaps={hp_type_heaps & th_vars=th_vars}} + = (alts,constructors_arg_types,modules,heaps) + where + compute_constructors_arg_types :: ![DefinedSymbol] !Int !{!GenTypeStruct} !*Modules !*TypeVarHeap + -> (![[GenTypeStruct]],!*Modules,!*TypeVarHeap) + compute_constructors_arg_types [cons_ds=:{ds_ident,ds_index}:alts] type_module_n arg_types_a modules th_vars + # ({cons_type={st_args}},modules) = modules![type_module_n].com_cons_defs.[ds_index] + # (constructor_arg_numbers,th_vars) + = compute_constructor_arg_types st_args arg_types_a th_vars + # (constructors_arg_numbers,modules,th_vars) + = compute_constructors_arg_types alts type_module_n arg_types_a modules th_vars + = ([constructor_arg_numbers:constructors_arg_numbers],modules,th_vars) + compute_constructors_arg_types [] type_module_n arg_types_a modules th_vars + = ([],modules,th_vars) + + compute_constructor_arg_types :: ![AType] !{!GenTypeStruct} !*TypeVarHeap -> (![GenTypeStruct],!*TypeVarHeap) + compute_constructor_arg_types [{at_type=TV {tv_info_ptr}}:atypes] arg_types_a th_vars + # (TVI_GenTypeVarNumber constructor_arg_number,th_vars) + = readPtr tv_info_ptr th_vars + #! constructor_arg_types = arg_types_a.[constructor_arg_number] + # (constructors_arg_types,th_vars) + = compute_constructor_arg_types atypes arg_types_a th_vars + = ([constructor_arg_types:constructors_arg_types],th_vars); + compute_constructor_arg_types [] arg_types_a th_vars + = ([],th_vars) + + build_bimap_case :: !(Global Index) !.Expression ![AlgebraicPattern] !FunsAndGroups !*Modules !*Heaps !*ErrorAdmin + -> (!Expression,!(!FunsAndGroups,!*Modules,!*Heaps,!*ErrorAdmin)) + build_bimap_case global_type_def_index arg alg_patterns funs_and_groups modules heaps error + # case_patterns = AlgebraicPatterns global_type_def_index alg_patterns + # (expr_info_ptr, hp_expression_heap) = newPtr EI_Empty heaps.hp_expression_heap + # case_expr = Case {case_expr = arg, case_guards = case_patterns, case_default = No, case_ident = No, + case_info_ptr = expr_info_ptr, case_explicit = True, case_default_pos = NoPos} + # heaps = {heaps & hp_expression_heap = hp_expression_heap} + = (case_expr, (funs_and_groups,modules,heaps,error)) + + build_alg_pattern :: !DefinedSymbol ![FreeVar] ![Expression] !Int !*Heaps -> (!AlgebraicPattern,!*Heaps) + build_alg_pattern cons_ds=:{ds_ident,ds_index} vars args type_module_n heaps + # cons_symbol = {glob_module = type_module_n, glob_object = cons_ds} + # cons_symb_ident = {symb_ident = ds_ident, symb_kind = SK_Constructor {glob_module = type_module_n,glob_object = ds_index}} + + # (expr_info_ptr, hp_expression_heap) = newPtr EI_Empty heaps.hp_expression_heap + # expr = App {app_symb = cons_symb_ident, app_args = args, app_info_ptr = expr_info_ptr} + + #! alg_pattern = { ap_symbol = cons_symbol, ap_vars = vars, ap_expr = expr, ap_position = NoPos } + # heaps = {heaps & hp_expression_heap = hp_expression_heap} + = (alg_pattern,heaps) + is_bimap_id_expression (TVI_Expr (App {app_symb={symb_kind=SK_Function fun_glob},app_args=[]})) main_module_index {fg_bimap_functions={bimap_id_function={fii_index}}} = fii_index>=0 && fun_glob.glob_module==main_module_index && fun_glob.glob_object==fii_index is_bimap_id_expression _ main_module_index _ @@ -2693,6 +2916,20 @@ clear_tvs spec_env heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}} = writePtr tv_info_ptr TVI_Empty th_vars = {heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars }} +number_type_arguments :: ![ATypeVar] !Int !*TypeVarHeap -> *TypeVarHeap +number_type_arguments [{atv_variable={tv_info_ptr}}:atype_vars] arg_n th_vars + # th_vars = writePtr tv_info_ptr (TVI_GenTypeVarNumber arg_n) th_vars + = number_type_arguments atype_vars (arg_n+1) th_vars +number_type_arguments [] arg_n th_vars + = th_vars + +remove_type_argument_numbers :: ![ATypeVar] !*TypeVarHeap -> *TypeVarHeap +remove_type_argument_numbers [{atv_variable={tv_info_ptr}}:atype_vars] th_vars + # th_vars = writePtr tv_info_ptr TVI_Empty th_vars + = remove_type_argument_numbers atype_vars th_vars +remove_type_argument_numbers [] th_vars + = th_vars + build_bimap_with_calls map_id_index map_id_ident to_args from_args main_module_index predefs heaps # (map_to_expr,heaps) = buildFunApp2 main_module_index map_id_index map_id_ident to_args heaps (map_from_expr,heaps) = buildFunApp2 main_module_index map_id_index map_id_ident from_args heaps @@ -3088,24 +3325,20 @@ where # fresh_gtvs = take (length gtvs) fresh_st.st_vars = (fresh_st, fresh_gtvs, th) - build_symbol_type :: + build_symbol_type :: !SymbolType // generic type, - ![ATypeVar] // attributed generic variables + ![ATypeVar] // attributed generic variables !TypeKind // kind to specialize to !Int // current order (in the sense of the order of the kind) - !*TypeHeaps - !*ErrorAdmin + !*TypeHeaps !*ErrorAdmin -> ( !SymbolType // new generic type , ![ATypeVar] // fresh copies of generic variables created for the // generic arguments - , !*TypeHeaps - , !*ErrorAdmin - ) + , !*TypeHeaps, !*ErrorAdmin) build_symbol_type st gatvs KindConst order th error = (st, [], th, error) build_symbol_type st gatvs (KindArrow kinds) order th error | order > 2 - //---> ("build_symbol_type called for", (KindArrow kinds), gatvs, st) # error = reportError ident pos "kinds of order higher then 2 are not supported" error = (st, [], th, error) @@ -3157,7 +3390,6 @@ where ) build_arg st gatvs order kind (arg_num, th, error) #! th = clearSymbolType st th - //---> ("build_arg called for", arg_num, kind, gatvs, st) #! (fresh_gatvs, th) = mapSt subst_gatv gatvs th #! (new_st, th) = applySubstInSymbolType st th @@ -3169,7 +3401,6 @@ where #! curry_st = adjust_forall curry_st forall_atvs = ((curry_st, fresh_gatvs), (inc arg_num, th, error)) - //---> ("build_arg returns", fresh_gatvs, curry_st) where postfix = toString arg_num @@ -3188,7 +3419,7 @@ where subst_attr (TA_Var {av_ident, av_info_ptr}) th_attrs # (av, th_attrs) = freshAttrVar (postfixIdent av_ident.id_name postfix) th_attrs = (TA_Var av, writePtr av_info_ptr (AVI_Attr (TA_Var av)) th_attrs) - //---> ("(2) writePtr av_info_ptr", ptrToInt av_info_ptr, av) + subst_attr TA_Multi th = (TA_Multi, th) subst_attr TA_Unique th = (TA_Unique, th) @@ -3201,8 +3432,7 @@ where = curry_st.st_attr_vars -- [av \\ {atv_attribute=TA_Var av} <- forall_atvs] , st_vars = curry_st.st_vars -- [atv_variable \\ {atv_variable} <- forall_atvs] - } - //---> ("adjust forall", curry_st.st_vars, forall_atvs, curry_st.st_vars -- [atv_variable \\ {atv_variable} <- forall_atvs]) + } build_body :: !SymbolType @@ -3655,9 +3885,7 @@ clearSymbolType st th // clears not only st_vars and st_attrs, but also TFA variables = clearType ((st.st_result, st.st_args), st.st_context) th -//---------------------------------------------------------------------------------------- // collect variables -//---------------------------------------------------------------------------------------- collectTypeVarsAndAttrVars :: !type @@ -3763,7 +3991,6 @@ markAttrVarUsed {av_info_ptr} th_attrs = case av_info of AVI_Empty -> (False, writePtr av_info_ptr AVI_Used th_attrs) AVI_Used -> (True, th_attrs) - simplifyTypeApp :: !Type ![AType] -> Type simplifyTypeApp (TA type_cons=:{type_arity} cons_args) type_args @@ -3778,11 +4005,8 @@ simplifyTypeApp (TV tv) type_args = CV tv :@: type_args simplifyTypeApp (TB _) type_args = TE simplifyTypeApp (TArrow1 _) type_args = TE -//---------------------------------------------------------------------------------------- // substitutions -//---------------------------------------------------------------------------------------- -// // Uninitialized variables are not substituted, but left intact // // This behaviour is needed for kind indexing generic types, @@ -4196,8 +4420,7 @@ foldExpr f expr=:(DynamicExpr {dyn_expr}) st foldExpr f EE st = st foldExpr f expr st - = abort "generic.icl: foldExpr does not match\n"//f expr st - ---> ("foldExpr does not match", expr) + = abort "generic.icl: foldExpr does not match\n" // needed for collectCalls instance == FunCall where (==) (FunCall x _) (FunCall y _) = x == y diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index 295e60b..851125e 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -551,12 +551,13 @@ NoGlobalIndex :== {gi_module=NoIndex,gi_index=NoIndex} | GTSCons DefinedSymbol GenTypeStruct | GTSField DefinedSymbol GenTypeStruct | GTSObject DefinedSymbol GenTypeStruct - | GTSE + | GTSPair !GenTypeStruct !GenTypeStruct // for optimizing bimaps + | GTSEither !GenTypeStruct !GenTypeStruct // for optimizing bimaps | GTSArrow GenTypeStruct GenTypeStruct // for optimizing bimaps + | GTSE | GTSAppConsBimapKindConst // for optimizing bimaps | GTSAppBimap TypeKind [GenTypeStruct] // for optimizing bimaps - | GTSPair !GenTypeStruct !GenTypeStruct // for optimizing bimaps - | GTSEither !GenTypeStruct !GenTypeStruct // for optimizing bimaps + | GTSAppConsSimpleType !(Global Index) !TypeKind ![GenTypeStruct] // for optimizing bimaps :: GenericTypeRep = { gtr_type :: GenTypeStruct // generic structure type |