diff options
| author | johnvg | 2011-03-04 16:03:27 +0000 | 
|---|---|---|
| committer | johnvg | 2011-03-04 16:03:27 +0000 | 
| commit | 02c86de212cc8cc4cc179e8e0d8b95b8303995f7 (patch) | |
| tree | 9ee590647826e314053903d6d48296f0b0b01fa7 /frontend | |
| parent | delete old implementation of generics (diff) | |
remove shorthand and iso functions from generic ranges,
first all main instances are build, then all shorthand instances,
shorthand instances directly call the main instance (SK_Function instead of SK_Generic),
call toGeneric.. and fromGeneric.. functions directly if possible, instead of iso..
git-svn-id: https://svn.cs.ru.nl/repos/clean-compiler/trunk@1877 1f8540f1-abd5-4d5b-9d24-4c5ce8603e2d
Diffstat (limited to 'frontend')
| -rw-r--r-- | frontend/generics1.icl | 371 | ||||
| -rw-r--r-- | frontend/syntax.dcl | 6 | 
2 files changed, 207 insertions, 170 deletions
diff --git a/frontend/generics1.icl b/frontend/generics1.icl index d8bcc67..b9aa85b 100644 --- a/frontend/generics1.icl +++ b/frontend/generics1.icl @@ -148,7 +148,7 @@ where  		#! gs = convertGenericTypeContexts gs -		= ([iso_range,instance_range], gs) +		= ([/*iso_range,*/instance_range], gs)  // clear stuff that might have been left over  // from compilation of other icl modules @@ -231,16 +231,11 @@ buildGenericRepresentations gs=:{gs_main_module, gs_modules, gs_funs, gs_groups}  	= (range, fg_bimap_functions, {gs & gs_funs = gs_funs, gs_groups = gs_groups})  where  	build_generic_representation  -			case_def=:{gc_type_cons=TypeConsSymb {type_index={glob_module,glob_object}, type_ident}, -			 	gc_ident, gc_body=GCB_FunIndex fun_index, gc_pos}  -			(funs_and_groups, gs=:{gs_modules, gs_td_infos, gs_funs}) -		#! (type_def, gs_modules) = gs_modules![glob_module].com_type_defs.[glob_object] -		#! (td_info, gs_td_infos) = gs_td_infos![glob_module, glob_object] -		#! type_def_gi = {gi_module=glob_module,gi_index=glob_object} -		#! ({fun_body}, gs_funs) = gs_funs ! [fun_index] -		#! gs = {gs & gs_modules = gs_modules, gs_td_infos = gs_td_infos, gs_funs = gs_funs} -		 -		= case fun_body of +			{gc_type_cons=TypeConsSymb {type_index={glob_module,glob_object},type_ident},gc_body=GCB_FunIndex fun_index,gc_ident,gc_pos} +			(funs_and_groups, gs) +		# (type_def,gs) = gs!gs_modules.[glob_module].com_type_defs.[glob_object] +		# (td_info, gs) = gs!gs_td_infos.[glob_module,glob_object] +		= case gs.gs_funs.[fun_index].fun_body of  			TransformedBody _   				// does not need a generic representation  				-> (funs_and_groups, gs) @@ -258,13 +253,11 @@ where  							Yes _  								-> (funs_and_groups, gs)	// generic representation is already built  							No -								#! (gen_type_rep, funs_and_groups, gs) +								# type_def_gi = {gi_module=glob_module,gi_index=glob_object} +								# (gen_type_rep, funs_and_groups, gs)  									= buildGenericTypeRep type_def_gi funs_and_groups gs - -								#! td_info = {td_info & tdi_gen_rep = Yes gen_type_rep} -								# {gs_td_infos} = gs	 -								#! gs_td_infos = {gs_td_infos & [glob_module, glob_object] = td_info}  -								# gs = {gs & gs_td_infos = gs_td_infos} +								# td_info = {td_info & tdi_gen_rep = Yes gen_type_rep} +								# gs = {gs & gs_td_infos.[glob_module,glob_object] = td_info}  								-> (funs_and_groups, gs)  	build_generic_representation _ st = st @@ -307,7 +300,7 @@ buildGenericTypeRep type_index funs_and_groups  				, gs_genh = hp_generic_heap  				, gs_exprh = hp_expression_heap  		   } -	= ({gtr_type=atype,gtr_iso=iso_fun_ds}, funs_and_groups, gs) +	= ({gtr_type=atype,gtr_iso=iso_fun_ds,gtr_to=to_fun_ds,gtr_from=from_fun_ds}, funs_and_groups, gs)  //	the structure type @@ -1168,49 +1161,44 @@ build_case_expr case_patterns heaps  // build kind indexed classes   buildClasses :: !*GenericState -> *GenericState -buildClasses gs=:{gs_modules, gs_main_module} -	#! (common_defs=:{com_class_defs, com_member_defs}, gs_modules) = gs_modules ! [gs_main_module] +buildClasses gs=:{gs_main_module} +	#! ({com_class_defs,com_member_defs},gs) = gs!gs_modules.[gs_main_module]  	#! num_classes = size com_class_defs  	#! num_members = size com_member_defs -	#! ((classes, members, new_num_classes, new_num_members), gs=:{gs_modules})  -		= build_modules 0 ([], [], num_classes, num_members) {gs & gs_modules = gs_modules} +	#! ((classes, members, new_num_classes, new_num_members), gs) +		= build_modules 0 ([], [], num_classes, num_members) gs  	// obtain common definitions again because com_gencase_defs are updated  -	#! (common_defs, gs_modules) = gs_modules![gs_main_module] +	#! (common_defs,gs) = gs!gs_modules.[gs_main_module]  	# common_defs = {common_defs & com_class_defs = arrayPlusRevList com_class_defs classes  								 , com_member_defs = arrayPlusRevList com_member_defs members} -	#! (common_defs, gs=:{gs_modules})  -		= build_class_dictionaries common_defs {gs & gs_modules = gs_modules} -	 -	#! gs_modules = {gs_modules & [gs_main_module] = common_defs}	 -	= {gs & gs_modules = gs_modules}   +	#! (common_defs, gs) +		= build_class_dictionaries common_defs gs + +	= {gs & gs_modules.[gs_main_module] = common_defs}  where  	build_modules :: !Index (![ClassDef], ![MemberDef], !Int, !Int) !*GenericState  		-> ((![ClassDef], ![MemberDef], !Int, !Int), !*GenericState) -	build_modules module_index st gs=:{gs_modules} +	build_modules module_index st gs=:{gs_modules,gs_used_modules}  		| module_index == size gs_modules -			= (st, {gs & gs_modules = gs_modules}) -			#! (common_defs=:{com_gencase_defs}, gs_modules) = gs_modules![module_index]  -			#! (com_gencase_defs, st, gs=:{gs_modules})  -				= build_module module_index com_gencase_defs st {gs & gs_modules=gs_modules}  -			#! gs_modules = {gs_modules & [module_index] = {common_defs & com_gencase_defs = com_gencase_defs}} -			= build_modules (inc module_index) st {gs & gs_modules = gs_modules} - -	build_module module_index com_gencase_defs st gs=:{gs_used_modules} -		| inNumberSet module_index gs_used_modules -			#! com_gencase_defs = {x\\x<-:com_gencase_defs}  -			= build_module1 module_index 0 com_gencase_defs st gs -			= (com_gencase_defs, st, gs) - -	build_module1 module_index index com_gencase_defs st gs +			= (st, gs) +		| not (inNumberSet module_index gs_used_modules) +			= build_modules (inc module_index) st gs		 +			#! ({com_gencase_defs},gs_modules) = gs_modules![module_index]  +			#! (com_gencase_defs, st, gs)  +				= build_module module_index 0 {x\\x<-:com_gencase_defs} st {gs & gs_modules=gs_modules} +			#! gs = {gs & gs_modules.[module_index].com_gencase_defs = com_gencase_defs} +			= build_modules (inc module_index) st gs + +	build_module module_index index com_gencase_defs st gs  		| index == size com_gencase_defs  			= (com_gencase_defs, st, gs)  			#! (gencase, com_gencase_defs) = com_gencase_defs ! [index]  			#! (gencase, st, gs) = on_gencase module_index index gencase st gs  			#! com_gencase_defs = {com_gencase_defs & [index] = gencase} 	 -			= build_module1 module_index (inc index) com_gencase_defs st gs +			= build_module module_index (inc index) com_gencase_defs st gs  	on_gencase :: !Index !Index  			!GenericCaseDef (![ClassDef], ![MemberDef], !Index, Index) !*GenericState @@ -1233,7 +1221,7 @@ where  			, KindArrow [KindConst, KindConst]   			: subkinds]  		#! (st, gs) = foldSt (build_class_if_needed gen_def) kinds (st, gs) -		#! gencase = { gencase & gc_kind = kind }				 +		#! gencase = {gencase & gc_kind = kind}				  		= (gencase, st, gs)  	build_class_if_needed :: !GenericDef !TypeKind ((![ClassDef], ![MemberDef], !Index, Index), *GenericState) @@ -1517,7 +1505,12 @@ convertGenericCases bimap_functions  	#! instance_info = (first_instance_index, [])  	#! (gs_modules, gs_dcl_modules, (fun_info, instance_info, gs_funs, gs_td_infos, heaps, gs_error))  -		= convert_modules 0 gs_modules gs_dcl_modules (fun_info, instance_info, gs_funs, gs_td_infos, heaps, gs_error) +		= build_main_instances_in_modules 0 gs_modules gs_dcl_modules (fun_info, instance_info, gs_funs, gs_td_infos, heaps, gs_error) + +	#! first_shorthand_function_index = fun_info.fg_fun_index + +	#! (gs_modules, gs_dcl_modules, (fun_info, instance_info, heaps, gs_error))  +		= build_shorthand_instances_in_modules 0 gs_modules gs_dcl_modules (fun_info, instance_info, heaps, gs_error)  	#! {fg_fun_index, fg_funs=new_funs, fg_groups=new_groups} = fun_info  	#! gs_funs = arrayPlusRevList gs_funs new_funs @@ -1529,7 +1522,7 @@ convertGenericCases bimap_functions  	#! main_common_defs = {main_common_defs & com_instance_defs = com_instance_defs}	  	#! gs_modules = {gs_modules & [gs_main_module] = main_common_defs} -	#! instance_fun_range = {ir_from=first_fun_index, ir_to=fg_fun_index}	  +	#! instance_fun_range = {ir_from=first_fun_index, ir_to=first_shorthand_function_index}  	# {hp_expression_heap, hp_var_heap, hp_generic_heap, hp_type_heaps={th_vars, th_attrs}} = heaps  	# gs = {gs	& gs_modules = gs_modules @@ -1546,102 +1539,107 @@ convertGenericCases bimap_functions  		   }  	= (instance_fun_range, gs)  where -	convert_modules :: !Index +	build_main_instances_in_modules :: !Index  			!*{#CommonDefs} !*{#DclModule} (FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)  		-> (!*{#CommonDefs}, *{#DclModule},(FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)) -	convert_modules module_index modules dcl_modules st +	build_main_instances_in_modules module_index modules dcl_modules st  		| module_index == size modules  			= (modules, dcl_modules, st) -			#! (common_defs=:{com_gencase_defs}, modules) = modules ! [module_index] -			#! (dcl_module=:{dcl_functions}, dcl_modules) = dcl_modules ! [module_index] -			#! (dcl_functions, modules, st)  -				= convert_module module_index com_gencase_defs {x\\x<-:dcl_functions} modules st   -			#! dcl_modules = {dcl_modules & [module_index] = {dcl_module & dcl_functions = dcl_functions}}  -			= convert_modules (inc module_index) modules dcl_modules st - -	convert_module module_index com_gencase_defs dcl_functions modules st -		| inNumberSet module_index gs_used_modules		  -			#! dcl_functions = {x\\x<-:dcl_functions} -			= foldArraySt (convert_gencase module_index)  -				com_gencase_defs (dcl_functions, modules, st) -			= (dcl_functions, modules, st) - -	convert_gencase :: !Index !GenericCaseDef -			(!*{#FunType},!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)) -		-> 	(!*{#FunType},!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)) -	convert_gencase module_index gencase=:{gc_ident, gc_type} st -		#! st = build_main_instance module_index gencase st -		= build_shorthand_instances module_index gencase st +		| not (inNumberSet module_index gs_used_modules) +			= build_main_instances_in_modules (inc module_index) modules dcl_modules st +			#! (com_gencase_defs,modules) = modules![module_index].com_gencase_defs +			#! (dcl_functions,dcl_modules) = dcl_modules![module_index].dcl_functions +			#! (dcl_functions, modules, st) +				= build_main_instances_in_module module_index com_gencase_defs {x\\x<-:dcl_functions} modules st   +			#! dcl_modules = {dcl_modules & [module_index].dcl_functions = dcl_functions}  +			= build_main_instances_in_modules (inc module_index) modules dcl_modules st +	where +		build_main_instances_in_module module_index com_gencase_defs dcl_functions modules st +			= foldArraySt (build_main_instance module_index) com_gencase_defs (dcl_functions, modules, st) +	build_main_instance :: !Index !GenericCaseDef +			(!*{#FunType} ,!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin)) +		->	(!*{#FunType} ,!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*{#FunDef}, !*TypeDefInfos, !*Heaps, !*ErrorAdmin))					  	build_main_instance module_index   			gencase=:{gc_ident, gc_kind, gc_generic, gc_pos, gc_type, gc_type_cons, gc_body = GCB_FunIndex fun_index}   			(dcl_functions, modules, (fun_info, ins_info, fun_defs, td_infos, heaps, error)) -		#! ({gen_classes}, modules, heaps)  -			= get_generic_info gc_generic modules heaps			 -		#  (Yes class_info)  -			= lookupGenericClassInfo gc_kind gen_classes -		 +		#! (class_info, (modules, heaps)) = get_class_for_kind gc_generic gc_kind (modules, heaps)  		#! ({class_members}, modules) = modules![class_info.gci_module].com_class_defs.[class_info.gci_class]	  		#! (member_def, modules) = modules![class_info.gci_module].com_member_defs.[class_members.[0].ds_index] -		#! ins_type = -			{	it_vars	= case gc_type_cons of  -					TypeConsVar tv 	-> [tv] -					_				-> [] -			,	it_types = [gc_type] -			,	it_attr_vars = [] -			,	it_context = [] -			} - +		# it_vars = case gc_type_cons of  +						TypeConsVar tv 	-> [tv] +						_				-> [] +		#! ins_type = {it_vars = it_vars, it_types = [gc_type], it_attr_vars = [], it_context = []}  		#! (fun_type, heaps, error)  			= determine_type_of_member_instance member_def ins_type heaps error +		# fun_ident = genericIdentToFunIdent gc_ident.id_name gc_type_cons +  		#! (dcl_functions, heaps)  -			= update_dcl_function fun_index gencase fun_type dcl_functions heaps +			= update_dcl_function fun_index fun_ident fun_type dcl_functions heaps  		#! (fun_info, fun_defs, td_infos, modules, heaps, error) -				= update_icl_function_if_needed module_index fun_index gencase fun_type -						fun_info fun_defs td_infos modules heaps error +			= update_icl_function_if_needed module_index fun_index fun_ident gencase fun_type +				fun_info fun_defs td_infos modules heaps error -		#! ins_info = build_exported_class_instance class_info.gci_class gencase module_index ins_type ins_info +		#! ins_info = build_exported_class_instance class_info.gci_class gc_ident gc_pos gc_kind fun_ident fun_index module_index ins_type ins_info  		= (dcl_functions, modules, (fun_info, ins_info, fun_defs, td_infos, heaps, error)) +	build_shorthand_instances_in_modules :: !Index +			!*{#CommonDefs} !*{#DclModule} (FunsAndGroups, (!Index, ![ClassInstance]), !*Heaps, !*ErrorAdmin) +		-> (!*{#CommonDefs}, *{#DclModule},(FunsAndGroups, (!Index, ![ClassInstance]), !*Heaps, !*ErrorAdmin)) +	build_shorthand_instances_in_modules module_index modules dcl_modules st +		| module_index == size modules +			= (modules, dcl_modules, st) +		| not (inNumberSet module_index gs_used_modules) +			= build_shorthand_instances_in_modules (inc module_index) modules dcl_modules st +			#! (com_gencase_defs,modules) = modules![module_index].com_gencase_defs +			#! (modules, st) +				= build_shorthand_instances_in_module module_index com_gencase_defs modules st   +			= build_shorthand_instances_in_modules (inc module_index) modules dcl_modules st +	where +		build_shorthand_instances_in_module module_index com_gencase_defs modules st +			= foldArraySt (build_shorthand_instances module_index) com_gencase_defs (modules, st) + +	build_shorthand_instances :: !Index !GenericCaseDef +			(!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*Heaps, !*ErrorAdmin)) +		->	(!*Modules, (FunsAndGroups, (!Index, ![ClassInstance]), !*Heaps, !*ErrorAdmin))					  	build_shorthand_instances module_index gencase=:{gc_kind=KindConst} st	  		= st -	build_shorthand_instances  -			module_index -			gencase=:{gc_kind=KindArrow kinds, gc_type, gc_generic, gc_ident, gc_pos}  +	build_shorthand_instances module_index +			gencase=:{gc_kind=KindArrow kinds,gc_body=GCB_FunIndex fun_index,gc_type,gc_type_cons,gc_generic,gc_ident,gc_pos}  			st		  		= foldSt build_shorthand_instance [1 .. length kinds] st -	where  +	where  		build_shorthand_instance num_args  -			(dcl_functions, modules, (fun_info, ins_info, fun_defs, td_infos, heaps, error)) +			(modules, (fun_info, ins_info, heaps, error))  			#! (consumed_kinds, rest_kinds) = splitAt num_args kinds 		  			#! this_kind = case rest_kinds of  				[] -> KindConst  				_  -> KindArrow rest_kinds  -			#! (class_info, (modules, heaps))  -				= get_class_for_kind gc_generic this_kind (modules, heaps) +			#! (class_info, (modules, heaps)) = get_class_for_kind gc_generic this_kind (modules, heaps)  			#! (arg_class_infos, (modules, heaps))   				= mapSt (get_class_for_kind gc_generic) consumed_kinds (modules, heaps) -			#! ({class_members}, modules)  -				= modules ! [class_info.gci_module].com_class_defs.[class_info.gci_class]	 -			#! (member_def, modules)  -				= modules ! [class_info.gci_module].com_member_defs.[class_members.[0].ds_index] +			#! ({class_members}, modules) = modules![class_info.gci_module].com_class_defs.[class_info.gci_class]	 +			#! (member_def, modules) = modules![class_info.gci_module].com_member_defs.[class_members.[0].ds_index]  			#! (ins_type, heaps)   				= build_instance_type gc_type arg_class_infos heaps  			#! (fun_type, heaps, error)  				= determine_type_of_member_instance member_def ins_type heaps error + +			# fun_ident = genericIdentToFunIdent gc_ident.id_name gc_type_cons +  			#! (memfun_ds, fun_info, heaps)  -				= build_shorthand_instance_member module_index this_kind gencase fun_type arg_class_infos fun_info heaps +				= build_shorthand_instance_member module_index this_kind gencase fun_index fun_ident fun_type arg_class_infos fun_info heaps  			#! ins_info   				= build_class_instance this_kind class_info.gci_class gencase memfun_ds ins_type ins_info -			= (dcl_functions, modules, (fun_info, ins_info, fun_defs, td_infos, heaps, error)) +			= (modules, (fun_info, ins_info, heaps, error))  		build_instance_type type class_infos heaps=:{hp_type_heaps=th=:{th_vars},hp_var_heap}  			#! arity = length class_infos @@ -1692,7 +1690,7 @@ where  					}  				= (type_context, hp_var_heap)	 -		build_shorthand_instance_member module_index this_kind gencase=:{gc_generic, gc_ident, gc_kind, gc_pos} st class_infos fun_info heaps +		build_shorthand_instance_member module_index this_kind {gc_generic, gc_ident, gc_kind, gc_pos} fun_index fun_ident st class_infos fun_info heaps  			# function_has_generic_info_arg = case this_kind of KindArrow [KindConst] -> True ; _ -> False   			#! arg_var_names = ["x" +++ toString i \\ i <- [1..st.st_arity-(if function_has_generic_info_arg 1 0)]]  			#! (arg_var_exprs, arg_vars, heaps) = buildVarExprs arg_var_names heaps @@ -1704,7 +1702,7 @@ where  			# (gen_exprs, heaps) = mapSt (build_generic_app gc_generic gc_ident) class_infos heaps  			#! arg_exprs = gen_exprs ++ arg_var_exprs -	 +  			# (arg_vars,heaps)  				= case function_has_generic_info_arg of  					True @@ -1718,12 +1716,12 @@ where  				= case gc_kind of  					KindArrow [KindConst]  						# (generic_info_expr, heaps) = buildPredefConsApp PD_NoGenericInfo [] gs_predefs heaps			 -						-> buildGenericApp gc_generic.gi_module gc_generic.gi_index gc_ident gc_kind [generic_info_expr:arg_exprs] heaps +						-> buildFunApp2 module_index fun_index fun_ident [generic_info_expr:arg_exprs] heaps  					_ -						-> buildGenericApp gc_generic.gi_module gc_generic.gi_index gc_ident gc_kind arg_exprs heaps +						-> buildFunApp2 module_index fun_index fun_ident arg_exprs heaps  			#! (st, heaps) = fresh_symbol_type st heaps -		 +  			#! (fun_ds, fun_info)   				= buildFunAndGroup fun_name arg_vars body_expr (Yes st) gs_main_module gc_pos fun_info @@ -1749,13 +1747,10 @@ where  				}  			= (inc ins_index, [ins:instances]) -	get_generic_info {gi_module, gi_index} modules heaps=:{hp_generic_heap} +	get_class_for_kind :: !GlobalIndex !TypeKind !(!*{#CommonDefs},!*Heaps) -> (!GenericClassInfo,!(!*{#CommonDefs},!*Heaps)) +	get_class_for_kind {gi_module, gi_index} kind (modules,heaps=:{hp_generic_heap})  		#! ({gen_info_ptr}, modules) = modules![gi_module].com_generic_defs.[gi_index] -		#! (gen_info, hp_generic_heap) = readPtr gen_info_ptr hp_generic_heap	 -		= (gen_info, modules, {heaps & hp_generic_heap = hp_generic_heap}) - -	get_class_for_kind generic_gi kind (modules, heaps) -		#! ({gen_classes}, modules, heaps) = get_generic_info generic_gi modules heaps +		#! ({gen_classes}, hp_generic_heap) = readPtr gen_info_ptr hp_generic_heap  		# (Yes class_info) = lookupGenericClassInfo kind gen_classes  		= (class_info, (modules, heaps))	 @@ -1770,33 +1765,29 @@ where  		#! heaps = {heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap}  		= (symbol_type, heaps, error) -	update_dcl_function :: !Index !GenericCaseDef !SymbolType !*{#FunType} !*Heaps -> (!*{#FunType}, !*Heaps) -	update_dcl_function fun_index {gc_ident, gc_type_cons} symbol_type dcl_functions heaps  +	update_dcl_function :: !Index !Ident !SymbolType !*{#FunType} !*Heaps -> (!*{#FunType}, !*Heaps) +	update_dcl_function fun_index fun_ident symbol_type dcl_functions heaps   		| fun_index < size dcl_functions  			#! (symbol_type, heaps) = fresh_symbol_type symbol_type heaps			  			#! (fun, dcl_functions) = dcl_functions![fun_index] -			#! fun = { fun	& ft_ident = genericIdentToFunIdent gc_ident.id_name gc_type_cons +			#! fun = {fun	& ft_ident = fun_ident  							, ft_type = symbol_type  							, ft_arity = symbol_type.st_arity}  			#! dcl_functions = {dcl_functions & [fun_index] = fun}  			= (dcl_functions, heaps)  			= (dcl_functions, heaps) -	update_icl_function_if_needed module_index fun_index gencase fun_type funs_and_groups fun_defs td_infos modules heaps error +	update_icl_function_if_needed module_index fun_index fun_ident gencase fun_type funs_and_groups fun_defs td_infos modules heaps error  		| module_index == gs_main_module  // current module -			#! (funs_and_groups, fun_defs, td_infos, modules, heaps, error) -				= update_icl_function fun_index gencase fun_type funs_and_groups fun_defs td_infos modules heaps error -			= (funs_and_groups, fun_defs, td_infos, modules, heaps, error) +			= update_icl_function fun_index fun_ident gencase fun_type funs_and_groups fun_defs td_infos modules heaps error  			= (funs_and_groups, fun_defs, td_infos, modules, heaps, error) -	update_icl_function ::  -			!Index !GenericCaseDef !SymbolType +	update_icl_function :: !Index !Ident !GenericCaseDef !SymbolType  			!FunsAndGroups !*{#FunDef} !*TypeDefInfos !*{#CommonDefs} !*Heaps !*ErrorAdmin   		-> (!FunsAndGroups,!*{#FunDef},!*TypeDefInfos,!*{#CommonDefs},!*Heaps,!*ErrorAdmin) -	update_icl_function fun_index gencase=:{gc_ident,gc_type_cons,gc_kind,gc_pos} st funs_and_groups fun_defs td_infos modules heaps error +	update_icl_function fun_index fun_ident gencase=:{gc_ident,gc_type_cons,gc_kind,gc_pos} st funs_and_groups fun_defs td_infos modules heaps error  		#! (st, heaps) = fresh_symbol_type st heaps  		#! (fun=:{fun_body, fun_arity}, fun_defs) = fun_defs![fun_index] 		 -		#! fun_ident = genericIdentToFunIdent gc_ident.id_name gc_type_cons  		= case fun_body of   			TransformedBody {tb_args,tb_rhs}	// user defined case  				-> case gc_kind of @@ -1827,8 +1818,7 @@ where  				  funs_and_groups = {funs_and_groups & fg_group_index=fg_group_index+1,fg_groups=[group:fg_groups]}  				-> (funs_and_groups, fun_defs, td_infos, modules, heaps, error) -	build_exported_class_instance class_index {gc_ident,gc_pos,gc_type_cons,gc_kind,gc_body=GCB_FunIndex fun_index} fun_module_index ins_type (ins_index, instances) -		# fun_ident = genericIdentToFunIdent gc_ident.id_name gc_type_cons +	build_exported_class_instance class_index gc_ident gc_pos gc_kind fun_ident fun_index fun_module_index ins_type (ins_index, instances)  		# class_ident = genericIdentToClassIdent gc_ident.id_name gc_kind  		# class_ds = {ds_index = class_index, ds_arity=1, ds_ident=class_ident}  		#! ins =  @@ -1856,7 +1846,7 @@ buildGenericCaseBody ::  		!FunsAndGroups, !*TypeDefInfos,!*{#CommonDefs},!*Heaps,!*ErrorAdmin)  buildGenericCaseBody main_module_index gc=:{gc_type_cons=TypeConsSymb {type_ident,type_index},gc_kind,gc_generic} 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] 		 +	#! (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]  	# (gen_type_rep=:{gtr_iso, gtr_type}) = case tdi_gen_rep of  		Yes x -> x @@ -1903,13 +1893,13 @@ where  	// adaptor that converts a function for the generic representation into a   	// function for the type itself -	build_adaptor_expr {gc_ident, gc_pos} {gen_type, gen_vars, gen_info_ptr} {gtr_iso} original_arg_exprs funs_and_groups modules td_infos heaps error +	build_adaptor_expr {gc_ident, 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  		#! (var_kinds, heaps) = get_var_kinds gen_info_ptr heaps		  		#! non_gen_var_kinds = drop (length gen_vars) var_kinds    		#! non_gen_vars = gen_type.st_vars -- gen_vars	  		#! (gen_env, heaps)  -			= build_gen_env gtr_iso gen_vars heaps +			= build_gen_env gtr_iso gtr_to gtr_from gen_vars heaps  		#! (non_gen_env, funs_and_groups, heaps)  			= build_non_gen_env non_gen_vars non_gen_var_kinds funs_and_groups heaps  		#! spec_env = gen_env ++ non_gen_env	 @@ -1937,15 +1927,14 @@ where  		curry_symbol_type {st_args, st_result}  			= foldr (\x y -> makeAType (x --> y) TA_Multi) st_result st_args 	 -		build_gen_env :: !DefinedSymbol ![TypeVar] !*Heaps -> (![(!TypeVar, !Expression)], !*Heaps) -		build_gen_env gtr_iso gen_vars heaps  +		build_gen_env :: !DefinedSymbol !DefinedSymbol !DefinedSymbol ![TypeVar] !*Heaps -> (![(!TypeVar, !TypeVarInfo)], !*Heaps) +		build_gen_env gtr_iso gtr_to gtr_from gen_vars heaps   			= mapSt build_iso_expr gen_vars heaps  		where  			build_iso_expr gen_var heaps  -				#! (expr, heaps) = buildFunApp main_module_index gtr_iso [] heaps -				= ((gen_var, expr), heaps) +				= ((gen_var, TVI_Iso gtr_iso gtr_to gtr_from), heaps) -		build_non_gen_env :: ![TypeVar] ![TypeKind] FunsAndGroups !*Heaps -> (![(!TypeVar, !Expression)], !FunsAndGroups, !*Heaps) +		build_non_gen_env :: ![TypeVar] ![TypeKind] FunsAndGroups !*Heaps -> (![(!TypeVar, !TypeVarInfo)], !FunsAndGroups, !*Heaps)  		build_non_gen_env non_gen_vars kinds funs_and_groups heaps  			= zipWithSt2 build_bimap_expr non_gen_vars kinds funs_and_groups heaps  		where @@ -1953,23 +1942,23 @@ where  			build_bimap_expr non_gen_var KindConst funs_and_groups heaps  				# (expr, funs_and_groups, heaps)  					= bimap_id_expression main_module_index predefs funs_and_groups heaps -				= ((non_gen_var, expr), funs_and_groups, heaps) +				= ((non_gen_var, TVI_Expr expr), funs_and_groups, heaps)  			build_bimap_expr non_gen_var kind=:(KindArrow [KindConst]) funs_and_groups heaps  				# (generic_info_expr, heaps) = build_generic_info_expr heaps  				#! (expr, heaps)  					= buildGenericApp bimap_module bimap_index bimap_ident kind [generic_info_expr] heaps		 -				= ((non_gen_var, expr), funs_and_groups, heaps) +				= ((non_gen_var, TVI_Expr expr), funs_and_groups, heaps)  			build_bimap_expr non_gen_var kind funs_and_groups heaps  				#! (expr, heaps)  					= buildGenericApp bimap_module bimap_index bimap_ident kind [] heaps		 -				= ((non_gen_var, expr), funs_and_groups, heaps) +				= ((non_gen_var, TVI_Expr expr), funs_and_groups, heaps)  			build_generic_info_expr heaps  				= buildPredefConsApp PD_NoGenericInfo [] predefs heaps  	// generic function specialzied to the generic representation of the type  	build_specialized_expr {gc_ident, gc_pos, gc_generic} gtr_type td_args generated_arg_exprs funs_and_groups td_infos heaps error -		#! spec_env = [(atv_variable, expr) \\ {atv_variable} <- td_args & expr <- generated_arg_exprs] +		#! 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 @@ -2171,7 +2160,7 @@ where  specializeGeneric ::  		!GlobalIndex			// generic index  		!GenTypeStruct 			// type to specialize to -		![(TypeVar, Expression)] // specialization environment +		![(TypeVar, TypeVarInfo)] // specialization environment  		!Ident					// generic/generic case  		!Position				// of generic case  		!Index 					// main_module index @@ -2230,8 +2219,14 @@ where  		= (EE, (td_infos, heaps, error))  	specialize_type_var tv=:{tv_info_ptr} (td_infos, heaps=:{hp_type_heaps=th=:{th_vars}}, error)		 -		#! (TVI_Expr expr, th_vars) = readPtr tv_info_ptr th_vars -		= (expr, (td_infos, {heaps & hp_type_heaps = {th & th_vars = 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, (td_infos, heaps, error)) +			TVI_Iso iso_ds to_ds from_ds +				# (expr,heaps) = buildFunApp main_module_index iso_ds [] heaps +				-> (expr, (td_infos, heaps, error))  	build_generic_app kind=:(KindArrow [KindConst]) arg_exprs gen_index gen_ident predefs (td_infos, heaps, error)  		# (generic_info_expr, heaps) = buildPredefConsApp PD_NoGenericInfo [] predefs heaps		 @@ -2250,7 +2245,7 @@ where  specialize_generic_bimap ::  		!GlobalIndex			// generic index  		!GenTypeStruct 			// type to specialize to -		![(TypeVar, Expression)] // specialization environment +		![(TypeVar, TypeVarInfo)] // specialization environment  		!Ident					// generic/generic case  		!Position				// of generic case  		!Index 					// main_module index @@ -2335,8 +2330,14 @@ where  		= (EE, (funs_and_groups, heaps, error))  	specialize_type_var tv=:{tv_info_ptr} (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error)		 -		#! (TVI_Expr expr, th_vars) = readPtr tv_info_ptr th_vars -		= (expr, (funs_and_groups, {heaps & hp_type_heaps = {th & th_vars = 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)) +			TVI_Iso iso_ds to_ds from_ds +				# (expr,heaps) = buildFunApp main_module_index iso_ds [] heaps +				-> (expr, (funs_and_groups, heaps, error))  	build_generic_app kind=:(KindArrow [KindConst]) arg_exprs gen_index gen_ident predefs (funs_and_groups, heaps, error)  		# (generic_info_expr, heaps) = buildPredefConsApp PD_NoGenericInfo [] predefs heaps		 @@ -2356,7 +2357,7 @@ is_bimap_id _ = False  specialize_generic_from_bimap ::  		!GlobalIndex			// generic index  		!GenTypeStruct 			// type to specialize to -		![(TypeVar, Expression)] // specialization environment +		![(TypeVar, TypeVarInfo)] // specialization environment  		!Ident					// generic/generic case  		!Position				// of generic case  		![Expression] @@ -2401,48 +2402,63 @@ where  	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) -		# (TVI_Expr x_expr, th_vars) = readPtr xp th_vars -		  (TVI_Expr y_expr, th_vars) = readPtr yp th_vars +		# (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}}  		| is_bimap_id_expression x_expr main_module_index funs_and_groups -			# y = build_map_from_expr y_expr predefs +			# (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))  		| is_bimap_id_expression y_expr main_module_index funs_and_groups -			# x = build_map_to_expr x_expr predefs +			# (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)) -			# x = build_map_to_expr x_expr predefs -			  y = build_map_from_expr y_expr predefs +			# (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) -		#! (TVI_Expr expr, th_vars) = readPtr tv_info_ptr th_vars +		#! (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)  			= specialize_from_arrow_arg_id y st -			# x = build_map_to_expr expr predefs +			# (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)  			  (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) -		#! (TVI_Expr expr, th_vars) = readPtr tv_info_ptr th_vars +		#! (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)  			= specialize_from_arrow_res_id x st -			# y = build_map_from_expr expr predefs +			# (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)  			  (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 y) st -		= specialize_from_arrow x y st +		#! (x, st) = specialize_to x st +		#! (y, st) = specialize_from y st +		# (funs_and_groups, 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, 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)) +			TVI_Iso iso_ds to_ds from_ds +				# (expr,heaps) = buildFunApp main_module_index from_ds [] heaps +				-> (expr, (funs_and_groups, heaps, error))  	specialize_from type=:(GTSAppBimap (KindArrow [KindConst,KindConst]) [arg1,arg2]) st  		# (arg1,st) = specialize arg1 st  		  (arg2,st) = specialize arg2 st @@ -2456,14 +2472,6 @@ where  		# adaptor_expr = build_map_from_expr bimap_expr predefs  		= (adaptor_expr, st) -	specialize_from_arrow x y st -		#! (x, st) = specialize_to x st -		#! (y, st) = specialize_from y st -		# (funs_and_groups, 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_arrow_arg_id y st  		#! (y, st) = specialize_from y st  		# (funs_and_groups, heaps, error) = st @@ -2478,6 +2486,16 @@ where  			= bimap_from_arrow_res_id_expression [x] main_module_index predefs funs_and_groups heaps  		= (expr, (funs_and_groups, heaps, error)) +	specialize_to (GTSVar tv=:{tv_info_ptr}) (funs_and_groups, 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)) +			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)  		#! (bimap_expr, st)   			= specialize type (funs_and_groups, heaps, error) @@ -2534,8 +2552,14 @@ where  		= (EE, (funs_and_groups, heaps, error))  	specialize_type_var tv=:{tv_info_ptr} (funs_and_groups, heaps=:{hp_type_heaps=th=:{th_vars}}, error)		 -		#! (TVI_Expr expr, th_vars) = readPtr tv_info_ptr th_vars -		= (expr, (funs_and_groups, {heaps & hp_type_heaps = {th & th_vars = 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)) +			TVI_Iso iso_ds to_ds from_ds +				# (expr,heaps) = buildFunApp main_module_index iso_ds [] heaps +				-> (expr, (funs_and_groups, heaps, error))  	build_generic_app kind=:(KindArrow [KindConst]) arg_exprs gen_index gen_ident predefs heaps  		# (generic_info_expr, heaps) = buildPredefConsApp PD_NoGenericInfo [] predefs heaps		 @@ -2544,13 +2568,15 @@ where  	build_generic_app kind arg_exprs gen_index gen_ident predefs heaps  		= buildGenericApp gen_index.gi_module gen_index.gi_index gen_ident kind arg_exprs heaps  -is_bimap_id_expression (App {app_symb={symb_kind=SK_Function fun_glob},app_args=[]}) main_module_index {fg_bimap_functions={bimap_id_function={fii_index}}} +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 _ +	= False  set_tvs spec_env heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}}  	#! th_vars = foldSt write_tv spec_env th_vars -		with write_tv ({tv_info_ptr}, expr) th_vars -				= writePtr tv_info_ptr (TVI_Expr expr) th_vars		 +		with write_tv ({tv_info_ptr}, tvi) th_vars +				= writePtr tv_info_ptr tvi th_vars		  	= {heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars }}  clear_tvs spec_env heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}} @@ -3102,7 +3128,6 @@ where  				= No  reportError name pos msg error=:{ea_file}  -	//= checkErrorWithIdentPos (newPosition name pos) msg error  	# ea_file = ea_file <<< "Error " <<< (newPosition name pos) <<< ":" <<< msg <<< '\n'  	= { error & ea_file = ea_file , ea_ok = False } @@ -3946,9 +3971,19 @@ buildCaseExpr case_arg case_alts heaps=:{hp_expression_heap}  	# heaps = { heaps & hp_expression_heap = hp_expression_heap}	  	= (expr, heaps) +build_map_from_tvi_expr (TVI_Expr bimap_expr) main_module_index predefs heaps +	= (buildRecordSelectionExpr bimap_expr PD_map_from 1 predefs, heaps) +build_map_from_tvi_expr (TVI_Iso iso_ds to_ds from_ds) main_module_index predefs heaps +	= buildFunApp main_module_index from_ds [] heaps +  build_map_from_expr bimap_expr predefs  	= buildRecordSelectionExpr bimap_expr PD_map_from 1 predefs +build_map_to_tvi_expr (TVI_Expr bimap_expr) main_module_index predefs heaps +	= (buildRecordSelectionExpr bimap_expr PD_map_to 0 predefs, heaps) +build_map_to_tvi_expr (TVI_Iso iso_ds to_ds from_ds) main_module_index predefs heaps +	= buildFunApp main_module_index to_ds [] heaps +  build_map_to_expr bimap_expr predefs  	= buildRecordSelectionExpr bimap_expr PD_map_to 0 predefs diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index 4efb005..39af652 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -553,7 +553,9 @@ NoGlobalIndex :== {gi_module=NoIndex,gi_index=NoIndex}  :: GenericTypeRep =   	{ gtr_type :: GenTypeStruct		// generic structure type -	, gtr_iso  :: DefinedSymbol		// the conversion isomorphism +	, gtr_iso  :: !DefinedSymbol	// the conversion isomorphism +	, gtr_to   :: !DefinedSymbol +	, gtr_from :: !DefinedSymbol  	}  ::	TypeDefInfos :== {# .{# TypeDefInfo}} @@ -772,7 +774,6 @@ cNonRecursiveAppl	:== False  /*	Some auxiliary type definitions used during fusion. Actually, these definitions  	should have been given in seperate module. Unfortunately, Clean's module system  	forbids cyclic dependencies between def modules. -	  */  ::	FunctionHeap 	:== Heap FunctionInfo @@ -1020,6 +1021,7 @@ cNonRecursiveAppl	:== False  					| TVI_ConsInstance !DefinedSymbol //AA: generic cons instance function   					| TVI_Normalized !Int /* MV - position of type variable in its definition */  					| TVI_Expr !Expression	/* AA: Expression corresponding to the type var during generic specialization */ +					| TVI_Iso !DefinedSymbol !DefinedSymbol !DefinedSymbol  					| TVI_GenTypeVarNumber !Int  					| TVI_CPSTypeVar !CheatCompiler /* MdM: a pointer to a variable in CleanProverSystem is stored here, using a cast */  | 
