diff options
-rw-r--r-- | frontend/check.icl | 149 | ||||
-rw-r--r-- | frontend/checkKindCorrectness.icl | 35 | ||||
-rw-r--r-- | frontend/frontend.icl | 53 | ||||
-rw-r--r-- | frontend/generics.dcl | 4 | ||||
-rw-r--r-- | frontend/generics.icl | 342 |
5 files changed, 414 insertions, 169 deletions
diff --git a/frontend/check.icl b/frontend/check.icl index d482f23..016a00b 100644 --- a/frontend/check.icl +++ b/frontend/check.icl @@ -285,7 +285,8 @@ where ) check_generic_instance :: GenericDef !Index !Index !Index !ClassInstance !u:InstanceSymbols !*TypeHeaps !*CheckState -> (!ClassInstance, !u:InstanceSymbols, !*TypeHeaps, !*CheckState) check_generic_instance - class_def module_index generic_index generic_module_index + {gen_member_name} + module_index generic_index generic_module_index ins=:{ ins_members, ins_class={glob_object = class_name =: {ds_ident = {id_name,id_info},ds_arity, ds_index} }, @@ -293,7 +294,9 @@ where ins_specials, ins_pos, ins_ident, - ins_is_generic} + ins_is_generic, + ins_generate + } is=:{is_class_defs,is_modules} type_heaps cs=:{cs_symbol_table, cs_error} @@ -304,16 +307,20 @@ where = checkInstanceType module_index ins_class ins_type ins_specials is.is_type_defs is.is_class_defs is.is_modules type_heaps cs # is = { is & is_type_defs = is_type_defs, is_class_defs = is_class_defs, is_modules = is_modules } - # ins = { ins & - ins_is_generic = True, - ins_generic = {glob_module = module_index, glob_object = generic_index}, - ins_class = ins_class, - ins_type = ins_type, - ins_specials = ins_specials + # ins = + { ins + & ins_is_generic = True + , ins_generic = {glob_module = generic_module_index, glob_object = generic_index} + , ins_class = ins_class + , ins_type = ins_type + , ins_specials = ins_specials + , ins_members = if ins_generate + {{ds_arity = 0, ds_index = NoIndex, ds_ident = gen_member_name}} + ins_members } = (ins, is, type_heaps, cs) // otherwise - # cs_error = checkError id_name "arity of generic instance must be 1" cs_error + # cs_error = checkError id_name "arity of a generic instance must be 1" cs_error # cs = {cs & cs_error = cs_error} = (ins, is, type_heaps, cs) @@ -355,8 +362,8 @@ where check_generic_instance {ins_class, ins_members, ins_generate} mod_index instance_types class_defs member_defs generic_defs type_defs modules var_heap type_heaps cs # ({gen_name, gen_member_name}, generic_defs, modules) = getGenericDef ins_class mod_index generic_defs modules - | ins_generate - = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs) + //| ins_generate + // = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs) | size ins_members <> 1 # cs = { cs & cs_error = checkError gen_name "generic instance must have one memeber" cs.cs_error } = (instance_types, class_defs, member_defs, generic_defs, type_defs, modules, var_heap, type_heaps, cs) @@ -576,43 +583,90 @@ getTypeDef x_main_dcl_module_n {glob_module,glob_object} type_defs modules = modules![glob_module].dcl_common.com_type_defs.[glob_object] = (type_def, type_defs, modules) -determineTypesOfInstances :: !Index !Index !*{#ClassInstance} !*{# ClassDef} !*{# MemberDef} +determineTypesOfInstances :: !Index !Index !*{#ClassInstance} !*{# ClassDef} !*{# MemberDef} !*{#GenericDef} !*{#DclModule} !*TypeHeaps !*VarHeap !*CheckState - -> (![FunType], !Index, ![ClassInstance], !*{#ClassInstance}, !*{# ClassDef}, !*{# MemberDef}, !*{#DclModule}, !*TypeHeaps, !*VarHeap, !*CheckState) -determineTypesOfInstances first_memb_inst_index mod_index com_instance_defs com_class_defs com_member_defs + -> (![FunType], !Index, ![ClassInstance], !*{#ClassInstance}, !*{# ClassDef}, !*{# MemberDef}, !*{#GenericDef}, !*{#DclModule}, !*TypeHeaps, !*VarHeap, !*CheckState) +determineTypesOfInstances first_memb_inst_index mod_index com_instance_defs com_class_defs com_member_defs com_generic_defs modules type_heaps var_heap cs=:{cs_error, cs_x={x_main_dcl_module_n}} | cs_error.ea_ok #! nr_of_class_instances = size com_instance_defs - # (memb_inst_defs, next_mem_inst_index, all_class_specials, com_class_defs, com_member_defs, modules, com_instance_defs, type_heaps, var_heap, cs_error) - = determine_types_of_instances x_main_dcl_module_n 0 nr_of_class_instances first_memb_inst_index mod_index [] com_class_defs com_member_defs + # (memb_inst_defs, next_mem_inst_index, all_class_specials, com_class_defs, com_member_defs, com_generic_defs, modules, com_instance_defs, type_heaps, var_heap, cs_error) + = determine_types_of_instances x_main_dcl_module_n 0 nr_of_class_instances first_memb_inst_index mod_index [] com_class_defs com_member_defs com_generic_defs modules com_instance_defs type_heaps var_heap cs_error = (memb_inst_defs, next_mem_inst_index, all_class_specials, com_instance_defs, com_class_defs, - com_member_defs, modules, type_heaps, var_heap, { cs & cs_error = cs_error }) - = ([], first_memb_inst_index, [], com_instance_defs, com_class_defs, com_member_defs, modules, type_heaps, var_heap, cs) + com_member_defs, com_generic_defs, modules, type_heaps, var_heap, { cs & cs_error = cs_error }) + = ([], first_memb_inst_index, [], com_instance_defs, com_class_defs, com_member_defs, com_generic_defs, modules, type_heaps, var_heap, cs) where - determine_types_of_instances :: !Index !Index !Index !Index !Index ![ClassInstance] !v:{#ClassDef} !w:{#MemberDef} + determine_types_of_instances :: !Index !Index !Index !Index !Index ![ClassInstance] !v:{#ClassDef} !w:{#MemberDef} !y:{#GenericDef} !x:{#DclModule} !*{#ClassInstance} !*TypeHeaps !*VarHeap !*ErrorAdmin - -> (![FunType], !Index, ![ClassInstance], !v:{#ClassDef}, !w:{#MemberDef}, !x:{#DclModule}, !*{#ClassInstance}, !*TypeHeaps, !*VarHeap, !*ErrorAdmin) + -> (![FunType], !Index, ![ClassInstance], !v:{#ClassDef}, !w:{#MemberDef}, !y:{#GenericDef}, !x:{#DclModule}, !*{#ClassInstance}, !*TypeHeaps, !*VarHeap, !*ErrorAdmin) determine_types_of_instances x_main_dcl_module_n inst_index next_class_inst_index next_mem_inst_index mod_index all_class_specials - class_defs member_defs modules instance_defs type_heaps var_heap error + class_defs member_defs generic_defs modules instance_defs type_heaps var_heap error | inst_index < size instance_defs # (instance_def, instance_defs) = instance_defs![inst_index] - # {ins_class,ins_pos,ins_type,ins_specials} = instance_def - ({class_name, class_members}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules - class_size = size class_members - (ins_members, memb_inst_defs1, member_defs, modules, type_heaps, var_heap, error) - = determine_instance_symbols_and_types x_main_dcl_module_n next_mem_inst_index 0 mod_index ins_class.glob_module class_size class_members - ins_type ins_specials class_name ins_pos member_defs modules type_heaps var_heap error - instance_def = { instance_def & ins_members = { member \\ member <- ins_members }} - (ins_specials, next_class_inst_index, all_class_specials, type_heaps, error) - = check_instance_specials mod_index instance_def inst_index ins_specials next_class_inst_index all_class_specials type_heaps error - (memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error) - = determine_types_of_instances x_main_dcl_module_n (inc inst_index) next_class_inst_index (next_mem_inst_index + class_size) mod_index all_class_specials - class_defs member_defs modules { instance_defs & [inst_index] = { instance_def & ins_specials = ins_specials }} type_heaps var_heap error - - = (memb_inst_defs1 ++ memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error) - = ([], next_mem_inst_index, all_class_specials, class_defs, member_defs, modules, instance_defs, type_heaps, var_heap, error) + # {ins_class,ins_pos,ins_type,ins_specials, ins_is_generic} = instance_def + | ins_is_generic + # ({gen_member_name}, generic_defs, modules) = getGenericDef ins_class mod_index generic_defs modules + # ins_member = {ds_ident=gen_member_name, ds_arity= -1, ds_index = next_mem_inst_index} + # instance_def = { instance_def & ins_members = {ins_member}} + # class_size = 1 + # (new_info_ptr, var_heap) = newPtr VI_Empty var_heap + # empty_st = + { st_vars = [] + , st_args = [] + , st_arity = -1 + , st_result = {at_type=TE, at_attribute=TA_None, at_annotation=AN_None} + , st_context = [] + , st_attr_vars = [] + , st_attr_env = [] + } + # memb_inst_def = MakeNewFunctionType gen_member_name 0 NoPrio empty_st ins_pos SP_None new_info_ptr + # memb_inst_defs1 = [memb_inst_def] + # (memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, generic_defs, modules, instance_defs, type_heaps, var_heap, error) + = determine_types_of_instances + x_main_dcl_module_n + (inc inst_index) + next_class_inst_index + (next_mem_inst_index + class_size) + mod_index + all_class_specials + class_defs + member_defs + generic_defs + modules + { instance_defs & [inst_index] = { instance_def & ins_specials = ins_specials }} + type_heaps + var_heap + error + = ( memb_inst_defs1 ++ memb_inst_defs2 + , next_mem_inst_index + , all_class_specials + , class_defs + , member_defs + , generic_defs + , modules + , instance_defs + , type_heaps + , var_heap + , error + ) + //---> ("determine_types_of_instances: generic ", gen_name, mod_index, inst_index, x_main_dcl_module_n) +// = abort "exporting generics is not yet supported\n" + # ({class_name, class_members}, class_defs, modules) = getClassDef ins_class mod_index class_defs modules + class_size = size class_members + (ins_members, memb_inst_defs1, member_defs, modules, type_heaps, var_heap, error) + = determine_instance_symbols_and_types x_main_dcl_module_n next_mem_inst_index 0 mod_index ins_class.glob_module class_size class_members + ins_type ins_specials class_name ins_pos member_defs modules type_heaps var_heap error + instance_def = { instance_def & ins_members = { member \\ member <- ins_members }} + (ins_specials, next_class_inst_index, all_class_specials, type_heaps, error) + = check_instance_specials mod_index instance_def inst_index ins_specials next_class_inst_index all_class_specials type_heaps error + (memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, generic_defs, modules, instance_defs, type_heaps, var_heap, error) + = determine_types_of_instances x_main_dcl_module_n (inc inst_index) next_class_inst_index (next_mem_inst_index + class_size) mod_index all_class_specials + class_defs member_defs generic_defs modules { instance_defs & [inst_index] = { instance_def & ins_specials = ins_specials }} type_heaps var_heap error + + = (memb_inst_defs1 ++ memb_inst_defs2, next_mem_inst_index, all_class_specials, class_defs, member_defs, generic_defs, modules, instance_defs, type_heaps, var_heap, error) + = ([], next_mem_inst_index, all_class_specials, class_defs, member_defs, generic_defs, modules, instance_defs, type_heaps, var_heap, error) determine_instance_symbols_and_types :: !Index !Index !Index !Index !Index !Int !{#DefinedSymbol} !InstanceType !Specials Ident !Position !w:{#MemberDef} !u:{#DclModule} !*TypeHeaps !*VarHeap !*ErrorAdmin @@ -945,7 +999,6 @@ renumber_icl_definitions_as_dcl_definitions _ icl_decl_symbols modules cdefs icl = (Declaration {icl_decl_symbol & decl_index=icl_to_dcl_index_table.[cClassDefs,decl_index]},cdefs) renumber_icl_decl_symbol (Declaration icl_decl_symbol=:{decl_kind = STE_Generic, decl_index}) cdefs = (Declaration {icl_decl_symbol & decl_index=icl_to_dcl_index_table.[cGenericDefs,decl_index]},cdefs) - ---> ("renumber_icl_decl_symbol: " +++ icl_decl_symbol.decl_ident.id_name) renumber_icl_decl_symbol icl_decl_symbol cdefs = (icl_decl_symbol,cdefs) # cdefs=reorder_common_definitions cdefs @@ -2409,11 +2462,12 @@ doSomeThingsThatHaveToBeDoneAfterTheWholeComponentHasBeenChecked mod_index nr_of_dcl_functions = size dcl_functions (memb_inst_defs, nr_of_dcl_functions_and_instances2, rev_spec_class_inst, - com_instance_defs, com_class_defs, com_member_defs, dcl_modules, hp_type_heaps, hp_var_heap, cs) + com_instance_defs, com_class_defs, com_member_defs, com_generic_defs, dcl_modules, hp_type_heaps, hp_var_heap, cs) = determineTypesOfInstances nr_of_dcl_functions mod_index (fst (memcpy dcl_common.com_instance_defs)) (fst (memcpy dcl_common.com_class_defs)) (fst (memcpy dcl_common.com_member_defs)) + (fst (memcpy dcl_common.com_generic_defs)) dcl_modules hp_type_heaps hp_var_heap { cs & cs_error = cs_error } heaps = { heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap } @@ -2438,12 +2492,14 @@ doSomeThingsThatHaveToBeDoneAfterTheWholeComponentHasBeenChecked mod_index -> adjust_instance_types_of_array_functions_in_std_array_dcl mod_index com_member_defs com_instance_defs dcl_functions cs dcl_mod - = { dcl_mod & + = { dcl_mod & dcl_functions = dcl_functions, dcl_specials = { ir_from = nr_of_dcl_functions_and_instances, ir_to = nr_of_dcl_funs_insts_and_specs }, - dcl_common = { dcl_common & com_instance_defs = com_instance_defs, - com_class_defs = com_class_defs, com_member_defs = com_member_defs }} + dcl_common = + { dcl_common & com_instance_defs = com_instance_defs, + com_class_defs = com_class_defs, com_member_defs = com_member_defs, + com_generic_defs = com_generic_defs }} dcl_modules = { dcl_modules & [mod_index] = dcl_mod } = (dcl_modules, heaps, cs) @@ -2677,10 +2733,15 @@ where = foldlArraySt (count_members_of_instance mod_index) com_instance_defs (0, com_class_defs, modules) = sum - count_members_of_instance mod_index {ins_class} (sum, com_class_defs, modules) - # ({class_members}, com_class_defs, modules) + count_members_of_instance mod_index {ins_class,ins_is_generic} (sum, com_class_defs, modules) +//AA.. + | ins_is_generic + = (1 + sum, com_class_defs, modules) + | otherwise +//..AA + # ({class_members}, com_class_defs, modules) = getClassDef ins_class mod_index com_class_defs modules - = (size class_members + sum, com_class_defs, modules) + = (size class_members + sum, com_class_defs, modules) // MV... adjust_predef_symbol predef_index mod_index symb_kind cs=:{cs_predef_symbols,cs_symbol_table,cs_error} diff --git a/frontend/checkKindCorrectness.icl b/frontend/checkKindCorrectness.icl index 49d285e..d0dd2e1 100644 --- a/frontend/checkKindCorrectness.icl +++ b/frontend/checkKindCorrectness.icl @@ -82,22 +82,27 @@ checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances com (check_kind_correctness_of_class_context_and_member_contexts common_defs com_member_defs) com_class_defs state = state - check_kind_correctness_of_instance common_defs {ins_class, ins_ident, ins_pos, ins_type} + check_kind_correctness_of_instance common_defs {ins_is_generic, ins_class, ins_ident, ins_pos, ins_type} (th_vars, td_infos, error_admin) - # {class_args} - = common_defs.[ins_class.glob_module].com_class_defs.[ins_class.glob_object.ds_index] - (expected_kinds, th_vars) - = mapSt get_tvi class_args th_vars - error_admin - = setErrorAdmin (newPosition ins_ident ins_pos) error_admin - th_vars - = foldSt init_type_var ins_type.it_vars th_vars - state - = unsafeFold3St possibly_check_kind_correctness_of_type expected_kinds [1..] - ins_type.it_types (th_vars, td_infos, error_admin) - state - = foldSt (check_kind_correctness_of_context common_defs) ins_type.it_context state - = state + | ins_is_generic + // kind correctness of user suppliedg eneric instances + // is checked during generic phase + = (th_vars, td_infos, error_admin) + | otherwise + # {class_args} + = common_defs.[ins_class.glob_module].com_class_defs.[ins_class.glob_object.ds_index] + (expected_kinds, th_vars) + = mapSt get_tvi class_args th_vars + error_admin + = setErrorAdmin (newPosition ins_ident ins_pos) error_admin + th_vars + = foldSt init_type_var ins_type.it_vars th_vars + state + = unsafeFold3St possibly_check_kind_correctness_of_type expected_kinds [1..] + ins_type.it_types (th_vars, td_infos, error_admin) + state + = foldSt (check_kind_correctness_of_context common_defs) ins_type.it_context state + = state possibly_check_kind_correctness_of_type TVI_Empty _ _ state // This can happen for stooopid classes like StdClass::Ord, where the member type is ignored at all = state diff --git a/frontend/frontend.icl b/frontend/frontend.icl index 44d4397..6486fdb 100644 --- a/frontend/frontend.icl +++ b/frontend/frontend.icl @@ -123,7 +123,10 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac // AA.. # error_admin = {ea_file = error, ea_loc = [], ea_ok = True } - # ti_common_defs = {{dcl_common \\ {dcl_common} <-: dcl_mods } & [main_dcl_module_n] = icl_common } + + # ti_common_defs = {dcl_common \\ {dcl_common} <-: dcl_mods } + # (saved_main_dcl_common, ti_common_defs) = replace ti_common_defs main_dcl_module_n icl_common + # (td_infos, type_heaps, error_admin) = analTypeDefs ti_common_defs icl_used_module_numbers type_heaps error_admin (fun_defs, th_vars, td_infos, error_admin) = checkKindCorrectness icl_used_module_numbers main_dcl_module_n icl_instances @@ -131,16 +134,19 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac type_heaps = { type_heaps & th_vars = th_vars } # heaps = { heaps & hp_type_heaps = type_heaps } - #! (components, ti_common_defs, fun_defs, generic_range, td_infos, heaps, hash_table, predef_symbols, dcl_mods, error_admin) = + #! (components, ti_common_defs, fun_defs, generic_range, td_infos, heaps, hash_table, predef_symbols, dcl_mods, optional_dcl_icl_conversions, error_admin) = case SupportGenerics of True -> convertGenerics components main_dcl_module_n ti_common_defs fun_defs td_infos - heaps hash_table predef_symbols dcl_mods error_admin - False -> (components, ti_common_defs, fun_defs, {ir_to=0,ir_from=0}, td_infos, heaps, hash_table, predef_symbols, dcl_mods, error_admin) - - - # icl_common = ti_common_defs.[main_dcl_module_n] - + heaps hash_table predef_symbols dcl_mods optional_dcl_icl_conversions error_admin + False -> (components, ti_common_defs, fun_defs, {ir_to=0,ir_from=0}, td_infos, heaps, hash_table, predef_symbols, dcl_mods, optional_dcl_icl_conversions, error_admin) + + # (icl_common, ti_common_defs) = replace copied_ti_common_defs main_dcl_module_n saved_main_dcl_common + with + copied_ti_common_defs :: !.{#CommonDefs} // needed for Clean 2.0 to disambiguate overloading of replace + copied_ti_common_defs = {x \\ x <-: ti_common_defs} + # dcl_mods = { {dcl_mod & dcl_common = common} \\ dcl_mod <-: dcl_mods & common <-: ti_common_defs } + # error = error_admin.ea_file #! ok = error_admin.ea_ok | not ok @@ -155,7 +161,7 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac # (fun_def_size, fun_defs) = usize fun_defs - # (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions") [ global_fun_range, icl_instances, icl_specials, generic_range] + # (components, fun_defs) = partitionateFunctions (fun_defs -*-> "partitionateFunctions") [ global_fun_range, icl_instances, icl_specials, generic_range] // (components, fun_defs, error) = showTypes components 0 fun_defs error // (components, fun_defs, error) = showComponents components 0 True fun_defs error @@ -202,6 +208,7 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac = convertImportedTypeSpecifications main_dcl_module_n dcl_mods imported_funs common_defs used_conses used_funs (dcl_types -*-> "Convert types") type_heaps var_heap # heaps = {hp_var_heap = var_heap, hp_expression_heap=expression_heap, hp_type_heaps=type_heaps} // (components, fun_defs, error) = showTypes components 0 fun_defs error +// (dcl_mods, out) = showDclModules dcl_mods out // (components, fun_defs, out) = showComponents components 0 False fun_defs out #! fe ={ fe_icl = @@ -233,7 +240,7 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac | dcl_index < dcl_table_size # icl_index = dcl_icl_conversions.[dcl_index] = update_conversion_array (inc dcl_index) dcl_table_size dcl_icl_conversions - { icl_conversions & [icl_index] = dcl_index } + { icl_conversions & [icl_index] = dcl_index } = icl_conversions fill_empty_positions next_index table_size next_new_index icl_conversions @@ -318,3 +325,29 @@ where # properties = { form_properties = cAttributed bitor cAnnotated, form_attr_position = No } (Yes ftype) = fun_def.fun_type = show_types funs fun_defs (file <<< fun_def.fun_symb <<< " :: " <:: (properties, ftype, No) <<< '\n' ) + +showDclModules :: !u:{#DclModule} !*File -> (!u:{#DclModule}, !*File) +showDclModules dcl_mods file + = show_dcl_mods 0 dcl_mods file +where + show_dcl_mods mod_index dcl_mods file + # (size_dcl_mods, dcl_mods) = usize dcl_mods + | mod_index == size_dcl_mods + = (dcl_mods, file) + | otherwise + # (dcl_mod, dcl_mods) = dcl_mods ! [mod_index] + # file = show_dcl_mod dcl_mod file + = (dcl_mods, file) + + show_dcl_mod {dcl_name, dcl_functions} file + # file = file <<< dcl_name <<< ":\n" + # file = show_dcl_functions 0 dcl_functions file + = file <<< "\n" + show_dcl_functions fun_index dcl_functions file + | fun_index == size dcl_functions + = file + | otherwise + # file = show_dcl_function dcl_functions.[fun_index] file + = show_dcl_functions (inc fun_index) dcl_functions file + show_dcl_function {ft_symb, ft_type} file + = file <<< ft_symb <<< " :: " <<< ft_type <<< "\n"
\ No newline at end of file diff --git a/frontend/generics.dcl b/frontend/generics.dcl index 8ee5187..47702e7 100644 --- a/frontend/generics.dcl +++ b/frontend/generics.dcl @@ -3,8 +3,8 @@ definition module generics import checksupport from transform import Group -convertGenerics :: !{!Group} !Int !{#CommonDefs} !*{# FunDef} !*TypeDefInfos !*Heaps !*HashTable !*PredefinedSymbols !u:{# DclModule} !*ErrorAdmin - -> (!{!Group}, !{#CommonDefs}, !*{# FunDef}, !IndexRange, !*TypeDefInfos, !*Heaps, !*HashTable, !*PredefinedSymbols, !u:{# DclModule}, !*ErrorAdmin) +convertGenerics :: !{!Group} !Int !{#CommonDefs} !*{# FunDef} !*TypeDefInfos !*Heaps !*HashTable !*PredefinedSymbols !u:{# DclModule} !(Optional {#Index}) !*ErrorAdmin + -> (!{!Group}, !{#CommonDefs}, !*{# FunDef}, !IndexRange, !*TypeDefInfos, !*Heaps, !*HashTable, !*PredefinedSymbols, !u:{# DclModule}, !(Optional {#Index}), !*ErrorAdmin) getGenericMember :: !(Global Index) !TypeKind !{#CommonDefs} -> (Bool, Global Index)
\ No newline at end of file diff --git a/frontend/generics.icl b/frontend/generics.icl index 5160b84..155dccc 100644 --- a/frontend/generics.icl +++ b/frontend/generics.icl @@ -11,29 +11,31 @@ import analtypes // whether to generate CONS // (needed for function that use CONS, like toString) -supportCons :== True +supportCons :== False // whether to bind _cons_info to actual constructor info // (needed for functions that create CONS, like fromString) supportConsInfo :== False && supportCons // whether generate missing alternatives -supportPartialInstances :== True - -:: *GenericState = { - gs_modules :: !*{#CommonDefs}, - gs_fun_defs :: !*{# FunDef}, - gs_groups :: !{!Group}, - gs_td_infos :: !*TypeDefInfos, - gs_gtd_infos :: !*GenericTypeDefInfos, - gs_heaps :: !*Heaps, - gs_main_dcl_module_n :: !Index, - gs_first_fun :: !Index, - gs_last_fun :: !Index, - gs_first_group :: !Index, - gs_last_group :: !Index, - gs_predefs :: !PredefinedSymbols, - gs_error :: !*ErrorAdmin +supportPartialInstances :== False + +:: *GenericState = + { gs_modules :: !*{#CommonDefs} + , gs_fun_defs :: !*{# FunDef} + , gs_groups :: !{!Group} + , gs_td_infos :: !*TypeDefInfos + , gs_gtd_infos :: !*GenericTypeDefInfos + , gs_heaps :: !*Heaps + , gs_main_dcl_module_n :: !Index + , gs_first_fun :: !Index + , gs_last_fun :: !Index + , gs_first_group :: !Index + , gs_last_group :: !Index + , gs_predefs :: !PredefinedSymbols + , gs_dcl_modules :: !*{#DclModule} + , gs_opt_dcl_icl_conversions :: !*(Optional !*{#Index}) + , gs_error :: !*ErrorAdmin } :: GenericTypeDefInfo @@ -71,13 +73,15 @@ EmptyGenericType :== instance toBool GenericTypeDefInfo where toBool GTDI_Empty = False - toBool (GTDI_Generic _) = True + toBool (GTDI_Generic _) = True -convertGenerics :: !{!Group} !Int !{#CommonDefs} !*{# FunDef} !*TypeDefInfos !*Heaps !*HashTable !*PredefinedSymbols !u:{# DclModule} !*ErrorAdmin - -> (!{!Group}, !{#CommonDefs}, !*{# FunDef}, !IndexRange, !*TypeDefInfos, !*Heaps, !*HashTable, !*PredefinedSymbols, !u:{# DclModule}, !*ErrorAdmin) +convertGenerics :: !{!Group} !Int !{#CommonDefs} !*{# FunDef} !*TypeDefInfos !*Heaps !*HashTable !*PredefinedSymbols !u:{# DclModule} !(Optional {#Index}) !*ErrorAdmin + -> (!{!Group}, !{#CommonDefs}, !*{# FunDef}, !IndexRange, !*TypeDefInfos, !*Heaps, !*HashTable, !*PredefinedSymbols, !u:{# DclModule}, !(Optional {#Index}), !*ErrorAdmin) convertGenerics groups main_dcl_module_n modules fun_defs td_infos heaps - hash_table predefs dcl_modules error + hash_table predefs dcl_modules + opt_dcl_icl_conversions + error #! (fun_defs_size, fun_defs) = usize fun_defs #! groups_size = size groups @@ -85,6 +89,7 @@ convertGenerics #! (predef_size, predefs) = usize predefs #! (gs_predefs, predefs) = arrayCopyBegin predefs predef_size + // determine sized of type def_infos: // ??? How to map 2-d unique array not so ugly ??? #! (td_infos_sizes, td_infos) = get_sizes 0 td_infos with @@ -97,83 +102,93 @@ convertGenerics = ([row_size : row_sizes], td_infos) #! gtd_infos = { createArray s GTDI_Empty \\ s <- td_infos_sizes } - #! gs = {gs_modules = {m \\m <-: modules}, // unique copy - gs_groups = groups, gs_fun_defs = fun_defs, - gs_td_infos = td_infos, - gs_gtd_infos = gtd_infos, - gs_heaps = heaps, - gs_main_dcl_module_n = main_dcl_module_n, - gs_first_fun = fun_defs_size, gs_last_fun = fun_defs_size, - gs_first_group = groups_size, gs_last_group = groups_size, - gs_predefs = gs_predefs, - gs_error = error} + #! gs = + { gs_modules = {m \\m <-: modules} // unique copy + , gs_groups = groups + , gs_fun_defs = fun_defs + , gs_td_infos = td_infos + , gs_gtd_infos = gtd_infos + , gs_heaps = heaps + , gs_main_dcl_module_n = main_dcl_module_n + , gs_first_fun = fun_defs_size + , gs_last_fun = fun_defs_size + , gs_first_group = groups_size + , gs_last_group = groups_size + , gs_predefs = gs_predefs + , gs_dcl_modules = { x \\ x <-: dcl_modules } // unique copy + , gs_opt_dcl_icl_conversions = + case opt_dcl_icl_conversions of + No -> No + Yes xs -> Yes {x \\ x <-: xs} // unique copy + , gs_error = error + } #! gs = collectInstanceKinds gs //---> "*** collect kinds used in generic instances and update generics with them" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! gs = buildClasses gs //---> "*** build generic classes for all used kinds" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (generic_types, gs) = collectGenericTypes gs //---> "*** collect types of generics (needed for generic representation)" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (instance_types, gs) = convertInstances gs //---> "*** bind generic instances to classes and collect instance types" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (cons_funs, cons_groups, gs) = buildConsInstances gs | not ok //---> "*** bind function for CONS" - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (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 | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (iso_funs, iso_groups, gs) = buildIsoFunctions td_indexes gs //---> "*** build isomorphisms for type definitions" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (isomap_type_funs, isomap_type_groups, gs) = buildIsomapsForTypeDefs td_indexes gs //---> "*** build maps for type definitions" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (isomap_gen_funs, isomap_gen_groups, gs) = buildIsomapsForGenerics gs //---> "*** build maps for generic function types" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (instance_funs, instance_groups, gs) = buildInstances gs //---> "*** build instances" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! (star_funs, star_groups, gs) = buildKindConstInstances gs //---> "*** build shortcut instances for kind *" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table // the order in the lists below is important! // Indexes are allocated in that order. @@ -184,36 +199,37 @@ convertGenerics //---> "*** add geenrated functions" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table #! gs = determineMemberTypes 0 0 gs //---> "*** determine types of member instances" #! (ok,gs) = gs!gs_error.ea_ok | not ok - = return gs predefs hash_table dcl_modules + = return gs predefs hash_table //| True // = abort "-----------------\n" - #! {gs_modules, gs_groups, gs_fun_defs, gs_td_infos, - gs_heaps, - gs_error} = gs + # { gs_modules, gs_groups, gs_fun_defs, gs_td_infos, gs_heaps, gs_dcl_modules, + gs_opt_dcl_icl_conversions, + gs_error} + = gs #! {hte_symbol_heap} = hash_table - #! cs = { - cs_symbol_table = hte_symbol_heap, - cs_predef_symbols = predefs, - cs_error = gs_error, - cs_x= { - x_needed_modules = 0, - x_main_dcl_module_n = main_dcl_module_n, - x_is_dcl_module = False, - x_type_var_position = 0 + #! cs = + { cs_symbol_table = hte_symbol_heap + , cs_predef_symbols = predefs + , cs_error = gs_error + , cs_x = + { x_needed_modules = 0 + , x_main_dcl_module_n = main_dcl_module_n + , x_is_dcl_module = False + , x_type_var_position = 0 } } - #! (dcl_modules, gs_modules, gs_heaps, cs) = - create_class_dictionaries 0 dcl_modules gs_modules gs_heaps cs + #! (gs_dcl_modules, gs_modules, gs_heaps, cs) = + create_class_dictionaries 0 gs_dcl_modules gs_modules gs_heaps cs // create_class_dictionaries1 main_dcl_module_n dcl_modules gs_modules gs_heaps cs //---> "*** create class dictionaries" @@ -223,11 +239,14 @@ convertGenerics #! index_range = {ir_from = gs.gs_first_fun, ir_to = gs.gs_last_fun} = ( gs_groups, gs_modules, gs_fun_defs, index_range, gs_td_infos, gs_heaps, hash_table, - cs_predef_symbols, dcl_modules, cs_error) + cs_predef_symbols, gs_dcl_modules, gs_opt_dcl_icl_conversions, cs_error) where - return {gs_modules, gs_groups, gs_fun_defs, gs_td_infos, gs_gtd_infos, gs_heaps, gs_main_dcl_module_n, gs_error} predefs hash_table dcl_modules + return { gs_modules, gs_groups, gs_fun_defs, gs_td_infos, gs_gtd_infos, + gs_heaps, gs_main_dcl_module_n, gs_dcl_modules, gs_opt_dcl_icl_conversions, gs_error} + predefs hash_table = ( gs_groups, gs_modules, gs_fun_defs, {ir_from=0,ir_to=0}, - gs_td_infos, gs_heaps, hash_table, predefs, dcl_modules, gs_error) + gs_td_infos, gs_heaps, hash_table, predefs, gs_dcl_modules, + gs_opt_dcl_icl_conversions, gs_error) create_class_dictionaries module_index dcl_modules modules heaps cs #! size_of_modules = size modules @@ -321,7 +340,7 @@ where #! 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)) + , ins_ident = makeIdent ins_ident.id_name } #! (is_partial, gs_fun_defs) = check_if_partial instance_def gs_predefs gs_fun_defs @@ -333,7 +352,8 @@ where , gs_modules = gs_modules , gs_fun_defs = gs_fun_defs , gs_heaps = gs_heaps - , gs_error = gs_error } + , gs_error = gs_error + } = ([], instance_defs, gs) #! gs_heaps = check_cons_instance generic_def instance_def it_type gs_predefs gs_heaps @@ -455,10 +475,10 @@ where = (True, gs_modules, gs_error) # (class_def=:{class_members}, gs_modules) = - getClassDef glob_module glob_object.ds_index gs_modules + getClassDef glob_module glob_object.ds_index gs_modules # (member_def, gs_modules) = getMemberDef glob_module class_def.class_members.[0].ds_index gs_modules - | member_def.me_type.st_arity <> instance_def.ins_members.[0].ds_arity + | member_def.me_type.st_arity <> instance_def.ins_members.[0].ds_arity && instance_def.ins_members.[0].ds_arity <> (-1) # gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) "generic instance function has incorrect arity" gs_error = (False, gs_modules, gs_error) = (True, gs_modules, gs_error) @@ -475,7 +495,7 @@ where # (generic_defs, gs_modules) = gs_modules ! [module_index].com_generic_defs #! size_generic_defs = size generic_defs | generic_index == size_generic_defs - = collect_in_modules (inc module_index) 0 gs_modules + = collect_in_modules (inc module_index) 0 gs_modules # {gen_type={gt_type={st_args, st_result}}} = generic_defs . [generic_index] # (types, gs_modules) = collect_in_modules module_index (inc generic_index) gs_modules = ([at_type \\ {at_type} <- [st_result:st_args]] ++ types, gs_modules) @@ -1167,9 +1187,69 @@ where = ([], [], instance_defs, gs) | instance_def.ins_generate - #! (fun_def, fun_def_sym, gs) = build_instance_fun instance_def gs + #! (fun_def, fun_def_sym, gs) = build_instance_fun instance_def gs #! instance_def = { instance_def & ins_members = {fun_def_sym} } #! instance_defs = {instance_defs & [instance_index] = instance_def} + + # (dcl_fun_index, gs) = get_dcl_member_index instance_index gs + with + get_dcl_member_index icl_instance_index gs=:{gs_dcl_modules, gs_main_dcl_module_n} + # ({dcl_conversions, dcl_common}, gs_dcl_modules) = gs_dcl_modules![gs_main_dcl_module_n] + # gs = {gs & gs_dcl_modules = gs_dcl_modules} + # dcl_index = case dcl_conversions of + No -> NoIndex + Yes conversion_table + # instance_table = conversion_table.[cInstanceDefs] + # dcl_instance_index = find_dcl_instance_index icl_instance_index 0 instance_table + | dcl_instance_index == NoIndex + -> NoIndex + | otherwise + # dcl_instance = dcl_common.com_instance_defs.[dcl_instance_index] + # dcl_index = dcl_instance.ins_members.[0].ds_index + -> dcl_index + = (dcl_index, gs) + where + find_dcl_instance_index icl_instance_index index instance_table + | index == size instance_table + = NoIndex + | instance_table.[index] == icl_instance_index + = index + | otherwise + = find_dcl_instance_index icl_instance_index (inc index) instance_table + + # gs = case dcl_fun_index of + NoIndex -> gs + _ + # gs = update_dcl_icl_conversions dcl_fun_index fun_def_sym.ds_index gs + # gs = update_dcl_fun_conversions module_index dcl_fun_index fun_def_sym.ds_index gs + -> gs + with + update_dcl_icl_conversions dcl_index icl_index gs=:{gs_opt_dcl_icl_conversions=No} + = gs + update_dcl_icl_conversions dcl_index icl_index gs=:{gs_opt_dcl_icl_conversions=Yes cs} + #! (table_size, cs) = usize cs + | dcl_index < table_size + = {gs & gs_opt_dcl_icl_conversions=Yes {cs & [dcl_index] = icl_index}} + //---> ("update dcl-to-icl conversion table", dcl_index, icl_index) + = {gs & gs_opt_dcl_icl_conversions=Yes cs} + //---> ("update dcl-to-icl conversion table: index does not fit", dcl_index, icl_index) + + update_dcl_fun_conversions module_index dcl_index icl_index gs=:{gs_dcl_modules} + # (dcl_module=:{dcl_conversions}, gs_dcl_modules) = gs_dcl_modules ! [module_index] + # dcl_conversions = case dcl_conversions of + No -> No + Yes table + # fun_table = table.[cFunctionDefs] + # (size_fun_table, fun_table) = usize fun_table + | dcl_index < size_fun_table + # fun_table = {x \\ x <-: fun_table} + # fun_table = {fun_table & [dcl_index] = icl_index} + -> Yes {{x\\x<-:table} & [cFunctionDefs] = fun_table} + | otherwise + -> Yes table + # dcl_module = { dcl_module & dcl_conversions = dcl_conversions} + = {gs & gs_dcl_modules = {gs_dcl_modules & [module_index] = dcl_module }} + = ([fun_def], [{group_members = [fun_def.fun_index]}], instance_defs, gs) | supportPartialInstances && instance_def.ins_partial @@ -1250,11 +1330,10 @@ where = (instance_def, new_ins_fun_def, {gs & gs_fun_defs = gs_fun_defs, gs_heaps = gs_heaps}) build_instance_fun instance_def gs=:{gs_modules} - # {ins_class, ins_generic} = instance_def + # {ins_class, ins_generic} = instance_def # (class_def, gs_modules) = getClassDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules # (member_def, gs_modules) = getMemberDef ins_class.glob_module class_def.class_members.[0].ds_index gs_modules # (generic_def, gs_modules) = getGenericDef ins_generic.glob_module ins_generic.glob_object gs_modules - # (fun_index, group_index, gs) = newFunAndGroupIndex {gs & gs_modules=gs_modules} # fun_def_sym = { ds_ident = instance_def.ins_ident, @@ -1278,7 +1357,7 @@ buildKindConstInstances gs where build_modules :: !Index !*GenericState -> (![FunDef], ![Group], !*GenericState) - build_modules module_index gs=:{gs_modules} + build_modules module_index gs=:{gs_modules, gs_main_dcl_module_n} #! num_modules = size gs_modules | module_index == num_modules @@ -1289,9 +1368,15 @@ where # {gs_modules} = gs // add instances +/* # (common_defs=:{com_instance_defs}, gs_modules) = gs_modules ! [module_index] # com_instance_defs = arrayPlusList com_instance_defs instance_defs # gs_modules = { gs_modules & [module_index] = {common_defs & com_instance_defs = com_instance_defs}} +*/ + # (common_defs=:{com_instance_defs}, gs_modules) = gs_modules ! [gs_main_dcl_module_n] + # com_instance_defs = arrayPlusList com_instance_defs instance_defs + # gs_modules = { gs_modules & [gs_main_dcl_module_n] = {common_defs & com_instance_defs = com_instance_defs}} + = (new_funs ++ funs, new_groups ++ groups, {gs & gs_modules = gs_modules}) build_instances :: !Index !Index !*GenericState @@ -1313,7 +1398,7 @@ where # { ins_ident, ins_type, ins_pos, ins_generate, ins_is_generic, ins_generic} = instance_def - | not (/*ins_generate &&*/ ins_is_generic) + | not (ins_is_generic) = ([], [], [], {gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_heaps = gs_heaps}) # it_type = hd ins_type.it_types @@ -1410,7 +1495,7 @@ where determineMemberTypes :: !Index !Index !*GenericState -> !*GenericState determineMemberTypes module_index ins_index - gs=:{gs_modules, gs_fun_defs, gs_heaps=gs_heaps=:{hp_var_heap, hp_type_heaps}} + gs=:{gs_modules, gs_fun_defs, gs_heaps=gs_heaps=:{hp_var_heap, hp_type_heaps}, gs_dcl_modules, gs_main_dcl_module_n} # (num_modules, gs_modules) = usize gs_modules | module_index == num_modules = {gs & gs_modules = gs_modules} @@ -1421,34 +1506,95 @@ determineMemberTypes module_index ins_index | not instance_def.ins_is_generic = determineMemberTypes module_index (inc ins_index) {gs & gs_modules = gs_modules} - # {ins_class, ins_type, ins_members} = instance_def - # (class_def, gs_modules) = getClassDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules - # (member_def, gs_modules) = getMemberDef ins_class.glob_module class_def.class_members.[0].ds_index gs_modules - # {me_type, me_class_vars} = member_def - + # gs = determine_member_type module_index ins_index instance_def {gs & gs_modules = gs_modules} + = determineMemberTypes module_index (inc ins_index) gs +where + determine_member_type + module_index + ins_index + {ins_ident, ins_class, ins_type, ins_members} + gs=:{ gs_modules, + gs_fun_defs, + gs_heaps=gs_heaps=:{hp_var_heap, hp_type_heaps}, + gs_dcl_modules, + gs_main_dcl_module_n, + gs_opt_dcl_icl_conversions} + # (class_def, gs_modules) = getClassDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules + # (member_def, gs_modules) = getMemberDef ins_class.glob_module class_def.class_members.[0].ds_index gs_modules + # {me_type, me_class_vars} = member_def + + // determine type of the instance function + # (symbol_type, _, hp_type_heaps, _, _) = + determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None hp_type_heaps No No + # (st_context, hp_var_heap) = initializeContextVariables symbol_type.st_context hp_var_heap + # symbol_type = {symbol_type & st_context = st_context} + + // determine the instance function index (in icl or dcl) + # fun_index = ins_members.[0].ds_index + | fun_index == NoIndex + = abort "no generic instance function\n" - // determine type of the member instance - # (symbol_type, _, hp_type_heaps, _, _) = - determineTypeOfMemberInstance me_type me_class_vars ins_type SP_None hp_type_heaps No No - # (st_context, hp_var_heap) = initializeContextVariables symbol_type.st_context hp_var_heap - # symbol_type = {symbol_type & st_context = st_context} - - // update the instance function - # fun_index = ins_members.[0].ds_index - # (fun_def, gs_fun_defs) = gs_fun_defs![fun_index] - # fun_def = {fun_def & fun_type = (Yes symbol_type)} - - # gs_fun_defs = {gs_fun_defs & [fun_index] = fun_def} - - # gs = { gs & - gs_modules = gs_modules, - gs_fun_defs = gs_fun_defs, - gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap} - } - - = determineMemberTypes module_index (inc ins_index) gs + // update the instance function + | module_index == gs_main_dcl_module_n // icl module + # (fun_def, gs_fun_defs) = gs_fun_defs![fun_index] + # fun_def = { fun_def & fun_type = Yes symbol_type } + # gs_fun_defs = {gs_fun_defs & [fun_index] = fun_def} + + // update corresponding DCL function type, which is empty at the moment + # ({dcl_conversions}, gs_dcl_modules) = gs_dcl_modules ! [gs_main_dcl_module_n] + # (dcl_fun_index, gs_opt_dcl_icl_conversions) + = find_dcl_fun_index fun_index gs_opt_dcl_icl_conversions// XXX + with + find_dcl_fun_index icl_fun_index No + = (NoIndex /*abort "no dcl_icl conversions table\n"*/, No) + find_dcl_fun_index icl_fun_index (Yes table) + #! table1 = {x\\x<-:table} + = find_index 0 icl_fun_index table + find_index i index table + # (size_table, table) = usize table + | i == size_table + = (NoIndex /*abort ("not found dcl function index " +++ toString index)*/, Yes table) + # (x, table) = table ! [i] + | x == index + = (i /*abort ("found dcl function index " +++ toString index +++ " " +++ toString i)*/, Yes table) + = find_index (inc i) index table + + + # gs_dcl_modules = case dcl_fun_index of + NoIndex -> gs_dcl_modules + _ -> update_dcl_fun_type gs_main_dcl_module_n dcl_fun_index symbol_type gs_dcl_modules + + = { gs + & gs_modules = gs_modules + , gs_fun_defs = gs_fun_defs + , gs_dcl_modules = gs_dcl_modules + , gs_opt_dcl_icl_conversions = gs_opt_dcl_icl_conversions + , gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap} + } + | otherwise // dcl module + //---> ("update dcl instance function", ins_ident, module_index, ins_index, symbol_type) + # gs_dcl_modules = update_dcl_fun_type module_index fun_index symbol_type gs_dcl_modules + = { gs + & gs_modules = gs_modules + , gs_dcl_modules = gs_dcl_modules + , gs_heaps = {gs_heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap} + } + + update_dcl_fun_type module_index fun_index symbol_type dcl_modules + # (dcl_module=:{dcl_functions}, dcl_modules) = dcl_modules ! [module_index] + # (dcl_fun, dcl_functions) = dcl_functions ! [fun_index] + # dcl_fun = + { dcl_fun + & ft_arity = symbol_type.st_arity + , ft_type = symbol_type + } + # dcl_functions = {{x \\ x <-: dcl_functions} & [fun_index] = dcl_fun} + # dcl_module={dcl_module & dcl_functions = dcl_functions} + = {dcl_modules & [module_index] = dcl_module} + + kindOfTypeDef :: Index Index !*TypeDefInfos -> (!TypeKind, !*TypeDefInfos) kindOfTypeDef module_index td_index td_infos # ({tdi_kinds}, td_infos) = td_infos![module_index, td_index] @@ -3154,7 +3300,7 @@ copyExpr expr heaps=:{hp_var_heap, hp_expression_heap} = (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 :: !(Expression -> w:st -> u:(Expression, w:st)) !Expression w:st -> v:(Expression, w:st), [v<=w,u<=v] mapExprSt f (App app=:{app_args}) st # (app_args, st) = mapSt (mapExprSt f) app_args st = f (App { app & app_args = app_args }) st |