diff options
Diffstat (limited to 'frontend')
| -rw-r--r-- | frontend/check.icl | 28 | ||||
| -rw-r--r-- | frontend/checkFunctionBodies.icl | 47 | ||||
| -rw-r--r-- | frontend/checktypes.icl | 4 | ||||
| -rw-r--r-- | frontend/frontend.icl | 7 | ||||
| -rw-r--r-- | frontend/generics.icl | 1088 | ||||
| -rw-r--r-- | frontend/overloading.icl | 3 | ||||
| -rw-r--r-- | frontend/parse.icl | 1 | ||||
| -rw-r--r-- | frontend/predef.dcl | 22 | ||||
| -rw-r--r-- | frontend/predef.icl | 27 | ||||
| -rw-r--r-- | frontend/syntax.dcl | 2 | ||||
| -rw-r--r-- | frontend/syntax.icl | 2 | 
11 files changed, 890 insertions, 341 deletions
| diff --git a/frontend/check.icl b/frontend/check.icl index de7ede7..2d7288b 100644 --- a/frontend/check.icl +++ b/frontend/check.icl @@ -23,15 +23,21 @@ checkGenerics  	| gen_index == size generic_defs  		= (generic_defs, class_defs, type_defs, modules, type_heaps, cs)  	// otherwise -		# (gen_def=:{gen_name, gen_type, gen_pos}, generic_defs) = generic_defs![gen_index] +		# (generic_def=:{gen_name, gen_type, gen_pos}, generic_defs) = generic_defs![gen_index]  		# position = newPosition gen_name gen_pos  		# cs_error = setErrorAdmin position cs_error  			//---> ("checkGenerics generic type 1", gen_type.gt_type) +		// add * for kind-star instances and *->* for arrays +		# kinds =  +			[	KindConst +			, 	KindArrow [KindConst, KindConst] +			] +		# (kinds_ptr, th_vars) = newPtr (TVI_Kinds kinds) th_vars +  		# cs = {cs & cs_error = cs_error, cs_symbol_table = cs_symbol_table }  		# type_heaps = {type_heaps & th_vars = th_vars} -		//# (gt_type, _, type_defs, class_defs, modules, type_heaps, cs) = -		//	checkSymbolType module_index gen_type.gt_type SP_None type_defs class_defs modules type_heaps cs +  		# (gt_type, type_defs, class_defs, modules, type_heaps, cs) =  			checkMemberType module_index gen_type.gt_type type_defs class_defs modules type_heaps cs @@ -40,7 +46,13 @@ checkGenerics  		#! cs = {cs & cs_error = cs_error}  		#! gt_type = {gt_type & st_vars = st_vars} -		# generic_defs = {generic_defs & [gen_index] . gen_type = { gen_type & gt_vars = gt_vars, gt_type = gt_type }}				 +		# generic_def = +			{	generic_def & +				gen_type = { gen_type & gt_vars = gt_vars, gt_type = gt_type } +			,	gen_kinds_ptr = kinds_ptr +			} + +		# generic_defs = {generic_defs & [gen_index] = generic_def}				  			//---> ("checkGenerics generic type 2", gt_type)  		= checkGenerics (inc gen_index) module_index generic_defs class_defs type_defs modules type_heaps cs  where	 @@ -2537,6 +2549,7 @@ where  		# (pre_mod, cs_predef_symbols) = cs_predef_symbols![PD_PredefinedModule]  		| pre_mod.pds_def == mod_index  			= (class_members, class_instances, fun_types, { cs & cs_predef_symbols = cs_predef_symbols} +				<=< adjust_predef_symbol PD_StringType mod_index STE_Type  				<=< adjust_predef_symbols PD_ListType PD_UnboxedArrayType mod_index STE_Type  				<=< adjust_predef_symbols PD_ConsSymbol PD_Arity32TupleSymbol mod_index STE_Constructor  				<=< adjust_predef_symbol PD_TypeCodeClass mod_index STE_Class @@ -2581,7 +2594,12 @@ where  				<=< adjust_predef_symbol PD_TypeARROW			mod_index STE_Type  				<=< adjust_predef_symbol PD_ConsARROW			mod_index STE_Constructor  				<=< adjust_predef_symbol PD_isomap_ARROW_		mod_index STE_DclFunction				 -				<=< adjust_predef_symbol PD_isomap_ID			mod_index STE_DclFunction)				 +				<=< adjust_predef_symbol PD_isomap_ID			mod_index STE_DclFunction				 +				<=< adjust_predef_symbol PD_TypeCONSInfo		mod_index STE_Type +				<=< adjust_predef_symbol PD_ConsCONSInfo		mod_index STE_Constructor +				<=< adjust_predef_symbol PD_TypeCONS			mod_index STE_Type +				<=< adjust_predef_symbol PD_ConsCONS			mod_index STE_Constructor +				<=< adjust_predef_symbol PD_cons_info			mod_index STE_DclFunction)  		# (pre_mod, cs_predef_symbols) = cs_predef_symbols![PD_StdMisc]	  		| pre_mod.pds_def == mod_index  			= (class_members, class_instances, fun_types, { cs & cs_predef_symbols = cs_predef_symbols} diff --git a/frontend/checkFunctionBodies.icl b/frontend/checkFunctionBodies.icl index 2ac353f..5378773 100644 --- a/frontend/checkFunctionBodies.icl +++ b/frontend/checkFunctionBodies.icl @@ -871,22 +871,28 @@ checkExpression free_vars (PE_Generic id=:{id_name,id_info} kind) e_input e_stat  			-> (!Expression, ![FreeVar], !*ExpressionState, !*ExpressionInfo, !*CheckState)  		check_generic_expr   				free_vars entry=:{ste_kind=STE_Generic,ste_index} id  kind   -				e_input=:{ei_mod_index}  e_state  +				e_input=:{ei_mod_index} e_state   				e_info=:{ef_generic_defs} cs -			//#! e_info = {e_info & ef_generic_defs = add_kind ef_generic_defs ste_index kind}	 + +			#! (ef_generic_defs, e_state) = add_kind ste_index kind ef_generic_defs e_state +			#! e_info = { e_info & ef_generic_defs = ef_generic_defs }    			= check_it free_vars ei_mod_index ste_index id kind e_input e_state e_info cs	  		check_generic_expr   				free_vars entry=:{ste_kind=STE_Imported STE_Generic mod_index, ste_index} id kind    				e_input e_state   				e_info=:{ef_modules} cs -			//#! (dcl_module, ef_modules) = ef_modules ! [mod_index] -			//#! (dcl_common, dcl_module) = dcl_module ! dcl_common  -			//#! (com_generic_defs, dcl_common) = dcl_common ! com_generic_defs -			//#! dcl_common = {dcl_common & com_generic_defs = add_kind com_generic_defs ste_index kind} -			//#! dcl_module = {dcl_module & dcl_common = dcl_common} -			//#! ef_modules = {ef_modules & [mod_index] = dcl_module}  -			//#! e_info = { e_info & ef_modules = ef_modules } +			#! (dcl_module, ef_modules) = ef_modules ! [mod_index] +			#! (dcl_common, dcl_module) = dcl_module ! dcl_common  +			#! (com_generic_defs, dcl_common) = dcl_common ! com_generic_defs +			 +			#! (com_generic_defs, e_state) = add_kind ste_index kind com_generic_defs e_state +						 +			#! dcl_common = {dcl_common & com_generic_defs = com_generic_defs} +			#! dcl_module = {dcl_module & dcl_common = dcl_common} +			#! ef_modules = {ef_modules & [mod_index] = dcl_module}  +			 +			#! e_info = { e_info & ef_modules = ef_modules }  			= check_it free_vars mod_index ste_index id kind e_input e_state e_info cs	  		check_generic_expr free_vars  entry=:{ste_kind=STE_Empty} id kind  e_input e_state e_info cs=:{cs_error} @@ -903,11 +909,15 @@ checkExpression free_vars (PE_Generic id=:{id_name,id_info} kind) e_input e_stat  			#! cs = { cs & cs_x.x_needed_modules = cs_x.x_needed_modules bitor cNeedStdGeneric }  			= (App app, free_vars, e_state, e_info, cs) -		add_kind :: !*{#GenericDef} !Index !TypeKind -> !*{#GenericDef}			 -		add_kind generic_defs generic_index kind -			# (generic_def, generic_defs) = generic_defs ! [generic_index]		 -			= {generic_defs & [generic_index] = addGenericKind generic_def kind} -			 									  +		add_kind :: !Index !TypeKind !u:{#GenericDef} !*ExpressionState  +			-> (!u:{#GenericDef}, !*ExpressionState)			 +		add_kind generic_index kind generic_defs e_state=:{es_type_heaps=es_type_heaps=:{th_vars}} +			#! (generic_def=:{gen_kinds_ptr}, generic_defs) = generic_defs ! [generic_index] +			#! (TVI_Kinds kinds, th_vars) = readPtr gen_kinds_ptr th_vars			 +			#! kinds = eqMerge [kind] kinds   +			#! th_vars = writePtr gen_kinds_ptr (TVI_Kinds kinds) th_vars +			#! e_state = { e_state & es_type_heaps = {es_type_heaps & th_vars = th_vars}} +			= (generic_defs, e_state) 									   // ..AA  checkExpression free_vars expr e_input e_state e_info cs  	= abort "checkExpression (checkFunctionBodies.icl, line 868)" // <<- expr @@ -947,6 +957,15 @@ where  			#! (var_expr_ptr, es_expr_heap) = newPtr EI_Empty es_expr_heap  			= (Var {var_name = id, var_info_ptr = info_ptr, var_expr_ptr = var_expr_ptr}, free_vars,  					{e_state & es_expr_heap = es_expr_heap}, e_info, cs) +// AA.. +	check_id_expression {ste_kind = STE_Generic} is_expr_list free_vars id e_input e_state e_info cs=:{cs_error} +		= (EE, free_vars, e_state, e_info,  +			{ cs & cs_error = checkError id "generic: missing kind argument" cs_error}) +	check_id_expression {ste_kind = STE_Imported STE_Generic _} is_expr_list free_vars id e_input e_state e_info cs=:{cs_error} +		= (EE, free_vars, e_state, e_info,  +			{ cs & cs_error = checkError id "generic: missing kind argument" cs_error})			 +// ..AA					 +					  	check_id_expression entry is_expr_list free_vars id=:{id_info} e_input e_state e_info cs  		# (symb_kind, arity, priority, is_a_function, e_state, e_info, cs) = determine_info_of_symbol entry id_info e_input e_state e_info cs  		  symbol = { symb_name = id, symb_kind = symb_kind, symb_arity = 0 } diff --git a/frontend/checktypes.icl b/frontend/checktypes.icl index a06a466..7c14be4 100644 --- a/frontend/checktypes.icl +++ b/frontend/checktypes.icl @@ -1247,7 +1247,7 @@ where  		-> (!*{#ClassDef}, !w:{#DclModule}, !v:[SymbolPtr], !u:Indexes, !*TypeVarHeap, !*VarHeap, !*CheckState)  	create_class_dictionary mod_index class_index  class_defs =:{[class_index] = class_def } modules rev_dictionary_list  			indexes type_var_heap var_heap cs=:{cs_symbol_table,cs_error} -		# {class_name,class_args,class_arity,class_members,class_context,class_dictionary=ds=:{ds_ident={id_info}}} = class_def +		# {class_name,class_args,class_arity,class_members,class_context,class_dictionary=ds=:{ds_ident={id_name,id_info}}} = class_def  		| isNilPtr id_info  			# (type_id_info, cs_symbol_table) = newPtr EmptySymbolTableEntry cs_symbol_table  			  nr_of_members = size class_members @@ -1315,7 +1315,7 @@ where  											ste_def_level = NotALevel, ste_previous = abort "empty SymbolTableEntry" })  							<:= (cons_id_info, { ste_kind = STE_DictCons cons_def, ste_index = index_cons,  											ste_def_level = NotALevel, ste_previous = abort "empty SymbolTableEntry" })}) - +					  		# ({ste_kind}, cs_symbol_table) = readPtr id_info cs_symbol_table  		| ste_kind == STE_Empty  			= (class_defs, modules, rev_dictionary_list, indexes, type_var_heap, var_heap, diff --git a/frontend/frontend.icl b/frontend/frontend.icl index 8b34bbd..2549924 100644 --- a/frontend/frontend.icl +++ b/frontend/frontend.icl @@ -130,14 +130,19 @@ frontEndInterface upToPhase mod_ident search_paths dcl_modules functions_and_mac  	# 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) =  -		case False of +		case True 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]	 +	  	# error = error_admin.ea_file +	#! ok = error_admin.ea_ok +	| not ok +		= (No,{},0,main_dcl_module_n,predef_symbols, hash_table, files, error, io, out, tcl_file, heaps)  // ..AA  	# (ok, fun_defs, array_instances, type_code_instances, common_defs, imported_funs, type_def_infos, heaps, predef_symbols, error,out) diff --git a/frontend/generics.icl b/frontend/generics.icl index 8cdf7a7..88558d7 100644 --- a/frontend/generics.icl +++ b/frontend/generics.icl @@ -9,6 +9,10 @@ import check  from transform import Group  import analtypes +supportConsInfo :== True +supportConsInfoByType :== True +supportPartialInstances :== False +  :: *GenericState = {  	gs_modules				:: !*{#CommonDefs},  	gs_fun_defs				:: !*{# FunDef}, @@ -31,25 +35,27 @@ import analtypes  :: GenericTypeDefInfos :== {# .{GenericTypeDefInfo}} -:: GenericTypeRep = { -	gtr_type 				:: !AType,			// generic type representation -	gtr_type_args			:: ![TypeVar],		// same as in td_info -	gtr_iso					:: !DefinedSymbol,	// isomorphim function index 		 -	gtr_isomap_group		:: !Index, 			// isomap function group -	gtr_isomap				:: !DefinedSymbol,	// isomap function for the type - 	gtr_isomap_from			:: !DefinedSymbol,	// from-part of isomap -	gtr_isomap_to			:: !DefinedSymbol 	// to-part  +:: GenericTypeRep =  +	{	gtr_type 				:: !AType			// generic type representation +	,	gtr_type_args			:: ![TypeVar]		// same as in td_info +	,	gtr_iso					:: !DefinedSymbol	// isomorphim function index 		 +	,	gtr_isomap_group		:: !Index 			// isomap function group +	,	gtr_isomap				:: !DefinedSymbol	// isomap function for the type + 	,	gtr_isomap_from			:: !DefinedSymbol	// from-part of isomap +	,	gtr_isomap_to			:: !DefinedSymbol 	// to-part	 +	,	gtr_cons_infos			:: ![DefinedSymbol] // constructor informations  	}  EmptyDefinedSymbol :== MakeDefinedSymbol {id_name="",id_info=nilPtr} NoIndex 0	 -EmptyGenericType :== { -	gtr_type 		= makeAType TE TA_None, -	gtr_type_args	= [],  -	gtr_iso 			= EmptyDefinedSymbol,  -	gtr_isomap_group = NoIndex,  -	gtr_isomap 		= EmptyDefinedSymbol, -	gtr_isomap_from 	= EmptyDefinedSymbol, -	gtr_isomap_to 	= EmptyDefinedSymbol +EmptyGenericType :==  +	{	gtr_type 		= makeAType TE TA_None +	,	gtr_type_args	= []  +	,	gtr_iso 		= EmptyDefinedSymbol  +	,	gtr_isomap_group = NoIndex  +	,	gtr_isomap 		= EmptyDefinedSymbol +	,	gtr_isomap_from = EmptyDefinedSymbol +	,	gtr_isomap_to 	= EmptyDefinedSymbol +	,	gtr_cons_infos 	= []  	}  :: IsoDirection = IsoTo | IsoFrom @@ -93,40 +99,84 @@ convertGenerics  			gs_predefs = gs_predefs,  			gs_error = error}  -	#! (generic_types, gs) = collectGenericTypes gs -		//---> "*** collect generic types" -	//#! {gs_error} = gs   -	//| not gs_error.ea_ok -	//	= abort "collecting generic types failed" -	//#! gs = {gs & gs_error = gs_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 +	#! 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 + +	#! (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 +  	#! (instance_types, gs) = convertInstances gs -		//---> "*** build classes and bind instances" +		//---> "*** 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 -	#! (td_indexes, gs) = collectGenericTypeDefs (generic_types ++ instance_types) gs	 +	#! (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 +  	#! (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 +  	#! (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 +  	#! (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 +  	#! (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 + +  	#! (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  	// the order in the lists below is important!   	// Indexes are allocated in that order.  	#! new_funs = iso_funs ++ isomap_type_funs ++ isomap_gen_funs ++ instance_funs ++ star_funs  	#! new_groups = iso_groups ++ isomap_type_groups ++ isomap_gen_groups ++ instance_groups ++ star_groups	 -		//---> ("created isomaps", length isomap_funs, length isomap_groups)  	#! gs = addFunsAndGroups new_funs new_groups gs	  		//---> "*** add geenrated functions" +	#! (ok,gs) = gs!gs_error.ea_ok +	| not ok  +		= return gs predefs hash_table dcl_modules +  	#! 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  	//| True  	//	= abort "-----------------\n" @@ -148,44 +198,59 @@ convertGenerics  			}  		} -	# (common_defs, gs_modules) = gs_modules![main_dcl_module_n] -	# class_defs = { x \\ x <-: common_defs.com_class_defs } // make unique copy -	# {hp_type_heaps=hp_type_heaps=:{th_vars}, hp_var_heap} = gs_heaps -		 -	# (class_defs, dcl_modules, new_type_defs, new_selector_defs, new_cons_defs, th_vars, hp_var_heap, cs) = -		createClassDictionaries  -			main_dcl_module_n  -			class_defs  -			dcl_modules  -			(size common_defs.com_type_defs)  -			(size common_defs.com_selector_defs)  -			(size common_defs.com_cons_defs)  -			th_vars hp_var_heap cs -		 -	# gs_heaps = {gs_heaps & hp_var_heap = hp_var_heap, hp_type_heaps = {hp_type_heaps & th_vars = th_vars}}  +	#! (dcl_modules, gs_modules, gs_heaps, cs) =  +		create_class_dictionaries 0 dcl_modules gs_modules gs_heaps cs +//		create_class_dictionaries1 main_dcl_module_n dcl_modules gs_modules gs_heaps cs +			//---> "*** create class dictionaries"	 -	# common_defs = { common_defs &  -		com_class_defs = class_defs,  -		com_type_defs = arrayPlusList common_defs.com_type_defs new_type_defs, -		com_selector_defs = arrayPlusList common_defs.com_selector_defs new_selector_defs, -		com_cons_defs = arrayPlusList common_defs.com_cons_defs new_cons_defs} -		 -	# gs_modules = { gs_modules & [main_dcl_module_n] = common_defs }   	# {cs_symbol_table, cs_predef_symbols, cs_error} = cs  	# hash_table = { hash_table & hte_symbol_heap = cs_symbol_table }	 -	# index_range = {ir_from = gs.gs_first_fun, ir_to = gs.gs_last_fun} +	#! 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) - +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   +		= (	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) + +	create_class_dictionaries module_index dcl_modules  modules heaps cs  +		#! size_of_modules = size modules +		| module_index == size_of_modules +			= (dcl_modules, modules, heaps, cs) +			#! (dcl_modules, modules, heaps, cs) =  +				create_class_dictionaries1 module_index dcl_modules  modules heaps cs +			= create_class_dictionaries (inc module_index) dcl_modules modules heaps cs		 + +	create_class_dictionaries1 +			module_index dcl_modules modules  +			heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}, hp_var_heap} +			cs  +		#! (common_defs, modules) = modules![module_index] +		#! class_defs = { x \\ x <-: common_defs.com_class_defs } // make unique copy		 +		#! (class_defs, dcl_modules, new_type_defs, new_selector_defs, new_cons_defs, th_vars, hp_var_heap, cs) = +				createClassDictionaries  +					module_index  +					class_defs  +					dcl_modules  +					(size common_defs.com_type_defs)  +					(size common_defs.com_selector_defs)  +					(size common_defs.com_cons_defs)  +					th_vars hp_var_heap cs + +		#! common_defs = { common_defs &  +			com_class_defs = class_defs,  +			com_type_defs = arrayPlusList common_defs.com_type_defs new_type_defs, +			com_selector_defs = arrayPlusList common_defs.com_selector_defs new_selector_defs, +			com_cons_defs = arrayPlusList common_defs.com_cons_defs new_cons_defs} + +		#! heaps = {heaps & hp_var_heap = hp_var_heap, hp_type_heaps = {hp_type_heaps & th_vars = th_vars}}  +		#! modules = { modules & [module_index] = common_defs } 		 +		= (dcl_modules, modules, heaps, cs)		 -// for each generic instance -// - generate class and class member, if needed -// - rebind generic instance from generic to class -// - returns list of instance types for building generic representation  convertInstances :: !*GenericState	 -	-> (![Type], !*GenericState) +	-> (![Global Index], !*GenericState)  convertInstances gs  	= convert_modules 0 gs   where @@ -215,30 +280,85 @@ where  		= (new_types ++ types, instance_defs, gs)	  	convert_instance :: !Index !Index !*{#ClassInstance} !*GenericState -		-> (![Type], !*{#ClassInstance}, !*GenericState)	 -	convert_instance module_index instance_index instance_defs gs=:{gs_td_infos} +		-> (![Global Index], !*{#ClassInstance}, !*GenericState)	 +	convert_instance module_index instance_index instance_defs gs=:{gs_td_infos, gs_modules, gs_error} -		#! (instance_def, instance_defs) = instance_defs ! [instance_index] +		#! (instance_def=:{ins_class,ins_ident,ins_pos}, instance_defs) = instance_defs ! [instance_index]  		| not instance_def.ins_is_generic -			= ([], instance_defs, {gs & gs_td_infos = gs_td_infos}) +			= ([], instance_defs, {gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error})  		// determine the kind of the instance type  		#! it_type = hd instance_def.ins_type.it_types  		#! (kind, gs_td_infos) = kindOfType it_type gs_td_infos -		#! gs = {gs & gs_td_infos = gs_td_infos}	 - -		// generate class and update the instance to point to the class		 -		#! (_, gs) 			= buildClassDef instance_def.ins_class KindConst gs	 -		#! (class_glob, gs) = buildClassDef instance_def.ins_class kind gs	 -		#! ins_ident = instance_def.ins_ident -		#! ins_ident = { ins_ident & id_name = ins_ident.id_name +++ ":" +++ (toString kind)} -		#! instance_def = { instance_def & ins_class = class_glob, ins_ident = ins_ident } + +		#! (generic_def, gs_modules) = getGenericDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules +		#! (ok, class_ds) = getGenericClassForKind generic_def kind +		| not ok +			= abort ("no class " +++ ins_ident.id_name +++ "for kind" +++ toString kind)  + +		#! instance_def =  +			{ 	instance_def  +			& 	ins_class = {glob_module=ins_class.glob_module, glob_object=class_ds}  +			,	ins_ident = makeIdent (ins_ident.id_name +++ ":" +++ (toString kind)) +			}  		#! instance_defs = { instance_defs & [instance_index] = instance_def} -		| instance_def.ins_generate -			= ([it_type], instance_defs, gs) -			= ([], instance_defs, gs) +		#! (ok, gs_modules, gs_error) = check_instance instance_def gs_modules gs_error +		| not ok +			= ([], instance_defs, { gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error }) +		# (maybe_td_index, gs_modules, gs_error) =  +			determine_type_def_index it_type instance_def gs_modules gs_error +		= (maybe_td_index, instance_defs, { gs & gs_td_infos = gs_td_infos, gs_modules = gs_modules, gs_error = gs_error }) +	 +	determine_type_def_index  +			(TA {type_index} _)  +			{ins_generate, ins_ident, ins_pos}  +			gs_modules gs_error +		# ({td_rhs, td_index}, gs_modules) = getTypeDef type_index.glob_module type_index.glob_object gs_modules +		= determine_td_index td_rhs gs_modules gs_error +	where +		determine_td_index (AlgType _) gs_modules gs_error +			= (if ins_generate [type_index] [], gs_modules, gs_error) +		determine_td_index (RecordType _) gs_modules gs_error +			= (if ins_generate [type_index] [], gs_modules, gs_error) +		determine_td_index (SynType _) gs_modules gs_error +			# gs_error = checkErrorWithIdentPos  +				(newPosition ins_ident ins_pos)  +				"generic instance type cannot be a sysnonym type"  +				gs_error 				  +			= ([], gs_modules, gs_error)			 +		determine_td_index (AbstractType _) gs_modules gs_error +			| ins_generate +				# gs_error = checkErrorWithIdentPos  +					(newPosition ins_ident ins_pos)  +					"cannot generate an instance for an abstract data type"  +					gs_error 				  +				= ([], gs_modules, gs_error)									 +				= ([], gs_modules, gs_error) +	determine_type_def_index (TB _) _ gs_modules gs_error +		= ([], gs_modules, gs_error)			 +	determine_type_def_index _ {ins_ident,ins_pos} gs_modules gs_error +		# gs_error = checkErrorWithIdentPos  +			(newPosition ins_ident ins_pos)  +			"generic instance type must be a type constructor"  +			gs_error 				  +		= ([], gs_modules, gs_error) +		 +	check_instance  +			instance_def=:{ins_class={glob_module,glob_object}, ins_ident, ins_pos, ins_type, ins_generate}  +			gs_modules gs_error +		| ins_generate  +			= (True, gs_modules, gs_error) +	 +		# (class_def=:{class_members}, 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 +			# 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)	  collectGenericTypes :: !*GenericState -> (![Type], !*GenericState)  collectGenericTypes gs=:{gs_modules}  @@ -257,32 +377,131 @@ where  		# (types, gs_modules) = collect_in_modules module_index (inc generic_index) gs_modules  		= ([at_type \\ {at_type} <- [st_result:st_args]] ++ types, gs_modules)	 -/* + +collectInstanceKinds :: !*GenericState -> !*GenericState +collectInstanceKinds gs +	= collect_instance_kinds 0 0 gs +where +	collect_instance_kinds module_index instance_index gs=:{gs_modules} +		#! size_modules = size gs_modules +		| module_index == size_modules +			= gs +		#! (common_defs, gs_modules) = gs_modules ! [module_index] +		#! size_instance_defs = size common_defs.com_instance_defs +		| instance_index == size_instance_defs +			= collect_instance_kinds (inc module_index) 0 {gs & gs_modules = gs_modules}  +				 +		#! gs = collect_instance module_index instance_index {gs & gs_modules = gs_modules} +		 +		= collect_instance_kinds module_index (inc instance_index) gs + +	collect_instance module_index instance_index gs=:{gs_heaps, gs_modules, gs_td_infos} +		 +		#! (instance_def=:{ins_class, ins_is_generic, ins_type}, gs_modules) =  +			getInstanceDef module_index instance_index gs_modules +		| not instance_def.ins_is_generic  +			= {gs & gs_modules = gs_modules, gs_heaps = gs_heaps } + +		#! (generic_def, gs_modules) = getGenericDef ins_class.glob_module ins_class.glob_object.ds_index gs_modules		 +		#! (kind, gs_td_infos) = kindOfType (hd ins_type.it_types) gs_td_infos		 +		#! gs_heaps = update_kind generic_def kind gs_heaps		 +		= {gs & gs_modules = gs_modules, gs_heaps = gs_heaps, gs_td_infos = gs_td_infos} +		 +	update_kind {gen_kinds_ptr} kind gs_heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}} +		#! (TVI_Kinds kinds, th_vars) = readPtr gen_kinds_ptr th_vars +		#! kinds = eqMerge [kind] kinds +		#! th_vars = writePtr gen_kinds_ptr (TVI_Kinds kinds) th_vars +		= {gs_heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars}} +  buildClasses :: !*GenericState -> !*GenericState -buildClasses gs=:{gs_modules}  -	# (types, gs_modules) = collect_in_modules 0 0 gs_modules -	= (types, {gs & gs_modules = gs_modules}) +buildClasses gs  +	= build_modules 0 gs  where -	collect_in_modules module_index generic_index gs_modules +	build_modules module_index gs=:{gs_modules}  		#! size_gs_modules = size gs_modules   		| module_index == size_gs_modules -			= ([], gs_modules)  -		# (generic_defs, gs_modules) = gs_modules ! [module_index].com_generic_defs  +			= { gs & gs_modules = gs_modules }	 		 + +		#! common_defs = gs_modules . [module_index] +		#! (common_defs, gs=:{gs_modules}) = build_module module_index common_defs gs	 +		#! gs = {gs & gs_modules = {gs_modules & [module_index] = common_defs}}					 + +		= build_modules (inc module_index) gs	 +			 +	build_module module_index common_defs gs		  + +		#! {com_generic_defs,com_class_defs, com_member_defs} = common_defs  +		 +		#! class_index = size com_class_defs +		#! member_index = size com_member_defs +		#! com_generic_defs = {x \\ x <-: com_generic_defs} // make unique copy +			 +		# (new_class_defs, new_member_defs, com_generic_defs, _, _, gs) =  +			build_generics module_index 0 class_index member_index com_generic_defs gs	 + +		# common_defs =  +			{	common_defs  +			&	com_class_defs = arrayPlusRevList com_class_defs new_class_defs +			,	com_member_defs = arrayPlusRevList com_member_defs new_member_defs +			, 	com_generic_defs = com_generic_defs +			} +		= (common_defs, gs) +		 +	build_generics module_index generic_index class_index member_index generic_defs gs  		#! size_generic_defs = size generic_defs  		| generic_index == size_generic_defs -			= collect_in_modules (inc module_index) 0 gs_modules -		# {gen_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)	 -*/ +			= ([], [], generic_defs, class_index, member_index, gs) +		#! (generic_def, generic_defs) = generic_defs ! [generic_index]	 +		#! (new_class_defs, new_member_defs, generic_def, class_index, member_index, gs) =  +			build_generic module_index class_index member_index generic_def gs +		#! generic_defs = {generic_defs & [generic_index] = generic_def} +		#! (new_class_defs1, new_member_defs1, generic_defs, class_index, member_index, gs) =  +			build_generics module_index (inc generic_index) class_index member_index generic_defs gs +		= (new_class_defs ++ new_class_defs1, new_member_defs ++ new_member_defs1, +			generic_defs, class_index, member_index, gs) +		 +	build_generic module_index class_index member_index generic_def gs		 +		# (kinds, gs) = get_kinds generic_def gs +		= build_classes kinds generic_def module_index class_index member_index gs +	 +	build_classes :: ![TypeKind] !GenericDef !Index !Index !Index !*GenericState +		-> (![ClassDef], ![MemberDef], !GenericDef, !Index, !Index, !*GenericState) +	build_classes [] generic_def module_index class_index member_index gs  +		= ([], [], generic_def, class_index, member_index, gs) +	build_classes [kind:kinds] generic_def module_index class_index member_index gs 	 +		#! (class_def, member_def, generic_def, gs) =  +			buildClassDef1 module_index class_index member_index generic_def kind gs +		#! (class_defs, member_defs, generic_def, class_index, member_index, gs) =  +			build_classes kinds generic_def module_index (inc class_index) (inc member_index) gs +		= ([class_def:class_defs], [member_def:member_defs], generic_def, class_index, member_index, gs) 			  + +	get_kinds {gen_kinds_ptr} gs=:{gs_heaps=gs_heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}}} +		#! (TVI_Kinds kinds, th_vars) = readPtr gen_kinds_ptr th_vars +		#! th_vars = writePtr gen_kinds_ptr TVI_Empty th_vars +		= (kinds, {gs & gs_heaps = {gs_heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars}}})  // find all types whose generic representation is needed -collectGenericTypeDefs :: ![Type] !*GenericState +collectGenericTypeDefs :: ![Type] [Global Index] !*GenericState  	-> (![Global Index], !*GenericState) -collectGenericTypeDefs types gs -	# (td_indexes, gs) = collect_in_types types gs +collectGenericTypeDefs generic_types instance_td_indexes gs +	# (td_indexes, gs) = collect_in_types generic_types gs +	# (td_indexes, gs) = add_instance_indexes td_indexes instance_td_indexes gs  	= (map fst td_indexes, gs)  where +	add_instance_indexes td_indexes [] gs  +		= (td_indexes, gs) +	add_instance_indexes  +			td_indexes  +			[type_index=:{glob_module, glob_object} : itdis]  +			gs=:{gs_gtd_infos, gs_td_infos} +		# (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [glob_module, glob_object] +		# gs_gtd_infos = {gs_gtd_infos & [glob_module, glob_object] = GTDI_Generic EmptyGenericType} +		# (td_info, gs_td_infos) = gs_td_infos ! [glob_module, glob_object] +		# gs = {gs & gs_td_infos = gs_td_infos, gs_gtd_infos = gs_gtd_infos} +		| toBool gtd_info // already marked +			= add_instance_indexes td_indexes itdis gs				 +			# gs_gtd_infos = {gs_gtd_infos & [glob_module, glob_object] = GTDI_Generic EmptyGenericType} +			= add_instance_indexes (merge_td_indexes [(type_index, td_info.tdi_group_nr)] td_indexes) itdis gs  	collect_in_types :: ![Type] !*GenericState    		-> (![(Global Index, Int)], !*GenericState) @@ -294,9 +513,11 @@ where  	collect_in_type :: !Type !*GenericState   		-> (![(Global Index, Int)], !*GenericState) -	collect_in_type  -			(TA type_symb_indet=:{type_index, type_name} args)  -			gs=:{gs_gtd_infos, gs_td_infos, gs_modules} +	collect_in_type (TA {type_arity=0} _) gs=:{gs_gtd_infos, gs_td_infos, gs_modules} +		// types with no arguments do not need mapping to be built: +		// their mapping is identity +		= ([], gs) +	collect_in_type (TA {type_index, type_name} args) gs=:{gs_gtd_infos, gs_td_infos, gs_modules}  		# {glob_module, glob_object} = type_index	  		# (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [glob_module, glob_object]  		| toBool gtd_info // already marked @@ -333,8 +554,7 @@ where  				"cannot build generic type representation for an abstract type"   				gs_error  		= ([], {gs & gs_error = gs_error}) -	collect_in_type_def_rhs mod _	gs -		= abort "ERROR: unknown type def right hand side\n"  +		//= ([], {gs & gs_error = checkWarning td_name "abstract data type" gs_error})  	collect_in_conses :: !Index ![DefinedSymbol] !*GenericState   		-> (![(Global Index, Int)], !*GenericState) @@ -356,6 +576,7 @@ where  	merge_td_indexes x y   		= mergeBy (\(_,l) (_,r) ->l < r) x y  +  buildIsoFunctions :: ![Global Index] !*GenericState  	-> (![FunDef], ![Group], !*GenericState)  buildIsoFunctions [] gs = ([], [], gs) @@ -365,14 +586,17 @@ buildIsoFunctions [type_index:type_indexes] gs  	= (iso_funs1 ++ iso_funs2, iso_groups1 ++ iso_groups2, gs)   where  	build_function {glob_module, glob_object} gs +		# (cons_info_def_syms, cons_info_group_indexes, cons_info_fun_defs, gs) =  +			build_cons_infos glob_module glob_object gs +  		# (from_fun_index, 	from_group_index, gs) 	= newFunAndGroupIndex gs  		# (to_fun_index, 	to_group_index, gs) 	= newFunAndGroupIndex gs -		# (iso_fun_index, 	iso_group_index, gs) 	= newFunAndGroupIndex gs -			 -		# {gs_gtd_infos, gs_modules, gs_predefs} = gs +		# (iso_fun_index, 	iso_group_index, gs) 	= newFunAndGroupIndex gs		 +									 +		# {gs_gtd_infos, gs_modules, gs_predefs, gs_error} = gs  		# (type_def=:{td_name}, gs_modules) = getTypeDef glob_module glob_object gs_modules   		# (common_defs, gs_modules) = gs_modules ! [glob_module]		 -		# generic_rep_type = buildGenericRepType type_def.td_rhs gs_predefs common_defs  +		# (ok, generic_rep_type, gs_error) = buildGenericRepType glob_module type_def gs_predefs common_defs gs_error   		# iso_def_sym = {  			ds_ident  = {id_name="iso:"+++type_def.td_name.id_name, id_info = nilPtr }, @@ -391,18 +615,20 @@ where  			ds_index  = to_fun_index,  			ds_arity  = 1	  			} -		# gtd_info = GTDI_Generic {  -			gtr_type 		= generic_rep_type, -			gtr_type_args	= [atv_variable \\ {atv_variable} <- type_def.td_args],  -			gtr_iso 			= iso_def_sym, -			gtr_isomap_group	= NoIndex, -			gtr_isomap		= EmptyDefinedSymbol,		 -			gtr_isomap_from	= EmptyDefinedSymbol,		 -			gtr_isomap_to	= EmptyDefinedSymbol		 +		 +		# gtd_info = GTDI_Generic  +			{ 	gtr_type 		= generic_rep_type +			,	gtr_type_args	= [atv_variable \\ {atv_variable} <- type_def.td_args]  +			,	gtr_iso 		= iso_def_sym +			,	gtr_isomap_group= NoIndex +			,	gtr_isomap		= EmptyDefinedSymbol		 +			,	gtr_isomap_from	= EmptyDefinedSymbol		 +			,	gtr_isomap_to	= EmptyDefinedSymbol +			,	gtr_cons_infos 	= cons_info_def_syms		  			}  		# gs_gtd_infos = {gs_gtd_infos & [glob_module, glob_object] = gtd_info}  -		# gs = { gs & gs_gtd_infos = gs_gtd_infos, gs_modules = gs_modules } +		# gs = { gs & gs_gtd_infos = gs_gtd_infos, gs_modules = gs_modules, gs_error = gs_error }  		# (from_fun_def, gs) = buildIsoFrom from_def_sym from_group_index glob_module type_def gs	  		# (to_fun_def, gs) = buildIsoTo to_def_sym to_group_index glob_module type_def gs	 @@ -410,16 +636,57 @@ where  			//buildUndefFunction iso_fun_index iso_group_index iso_name 1 gs_predefs gs_heaps	  			buildIsoRecord iso_def_sym iso_group_index from_def_sym to_def_sym gs	 -		# funs = [  -			from_fun_def,  -			to_fun_def,  -			iso_fun_def] -		# groups = [ -			{group_members = [from_fun_index]},  -			{group_members = [to_fun_index]},  -			{group_members = [iso_fun_index]}] +		# funs = cons_info_fun_defs ++ [ from_fun_def, to_fun_def, iso_fun_def ] +		# cons_groups =  +			if supportConsInfo  +				[{group_members = [ds_index]} \\ {ds_index} <- cons_info_def_syms]  +				[] +		# groups = cons_groups ++ 		 		 +			[	{group_members = [from_fun_index]}  +			,	{group_members = [to_fun_index]}  +			,	{group_members = [iso_fun_index]} +			]	 -		= (funs, groups, gs) +		= (funs, groups, gs)	 + +	build_cons_infos module_index type_def_index gs=:{gs_modules} +		# (type_def=:{td_rhs}, gs_modules) = getTypeDef module_index type_def_index gs_modules  +		# (common_defs, gs_modules) = gs_modules ! [module_index]				 +		# gs = {gs & gs_modules = gs_modules} +		= 	case td_rhs of +			(AlgType alts)	 +				-> case supportConsInfo of +					True -> build_alg_cons_infos alts common_defs gs +					False -> (repeatn (length alts) EmptyDefinedSymbol, [], [], gs) +			(RecordType {rt_constructor})  +				-> case supportConsInfo of +					True -> build_alg_cons_infos [rt_constructor] common_defs gs +					False -> ([EmptyDefinedSymbol], [], [], gs) +			_ -> ([], [], [], gs) + +	build_alg_cons_infos [] common_defs	gs +		= ([], [], [], gs)  	 +	build_alg_cons_infos [cons_def_sym:cons_def_syms] common_defs	gs +		# (fi, gi, fd, gs) = build_cons_info cons_def_sym common_defs gs +		# (fis, gis, fds, gs) = build_alg_cons_infos cons_def_syms common_defs	gs +		= ([fi:fis], [gi:gis], [fd:fds], gs)  + +	build_cons_info cons_def_sym common_defs gs +		# (fun_index, 	group_index, gs=:{gs_modules,gs_heaps, gs_predefs}) = newFunAndGroupIndex gs				 +		# cons_def = common_defs.com_cons_defs.[cons_def_sym.ds_index]		  +		# def_sym =  +			{	ds_ident = makeIdent ("cons_info:" +++ cons_def.cons_symb.id_name) +			, 	ds_index = fun_index +			,	ds_arity = 0 +			} +		# cons_name_expr = makeStringExpr ("\""+++cons_def.cons_symb.id_name+++"\"") gs_predefs +		# cons_arity_expr = makeIntExpr cons_def_sym.ds_arity		  +		# (cons_expr, gs_heaps) =  +			buildPredefConsApp PD_ConsCONSInfo [cons_name_expr, cons_arity_expr] gs_predefs gs_heaps +		# fun_def = makeFunction def_sym group_index [] cons_expr No [] [] cons_def.cons_pos				 +			 +		//# (fun_def, gs_heaps) = buildUndefFunction def_sym group_index gs_predefs gs_heaps +		= (def_sym, group_index, fun_def, {gs & gs_modules=gs_modules, gs_heaps=gs_heaps})  buildIsomapsForTypeDefs :: ![Global Index] !*GenericState  	-> (![FunDef], ![Group], !*GenericState) @@ -616,14 +883,121 @@ where  		-> (![FunDef], ![Group], !*{#ClassInstance}, !*GenericState)	  	build_instance module_index instance_index instance_defs gs=:{gs_modules}  		# (instance_def, instance_defs) = instance_defs ! [instance_index] -		| not instance_def.ins_generate +		| not instance_def.ins_is_generic  +			= ([], [], instance_defs, gs) +		 +		| instance_def.ins_generate +			#! (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}  +			= ([fun_def], [{group_members = [fun_def.fun_index]}], instance_defs, gs) + +		# (ok, gs) = check_whether_to_add_alternative instance_def gs +		| supportPartialInstances && ok			 +			#! (fun_def, fun_def_sym, gs) = build_instance_fun instance_def gs 				 +			#! (instance_def, ins_fun_def, gs)  +				= move_instance instance_def gs +			#! instance_defs = {instance_defs & [instance_index] = instance_def}  + +			#! (ins_fun_def, gs) = add_generic_alternative ins_fun_def fun_def gs +			 +			= (	[fun_def, ins_fun_def],  +				[{group_members = [fun_def.fun_index]}, {group_members = [ins_fun_def.fun_index]}],  +				instance_defs, gs) +				 +		| otherwise  			= ([], [], instance_defs, gs) +		 +	check_whether_to_add_alternative {ins_members,ins_type} gs=:{gs_predefs} +		#! it_type = hd ins_type.it_types	 +		= case it_type of +			(TA {type_index={glob_module,glob_object}} _)	 +				#! pd_unit = gs_predefs . [PD_TypeUNIT] +				#! pd_pair = gs_predefs . [PD_TypePAIR] +				#! pd_either = gs_predefs . [PD_TypeEITHER] +				#! pd_arrow = gs_predefs . [PD_TypePAIR] +				| glob_module == pd_unit.pds_module &&  +				  (	glob_object == pd_unit.pds_def || +					glob_object == pd_either.pds_def || +					glob_object == pd_pair.pds_def || +					glob_object == pd_arrow.pds_def)			 +					-> (False, gs) +				# ins_fun_ds = ins_members.[0]	 +				# (ins_fun_def, gs) = get_fun_def ins_fun_ds.ds_index gs +					with +						get_fun_def fun_index gs=:{gs_fun_defs} +							# (fun_def, gs_fun_defs) = gs_fun_defs ! [fun_index] +							= (fun_def, {gs & gs_fun_defs = gs_fun_defs}) +						 +				# (TransformedBody {tb_rhs}) = ins_fun_def.fun_body   +				# ok = case tb_rhs of +							Case {case_default=No} 	-> True +							_ 						-> False +				-> (ok, gs)	 +			_ 	-> (False, gs)	 + +	 +	add_generic_alternative ins_fun_def gen_fun_def gs=:{gs_heaps, gs_main_dcl_module_n}	 +		# (TransformedBody tb) = ins_fun_def.fun_body +		# (Case cas) = tb.tb_rhs +		 +		#! (arg_exprs, new_tb_args, gs_heaps) =  buildBoundVarExprs tb.tb_args gs_heaps +		 +		#! gen_fun_ds =  +			{	ds_arity = gen_fun_def.fun_arity +			,	ds_ident = gen_fun_def.fun_symb +			,	ds_index = gen_fun_def.fun_index +			} +		#! (app_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n gen_fun_ds arg_exprs gs_heaps 		 +		#! case_expr = Case {cas & case_default = (Yes app_expr)} +		 +		#! ins_fun_def =  +			{	ins_fun_def +			&	fun_body = TransformedBody {tb & tb_rhs=case_expr, tb_args = new_tb_args} +			, 	fun_info = +				{	ins_fun_def.fun_info  +				& 	fi_calls =  +					[	{fc_level = NotALevel, fc_index = gen_fun_def.fun_index} +					:	ins_fun_def.fun_info.fi_calls ] +				}  +			} + +		= (ins_fun_def, {gs & gs_heaps = gs_heaps}) +			//---> ("created generic alterntaive for " +++ ins_fun_def.fun_symb.id_name) -		# {ins_class, ins_generic} = instance_def				 +	move_instance instance_def=:{ins_members} gs +		# (new_fun_index, new_fun_group, gs=:{gs_fun_defs, gs_predefs, gs_heaps})  +			= newFunAndGroupIndex gs +		# ins_fun_index = ins_members.[0].ds_index +		# (ins_fun_def, gs_fun_defs) = gs_fun_defs ! [ins_fun_index] + +		// new indexes in the function +		# ins_fun_def = +			{	ins_fun_def +			&	fun_index = new_fun_index +			,	fun_info = {ins_fun_def.fun_info & fi_group_index = new_fun_group}	 +			}							 +		#! new_member = {ins_members.[0] & ds_index = new_fun_index} +		#! instance_def = {instance_def & ins_members = {new_member}} + +/* +		// update old function +		#! (undef_expr, gs_heaps) = buildUndefFunApp [] gs_predefs gs_heaps +		# (TransformedBody {tb_args, tb_rhs}) = ins_fun_def.fun_body +		#! old_ins_fun_def =  +			{ 	ins_fun_def +			&	fun_body = TransformedBody {tb_args = tb_args, tb_rhs = undef_expr}  +			} +	 +		#! gs_fun_defs = {gs_fun_defs & [ins_fun_index] = old_ins_fun_def} +*/ +		= (instance_def, 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				  		# (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  -		# it_type = hd instance_def.ins_type.it_types  		# (fun_index, group_index, gs) = newFunAndGroupIndex {gs & gs_modules=gs_modules}  		# fun_def_sym = { @@ -634,11 +1008,8 @@ where  		//# (fun_def, gs) = build_dummy_instance fun_def_sym group_index gs	  		# (fun_def, gs) = buildInstance fun_def_sym group_index instance_def generic_def gs - -		# instance_def = { instance_def & ins_members = {fun_def_sym} }		 -		# instance_defs = {instance_defs & [instance_index] = instance_def}  -		= ([fun_def], [{group_members = [fun_index]}], instance_defs, gs) -		 +		= (fun_def, fun_def_sym, gs) +			  	build_dummy_instance fun_def_sym group_index gs=:{gs_predefs, gs_heaps}  		# (fun_def, gs_heaps) = buildUndefFunction fun_def_sym group_index gs_predefs gs_heaps  		= (fun_def, {gs & gs_heaps = gs_heaps})  @@ -932,6 +1303,70 @@ where  0.2*/  	copy_array array = {x \\ x <-: array}	 +buildClassDef1 :: !Index !Index !Index !GenericDef !TypeKind !*GenericState +	-> (!ClassDef, !MemberDef!, !GenericDef, *GenericState)	 +buildClassDef1 	module_index class_index member_index generic_def=:{gen_name, gen_classes} kind gs=:{gs_heaps} +	#! ident = makeIdent (gen_name.id_name +++ ":" +++ (toString kind)) +	#! class_ds={ds_ident=ident, ds_index=class_index, ds_arity=0} +	#! (class_var, gs_heaps) = build_class_var gs_heaps +	#! (member_def, gs_heaps) = build_member module_index class_index member_index class_var class_ds generic_def gs_heaps +	#! class_def = build_class module_index class_index member_index class_var kind ident generic_def member_def +	#! generic_def = { generic_def & 	gen_classes = [{gci_kind=kind,gci_class=class_ds}:gen_classes]} +	= (class_def, member_def, generic_def, {gs & gs_heaps = gs_heaps})  +		//---> ("generated class " +++ ident.id_name) +where + +	build_class_var heaps=:{hp_type_heaps=hp_type_heaps=:{th_vars}} +		#! (class_var, th_vars) = freshTypeVar (makeIdent "class_var") th_vars +		=(class_var, {heaps & hp_type_heaps = {hp_type_heaps & th_vars = th_vars}}) + +	build_member  +			module_index class_index member_index  +			class_var class_ds=:{ds_ident} generic_def=:{gen_type}  +			heaps=:{hp_var_heap, hp_type_heaps} +		#! (type_ptr, hp_var_heap) = newPtr VI_Empty hp_var_heap  +		#! (tc_var_ptr, hp_var_heap) = newPtr VI_Empty hp_var_heap   +		#! type_context = {  +			tc_class = {glob_module = module_index, glob_object=class_ds}, +			tc_types = [ TV class_var ],  +			tc_var = tc_var_ptr 				// ??? +			} +		#! (member_type, hp_type_heaps) = buildMemberType1 generic_def kind class_var hp_type_heaps +		#! member_type = { member_type & st_context = [type_context : gen_type.gt_type.st_context] } +		#! member_def = { +			me_symb = ds_ident, // same name as class +			me_class = {glob_module = module_index, glob_object = class_index}, +			me_offset = 0, +			me_type = member_type, +			me_type_ptr = type_ptr,				// empty +			me_class_vars = [class_var], 		// the same variable as in the class +			me_pos = generic_def.gen_pos, +			me_priority = NoPrio +			} +		= (member_def, {heaps & hp_type_heaps = hp_type_heaps, hp_var_heap = hp_var_heap}) +	 +	build_class  +			module_index class_index member_index class_var kind ident  +			generic_def=:{gen_pos} member_def=:{me_type} +		#! class_member = {ds_ident=ident, ds_index = member_index, ds_arity = me_type.st_arity} +		#! class_dictionary = {  +			ds_ident = ident,  +			ds_arity = 0,  +			ds_index = NoIndex/*index in the type def table, filled in later*/  +			} +		#! class_def = {  +			class_name = ident,  +			class_arity = 1,   +			class_args = [class_var], +		    class_context = [],  +		    class_pos = gen_pos,  +		    class_members = createArray 1 class_member,  +		    class_cons_vars = case kind of KindConst -> 0; _ -> 1, +		    class_dictionary = class_dictionary +		    }	  +			 +		= class_def	 +  currySymbolType :: !SymbolType !String !*TypeHeaps   	-> (!AType, ![AttributeVar], ![AttrInequality], !*TypeHeaps)  currySymbolType {st_args=[], st_result} attr_var_name th @@ -1074,8 +1509,7 @@ where  			= avs  		build_subst av=:{av_info_ptr} th=:{th_attrs}  			= { th & th_attrs = th_attrs <:= (av_info_ptr, AVI_Attr (TA_Var av))} -			 -			  +						   	build_generic_var_substs [] class_var [] kind th  		= th  	build_generic_var_substs [gv:gvs] class_var [tvs:tvss] kind th @@ -1152,82 +1586,40 @@ where  		#! (at, curry_avs, ais, th) = currySymbolType1 st ("arg"+++postfix) th		  		#! th = clearSymbolType gt_type th  		= (at, atvs, instantiated_avs ++ curry_avs, ais, th) - -/* -instantiateGenericVar :: !TypeAttribute !TypeVar !TypeKind !String !*TypeHeaps -	-> (!AType, !*TypeHeaps)  -instantiateGenericVar attr tv kind postfix th=:{th_vars, th_attrs}	 -	#! (fresh_tv, th_vars) = freshTypeVar (makeIdent tv.tv_name.id_name +++ postfix) th_vars -	#! (fresh_attr, th_attrs) = build_fresh_attr attr postfix th_attrs    	 -	= do_it fresh_attr fresh_tv kind {th & th_vars = th_vars, th_attrs = th_attrs} -where -	do_it attr tv KindConst postfix th -		= (makeAType fresh_tv fresh_attr, th) -	 -	do_it attr tv (KindArrow kinds) postfix type_var th		 -		#! postfixes = [makeIdent ("_" +++ toString i) \\ i <- [1..(length kinds) - 1]] -		#! (arg_types, th) = build_args attr (init kinds) postfixes th				 -		= (makeAType ((CV type_var) :@: arg_types) attr, th -	 -	build_fresh_attr (TA_Var av) postfix th_attrs  -		= freshAttrVar (makeIdent av.av_name.id_name +++ postfix) th_attrs -	build_fresh_attr TA_Unique postfix th_attrs = (TA_Unique, th_attrs) -	build_fresh_attr TA_Multi  postfix th_attrs = (TA_Multi, th_attrs) - -	build_args attr tv [] [] th = ([], th) -	build_args attr tv [k:ks] [postfix:postfixes] postfix th -		#! (t, th) = instantiateGenericVar attr tv k postfix th -		#! (ts, th) = instantiate_generic_vars attr tv ks postfixes th 		  -		= ([t:ts], th) 	 -		 -instantiateAType :: !AType !TypeKind !TypeVar !GenericType !TypeHeaps -	-> (!AType, !TypeHeaps) -instantiateAType atype=:{at_type=(TV tv)} KindConst type_var gen_type th -	= ({atype & at_type = TV tv}, th)  	 - - -buildMemberType1 :: !GenericType !TypeKind !TypeVar !*TypeHeaps  -	-> (!SymbolType, !*TypeHeaps)  -buildMemberType1 gen_type kind class_var th - -	// instantiate  - -	#! (gen_var_types, th) = instantiate_generic_vars gen_type.gt_vars kind th - -	// substitute all type variables in the st_args and st_result - -	// build lifting arguments - -	//  -*/	  -buildGenericRepType :: !TypeRhs !PredefinedSymbols !CommonDefs  -	-> AType -buildGenericRepType (AlgType alts) predefs common_defs -	= build_sum alts predefs common_defs.com_cons_defs +buildGenericRepType :: !Index !CheckedTypeDef !PredefinedSymbols !CommonDefs !*ErrorAdmin +	-> (!Bool, AType, !*ErrorAdmin) +buildGenericRepType td_module {td_rhs=(AlgType alts)} predefs common_defs error +	= (True, build_sum alts predefs common_defs.com_cons_defs, error)  where  	build_sum :: ![DefinedSymbol] !PredefinedSymbols !{#ConsDef} -> !AType  	build_sum [] predefs cons_defs = abort "no alternatives in typedef"  	build_sum [{ds_index}] predefs cons_defs -		#  cons_args = cons_defs.[ds_index].cons_type.st_args		 -		= buildProductType cons_args predefs  +		# cons_args = cons_defs.[ds_index].cons_type.st_args +		# atype = buildProductType cons_args predefs +		= case supportConsInfo of +			True -> buildATypeCONS atype predefs +			False -> atype   	build_sum alts predefs cons_defs   		# (l,r) = splitAt ((length alts) / 2) alts   		= buildATypeEITHER (build_sum l predefs cons_defs) (build_sum r predefs cons_defs) predefs -buildGenericRepType (RecordType {rt_constructor={ds_index}}) predefs common_defs -	# {cons_type={st_args}} = common_defs . com_cons_defs . [ds_index] -	= buildProductType st_args predefs - -buildGenericRepType (SynType type) predefs common_defs -	= type // is that correct ??? - -buildGenericRepType (AbstractType _) predefs common_defs -	= abort "can not create generic representation of an abstract type"  -		 -buildGenericRepType _ predefs cons_defs  -	= abort "cannot generate generic type represenation of this type" - +buildGenericRepType td_module {td_rhs=(RecordType {rt_constructor={ds_index}})} predefs common_defs error +	#! {cons_type={st_args}} = common_defs . com_cons_defs . [ds_index] +	#! atype = buildProductType st_args predefs +	#! atype = case supportConsInfo of +				True -> buildATypeCONS atype predefs +				False -> atype  +	= (True, atype, error) +	 +buildGenericRepType td_module {td_rhs=(SynType type)} predefs common_defs error +	= (True, type, error) // is that correct ??? + +buildGenericRepType  +		td_module td=:{td_rhs=(AbstractType _), td_name, td_arity, td_args, td_pos}  +		predefs common_defs error +	#! error = checkErrorWithIdentPos (newPosition td_name td_pos) "cannot build generic type repesentation for an abstract type" error +	= (False, makeAType TE TA_None, error)  buildIsoRecord :: !DefinedSymbol !Int !DefinedSymbol !DefinedSymbol !*GenericState  	-> (!FunDef, !*GenericState) @@ -1237,7 +1629,7 @@ buildIsoRecord  	# (from_expr, gs_heaps) 	= buildFunApp gs_main_dcl_module_n from_fun [] gs_heaps  	# (to_expr, gs_heaps) 		= buildFunApp gs_main_dcl_module_n to_fun [] gs_heaps	  	# (iso_expr, gs_heaps) 		= buildISO to_expr from_expr gs_predefs gs_heaps -	# fun_def = makeFunction def_sym group_index [] iso_expr No [] [from_fun.ds_index, to_fun.ds_index]					 +	# fun_def = makeFunction def_sym group_index [] iso_expr No [] [from_fun.ds_index, to_fun.ds_index]	NoPos				  	= (fun_def, {gs & gs_heaps = gs_heaps})  where  	build_fun_expr mod_index fun_def heaps=:{hp_expression_heap} @@ -1256,50 +1648,71 @@ buildIsoTo :: !DefinedSymbol !Int !Int !CheckedTypeDef !*GenericState  	-> (!FunDef, !*GenericState)  buildIsoTo   		def_sym group_index type_def_mod  -		type_def=:{td_rhs, td_name, td_index}  -		gs=:{gs_heaps, gs_predefs} +		type_def=:{td_rhs, td_name, td_index, td_pos}  +		gs=:{gs_heaps}  	# (arg_expr, arg_var, gs_heaps) = buildVarExpr "x" gs_heaps  -	# (body_expr, free_vars, gs_heaps) = build_body type_def_mod td_index td_rhs arg_expr gs_predefs gs_heaps	 -	# fun_def = makeFunction def_sym group_index [arg_var] body_expr No free_vars []	 -	= (fun_def, {gs & gs_heaps = gs_heaps}) +	# (cons_infos, gs) = get_cons_infos type_def_mod td_index {gs & gs_heaps = gs_heaps}  							 +	# (body_expr, free_vars, gs=:{gs_error}) =  +		build_body type_def_mod td_index td_rhs cons_infos arg_expr gs	 +	| not gs_error.ea_ok +		#! fun_def = makeFunction {def_sym&ds_arity=0} NoIndex [] EE No [] [] NoPos +		= (fun_def, {gs & gs_error = gs_error})	 +	# fun_call_indexes = [] // [ds_index \\  {ds_index} <- cons_infos]		 +	# fun_def = makeFunction def_sym group_index [arg_var] body_expr No free_vars fun_call_indexes NoPos	 +	= (fun_def, {gs & gs_error = gs_error})  		//---> fun_def  where -	build_body :: !Int !Int !TypeRhs !Expression !PredefinedSymbols !*Heaps  -		-> (!Expression, ![FreeVar], !*Heaps) - 	build_body type_def_mod type_def_index (AlgType def_symbols) arg_expr predefs heaps -		= build_body1 type_def_mod type_def_index def_symbols arg_expr predefs heaps +	get_cons_infos module_index td_index gs=:{gs_gtd_infos} +		# (GTDI_Generic {gtr_cons_infos}, gs_gtd_infos) = gs_gtd_infos ! [module_index, td_index] 							  + 		= (gtr_cons_infos, {gs & gs_gtd_infos = gs_gtd_infos}) + +	build_body :: !Int !Int !TypeRhs ![DefinedSymbol] !Expression !*GenericState  +		-> (!Expression, ![FreeVar], !*GenericState) + 	build_body type_def_mod type_def_index (AlgType def_symbols) cons_infos arg_expr gs +		= build_body1 type_def_mod type_def_index def_symbols cons_infos arg_expr gs -	build_body type_def_mod type_def_index (RecordType {rt_constructor}) arg_expr predefs heaps		 -		= build_body1 type_def_mod type_def_index [rt_constructor] arg_expr predefs heaps - -	build_body type_def_mod type_def_index (AbstractType _) arg_expr predefs heaps -		= abort "cannot build isomorphisms for an abstract type\n" 			 	 -	build_body type_def_mod type_def_index _ arg_expr predefs heaps -		= abort "building isomorphisms for this type is not supported\n" +	build_body type_def_mod type_def_index (RecordType {rt_constructor}) cons_infos arg_expr gs		 +		= build_body1 type_def_mod type_def_index [rt_constructor] cons_infos arg_expr gs + +	build_body type_def_mod type_def_index (AbstractType _) cons_infos arg_expr gs=:{gs_error} +		#! gs_error = checkErrorWithIdentPos (newPosition td_name td_pos) "cannot build isomorphisms for an abstract type" gs_error +		= (EE, [], {gs & gs_error = gs_error}) +	build_body type_def_mod type_def_index (SynType _) cons_infos arg_expr gs=:{gs_error} +		#! gs_error = checkErrorWithIdentPos (newPosition td_name td_pos) "cannot build isomorphisms for a synonym type" gs_error +		= (EE, [], {gs & gs_error = gs_error}) -	build_body1 type_def_mod type_def_index def_symbols arg_expr predefs heaps -		# (case_alts, free_vars, heaps) =  -			build_alts 0 (length def_symbols) type_def_mod def_symbols predefs heaps +	build_body1 type_def_mod type_def_index cons_def_syms cons_infos arg_expr gs +		# (case_alts, free_vars, gs=:{gs_heaps}) =  +			build_alts 0 (length cons_def_syms) type_def_mod cons_def_syms cons_infos gs  		# 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, free_vars, heaps)	 +		# (case_expr, gs_heaps) = buildCaseExpr arg_expr case_patterns gs_heaps +		= (case_expr, free_vars, {gs & gs_heaps = gs_heaps})	  			//---> (free_vars, case_expr)	 -	build_alts :: !Int !Int !Int ![DefinedSymbol] PredefinedSymbols !*Heaps  -		-> ([AlgebraicPattern], [FreeVar], !*Heaps) -	build_alts i n type_def_mod [] predef heaps = ([], [], heaps)  -	build_alts i n type_def_mod [def_symbol:def_symbols] predefs heaps -		# (alt, fvs, heaps) = build_alt i n type_def_mod def_symbol predefs heaps -		# (alts, free_vars, heaps) =  build_alts (i+1) n type_def_mod def_symbols predefs heaps 		 -		= ([alt:alts], fvs ++ free_vars, heaps) - -	build_alt :: !Int !Int !Int !DefinedSymbol PredefinedSymbols !*Heaps  -		-> (AlgebraicPattern, [FreeVar], !*Heaps) -	build_alt i n type_def_mod def_symbol=:{ds_ident, ds_arity} predefs heaps		 +	build_alts :: !Int !Int !Int ![DefinedSymbol] ![DefinedSymbol] !*GenericState  +		-> ([AlgebraicPattern], [FreeVar], !*GenericState) +	build_alts i n type_def_mod [] [] gs = ([], [], gs)  +	build_alts i n type_def_mod [cons_def_sym:cons_def_syms] [cons_info:cons_infos] gs +		# (alt, fvs, gs) = build_alt i n type_def_mod cons_def_sym cons_info gs +		# (alts, free_vars, gs) =  build_alts (i+1) n type_def_mod cons_def_syms cons_infos gs 		 +		= ([alt:alts], fvs ++ free_vars, gs) + +	build_alt :: !Int !Int !Int !DefinedSymbol !DefinedSymbol !*GenericState  +		-> (AlgebraicPattern, [FreeVar], !*GenericState) +	build_alt  +			i n type_def_mod def_symbol=:{ds_ident, ds_arity} cons_info  +			gs=:{gs_heaps, gs_predefs, gs_main_dcl_module_n}		  		# names = ["x" +++ toString (i+1) +++ toString k \\ k <- [1..ds_arity]] -		# (var_exprs, vars, heaps) = buildVarExprs names heaps  -		# (expr, heaps) = build_prod var_exprs predefs heaps -		# (expr, heaps) = build_sum i n expr predefs heaps +		# (var_exprs, vars, gs_heaps) = buildVarExprs names gs_heaps  +		# (expr, gs_heaps) = build_prod var_exprs gs_predefs gs_heaps		 +		# (expr, gs_heaps) = case supportConsInfo of +			True  +				//# (cons_info_expr, gs_heaps) = buildUndefFunApp [] gs_predefs gs_heaps +				# (cons_info_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n cons_info [] gs_heaps 	 +				-> buildCONS cons_info_expr expr gs_predefs gs_heaps +			False  +				-> (expr, gs_heaps)				 +		# (expr, gs_heaps) = build_sum i n expr gs_predefs gs_heaps  		# alg_pattern = {  			ap_symbol = {glob_module = type_def_mod, glob_object = def_symbol}, @@ -1307,7 +1720,7 @@ where  			ap_expr = expr,  			ap_position = NoPos  			} -		= (alg_pattern, vars, heaps) +		= (alg_pattern, vars, {gs & gs_heaps = gs_heaps})  	build_sum :: !Int !Int !Expression !PredefinedSymbols !*Heaps -> (!Expression, !*Heaps)  	build_sum i n expr predefs heaps @@ -1335,45 +1748,57 @@ buildIsoFrom :: !DefinedSymbol !Int !Int !CheckedTypeDef !*GenericState  	-> (!FunDef, !*GenericState)  buildIsoFrom   		def_sym group_index type_def_mod  -		type_def=:{td_rhs, td_name, td_index}  -		gs=:{gs_predefs, gs_heaps} -	# (body_expr, free_vars, gs_heaps) = build_body type_def_mod td_rhs gs_predefs gs_heaps -	# [arg_var: free_vars] = free_vars	 -	# fun_def = makeFunction def_sym group_index [arg_var] body_expr No free_vars []	 -	= (fun_def, {gs & gs_heaps = gs_heaps} ) +		type_def=:{td_rhs, td_name, td_index, td_pos}  +		gs=:{gs_predefs, gs_heaps, gs_error} +	#! (body_expr, free_vars, gs_heaps, gs_error) = build_body type_def_mod td_rhs gs_predefs gs_heaps gs_error +	| not gs_error.ea_ok +		#! fun_def = makeFunction {def_sym&ds_arity=0} NoIndex [] EE No [] [] td_pos +		= (fun_def, {gs & gs_heaps = gs_heaps, gs_error = gs_error} ) +	#! fun_def = makeFunction def_sym group_index [hd free_vars] body_expr No (tl free_vars) []	td_pos +	= (fun_def, {gs & gs_heaps = gs_heaps, gs_error = gs_error} )  		//---> fun_def  where	 -	build_body :: !Int !TypeRhs !PredefinedSymbols !*Heaps  -		-> (!Expression, ![FreeVar], !*Heaps) - 	build_body type_def_mod (AlgType def_symbols) predefs heaps -		= build_sum type_def_mod def_symbols predefs heaps -	build_body type_def_mod (RecordType {rt_constructor}) predefs heaps				 -		= build_sum type_def_mod [rt_constructor] predefs heaps	 -	build_body type_def_mod (AbstractType _) predefs heaps -		= abort "cannot build isomorphisms for an abstract type\n" 			 	 -	build_body type_def_mod _ predefs heaps -		= abort "builing isomorphisms for this is not supported\n" - -	build_sum :: !Index [DefinedSymbol] !PredefinedSymbols !*Heaps -		-> (!Expression, ![FreeVar], !*Heaps) -	build_sum type_def_mod [] predefs heaps +	build_body :: !Int !TypeRhs !PredefinedSymbols !*Heaps !*ErrorAdmin +		-> (!Expression, ![FreeVar], !*Heaps, !*ErrorAdmin) + 	build_body type_def_mod (AlgType def_symbols) predefs heaps error +		= build_sum type_def_mod def_symbols predefs heaps error +	build_body type_def_mod (RecordType {rt_constructor}) predefs heaps error				 +		= build_sum type_def_mod [rt_constructor] predefs heaps	error +	build_body type_def_mod (AbstractType _) predefs heaps error +		#! error = checkErrorWithIdentPos (newPosition td_name td_pos) "cannot build isomorphisms for an abstract type" error +		= (EE, [], heaps, error) +	build_body type_def_mod (SynType _) predefs heaps error +		#! error = checkErrorWithIdentPos (newPosition td_name td_pos) "cannot build isomorphisms for a synonym type" error +		= (EE, [], heaps, error) + +	build_sum :: !Index [DefinedSymbol] !PredefinedSymbols !*Heaps !*ErrorAdmin +		-> (!Expression, ![FreeVar], !*Heaps, !*ErrorAdmin) +	build_sum type_def_mod [] predefs heaps error  		= abort "algebraic type with no constructors!\n" -	build_sum type_def_mod [def_symbol] predefs heaps +	build_sum type_def_mod [def_symbol] predefs heaps error  		# (cons_app_expr, cons_args, heaps) = build_cons_app type_def_mod def_symbol heaps -		# (alt_expr, free_vars, heaps) = build_prod cons_app_expr cons_args predefs heaps  -		= (alt_expr, free_vars, heaps) -	build_sum type_def_mod def_symbols predefs heaps +		# (alt_expr, free_vars, heaps) = build_prod cons_app_expr cons_args predefs heaps 		 +		=	case supportConsInfo of +			True +				# (var_expr, var, heaps) = buildVarExpr "c" heaps +				# (info_var, heaps) = buildFreeVar0 "i" heaps +				# (alt_expr, heaps) = buildCaseCONSExpr var_expr info_var (hd free_vars) alt_expr predefs heaps    +				-> (alt_expr, [var, info_var : free_vars], heaps, error)										 +			False +				-> (alt_expr, free_vars, heaps, error) +				 +	build_sum type_def_mod def_symbols predefs heaps error  		# (var_expr, var, heaps) = buildVarExpr "e" heaps -		# (left_def_symbols, right_def_symbols) = splitAt ((length def_symbols) /2) def_symbols +		# (left_def_syms, right_def_syms) = splitAt ((length def_symbols) /2) def_symbols -		# (left_expr, left_vars, heaps) = build_sum type_def_mod left_def_symbols predefs heaps -		# (right_expr, right_vars, heaps) = build_sum type_def_mod right_def_symbols predefs heaps +		# (left_expr, left_vars, heaps, error) = build_sum type_def_mod left_def_syms predefs heaps error +		# (right_expr, right_vars, heaps, error) = build_sum type_def_mod right_def_syms predefs heaps error  		# (case_expr, heaps) =   			buildCaseEITHERExpr var_expr (hd left_vars, left_expr) (hd right_vars, right_expr) predefs heaps  		# vars = [var : left_vars ++ right_vars] -		= (case_expr, vars, heaps) -	 +		= (case_expr, vars, heaps, error) +		  	build_prod :: !Expression ![FreeVar] !PredefinedSymbols !*Heaps  		-> (!Expression, ![FreeVar], !*Heaps)  	build_prod expr [] predefs heaps @@ -1407,7 +1832,7 @@ buildIsomapFromTo :: !IsoDirection !DefinedSymbol !Int !Int !Int !*GenericState  buildIsomapFromTo   		iso_dir def_sym group_index type_def_mod type_def_index   		gs=:{gs_heaps, gs_modules} -	# (type_def=:{td_name, td_index, td_arity}, gs_modules)  +	# (type_def=:{td_name, td_index, td_arity, td_pos}, gs_modules)   		= getTypeDef type_def_mod type_def_index gs_modules  	# arg_names = [ "isomap" +++ toString n \\ n <- [1 .. td_arity]]  	# (isomap_arg_vars, gs_heaps) = buildFreeVars arg_names gs_heaps  @@ -1417,7 +1842,7 @@ buildIsomapFromTo  		build_body iso_dir type_def_mod td_index type_def arg_expr isomap_arg_vars gs	  	# (fun_type, gs) = build_type iso_dir type_def_mod type_def_index gs -	# fun_def = makeFunction def_sym group_index (isomap_arg_vars ++ [arg_var]) body_expr (Yes fun_type) free_vars []	 +	# fun_def = makeFunction def_sym group_index (isomap_arg_vars ++ [arg_var]) body_expr (Yes fun_type) free_vars [] td_pos	  	= (fun_def, gs)  where  	build_body :: !IsoDirection !Int !Int !CheckedTypeDef !Expression ![FreeVar] !*GenericState @@ -1427,9 +1852,24 @@ where  	build_body iso_dir type_def_mod type_def_index type_def=:{td_rhs=(RecordType {rt_constructor})} arg_expr isomap_arg_vars gs  		= build_body1 iso_dir type_def_mod type_def_index type_def [rt_constructor] arg_expr isomap_arg_vars gs -				 -	build_body iso_dir type_def_mod type_def_index _ arg_expr isomap_arg_vars gs -		= abort "cannot generate isomap for the type"		 +	 +	build_body  +			iso_dir type_def_mod type_def_index  +			type_def=:{td_rhs=(AbstractType _),td_name, td_pos} arg_expr isomap_arg_vars gs=:{gs_error} +		# gs_error = checkErrorWithIdentPos +				(newPosition td_name td_pos)  +				"cannot build map function for an abstract type"  +				gs_error +		= (EE, [], {gs & gs_error = gs_error}) + +	build_body  +			iso_dir type_def_mod type_def_index  +			type_def=:{td_rhs=(SynType _), td_name, td_pos} arg_expr isomap_arg_vars gs=:{gs_error} +		# gs_error = checkErrorWithIdentPos +				(newPosition td_name td_pos)  +				"cannot build map function for a synonym type"  +				gs_error +		= (EE, [], {gs & gs_error = gs_error})  	build_body1 iso_dir type_def_mod type_def_index type_def def_symbols arg_expr isomap_arg_vars gs  		# (case_alts, free_vars, gs=:{gs_heaps}) =  @@ -1546,7 +1986,7 @@ buildIsomapForTypeDef :: !DefinedSymbol !Int !Int !CheckedTypeDef !DefinedSymbol  	-> (!FunDef, !*GenericState)  buildIsomapForTypeDef	  		fun_def_sym group_index type_def_mod  -		type_def=:{td_name, td_index, td_arity} +		type_def=:{td_name, td_index, td_arity, td_pos}  		from_fun to_fun   		gs=:{gs_main_dcl_module_n, gs_heaps, gs_predefs}	   	# arg_names = [ "iso" +++ toString n \\ n <- [1 .. td_arity]]   @@ -1555,18 +1995,18 @@ buildIsomapForTypeDef  	# (from_expr, gs_heaps) = buildFunApp gs_main_dcl_module_n from_fun arg_exprs gs_heaps  	# (to_expr, gs_heaps) 	= buildFunApp gs_main_dcl_module_n to_fun arg_exprs gs_heaps	  	# (iso_expr, gs_heaps) 	= buildISO to_expr from_expr gs_predefs gs_heaps -	# fun_def = makeFunction fun_def_sym group_index arg_vars iso_expr No [] [from_fun.ds_index, to_fun.ds_index]					 +	# fun_def = makeFunction fun_def_sym group_index arg_vars iso_expr No [] [from_fun.ds_index, to_fun.ds_index] td_pos					  	= (fun_def, {gs & gs_heaps = gs_heaps})  buildIsomapForGeneric :: !DefinedSymbol !Int !GenericDef !*GenericState  	-> (!FunDef, !*GenericState) -buildIsomapForGeneric def_sym group_index {gen_type} gs=:{gs_heaps} +buildIsomapForGeneric def_sym group_index {gen_type, gen_pos} gs=:{gs_heaps}  	#! arg_names = [ "iso" +++ toString n \\ n <- [1 .. gen_type.gt_arity]]  	#! (arg_vars, gs_heaps) = buildFreeVars arg_names gs_heaps  	#! curried_gt_type = curry_symbol_type gen_type.gt_type  	#! gs = {gs & gs_heaps = gs_heaps }  	#! (body_expr, gs) = buildIsomapExpr curried_gt_type gen_type.gt_vars arg_vars gs 	 -	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] []					 +	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] [] gen_pos					  	= (fun_def, gs) 	  where  	// no uniqueness stuff is needed to build the @@ -1582,14 +2022,16 @@ buildIsomapExpr {at_type} arg_type_vars arg_vars gs  where  	build_expr :: !Type ![TypeVar] ![FreeVar] !*GenericState -		-> (!Expression, !*GenericState) +		-> (!Expression, !*GenericState)		 +	build_expr (TA {type_arity=0} _) arg_type_vars arg_vars gs=:{gs_predefs, gs_heaps} +		// isomap for types with no arguments is identity +		# (expr, gs_heaps) = buildIsomapIdApp gs_predefs gs_heaps +		= (expr, {gs & gs_heaps = gs_heaps})  	build_expr (TA {type_index, type_name} args) arg_type_vars arg_vars gs  		# (arg_exprs, gs) = build_exprs args arg_type_vars arg_vars gs  		# {gs_heaps, gs_main_dcl_module_n, gs_gtd_infos} = gs			  		# (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [type_index.glob_module, type_index.glob_object]		 -		# gt = case gtd_info of -			 		(GTDI_Generic gt) -> gt -			 		_ 	-> abort ("not a generic type " +++ type_name.id_name)  +		# (GTDI_Generic gt) = gtd_info  		# (expr, gs_heaps) = buildFunApp gs_main_dcl_module_n gt.gtr_isomap arg_exprs gs_heaps			  		= (expr, {gs & gs_heaps = gs_heaps, gs_gtd_infos = gs_gtd_infos}) @@ -1600,12 +2042,9 @@ where  		# (expr, gs_heaps) = buildIsomapArrowApp arg_expr res_expr gs_predefs gs_heaps  		= (expr, {gs & gs_heaps = gs_heaps}) -	build_expr (cons_var :@: args) arg_type_vars arg_vars gs -		# (arg_exprs, gs) = build_exprs args arg_type_vars arg_vars gs -		# type_var = case cons_var of -			CV type_var -> type_var -			_ -> abort "cons_var not implemented\n" -		# (cons_var_expr, gs) = build_expr_for_type_var type_var arg_type_vars arg_vars gs +	build_expr ((CV type_var) :@: args) arg_type_vars arg_vars gs +		#! (arg_exprs, gs) = build_exprs args arg_type_vars arg_vars gs +		#! (cons_var_expr, gs) = build_expr_for_type_var type_var arg_type_vars arg_vars gs	  		= (cons_var_expr @ arg_exprs, gs)  	build_expr (TB baric_type) arg_type_vars arg_vars gs=:{gs_predefs, gs_heaps}		 @@ -1620,7 +2059,6 @@ where  		= build_expr_for_type_var type_var arg_type_vars arg_vars gs   	build_expr (TLifted type_var) arg_type_vars arg_vars gs  		= build_expr_for_type_var type_var arg_type_vars arg_vars gs  -  	build_expr _ arg_type_vars arg_vars gs  		= abort "type does not match\n" @@ -1639,20 +2077,20 @@ buildInstance :: !DefinedSymbol !Int !ClassInstance !GenericDef !*GenericState  	-> (!FunDef, !*GenericState)  buildInstance   		def_sym group_index  -		instance_def=:{ins_type, ins_generic}  +		instance_def=:{ins_type, ins_generic, ins_pos, ins_ident}   		generic_def=:{gen_name, gen_type, gen_isomap}   		gs=:{gs_heaps}	  	#! original_arity 	= gen_type.gt_type.st_arity  	#! generated_arity 	= def_sym.ds_arity - original_arity // arity of kind -	#! generated_arg_names = [ "f"/*gen_name.id_name*/ +++ toString n \\ n <- [1 .. generated_arity]] +	#! generated_arg_names = [ "f" +++ toString n \\ n <- [1 .. generated_arity]]  	#! (generated_arg_vars, gs_heaps) = buildFreeVars generated_arg_names gs_heaps	  	#! original_arg_names = 	[ "x" +++ toString n \\ n <- [1 .. original_arity]]    	#! (original_arg_exprs, original_arg_vars, gs_heaps) = buildVarExprs original_arg_names gs_heaps	  	#! arg_vars = generated_arg_vars ++ original_arg_vars -	#! (gt=:{gtr_type, gtr_type_args}, gs) = get_generic_type ins_type {gs & gs_heaps = gs_heaps } 	 +	#! (gt=:{gtr_type, gtr_type_args}, gs) = get_generic_type ins_type {gs & gs_heaps = gs_heaps } 		  	#! gen_glob_def_sym = {  		glob_module = ins_generic.glob_module,  		glob_object = { @@ -1664,22 +2102,24 @@ buildInstance  	#! (adaptor_expr, gs)	 = build_adaptor_expr gt gen_isomap gs    		//---> ("generic type", gtr_type) +		  	#! (instance_expr, gs)	 = build_instance_expr gtr_type gtr_type_args generated_arg_vars gen_glob_def_sym gs  -		//---> ("build_instance_expr", gtr_type_args, generated_arg_vars) -	#! body_expr = (adaptor_expr @ [instance_expr]) @ original_arg_exprs +		//---> ("build_instance_expr", gtr_type_args, generated_arg_vars)		 +	#! body_expr = if (isEmpty original_arg_exprs) +		(adaptor_expr @ [instance_expr])  +		((adaptor_expr @ [instance_expr]) @ original_arg_exprs) -	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] []					 +	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] [] ins_pos					  	= (fun_def, gs) 	  where  	get_generic_type :: !InstanceType !*GenericState   		-> (GenericTypeRep, !*GenericState) -	get_generic_type ins_type gs=:{gs_modules, gs_gtd_infos} +	get_generic_type ins_type gs=:{gs_modules, gs_gtd_infos, gs_error}  		# instance_type = hd ins_type.it_types  		# {type_index} = case instance_type of  -			TA type_symb_ident _ -> type_symb_ident -			_ -> abort "invalid type of generic instance" -		 -		#! (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [type_index.glob_module, type_index.glob_object] +			TA type_symb_ident _ 	-> type_symb_ident +			_ 						-> abort "no generic type represetation"  +		# (gtd_info, gs_gtd_infos) = gs_gtd_infos ! [type_index.glob_module, type_index.glob_object]  		# (GTDI_Generic gt) = gtd_info   		= (gt, {gs & gs_gtd_infos = gs_gtd_infos, gs_modules = gs_modules}) @@ -1696,6 +2136,12 @@ where  		# (exprs, gs_heaps) = build_iso_exprs (n - 1) iso gs_main_dcl_module_n gs_heaps	  		= ([expr:exprs], gs_heaps) +	// e.g. for eq on lists:  +	// 		eqEITHER eqUNIT (eqPAIR eqElt (eqList eqElt)) +	// with cons info: +	// 		eqEITHER  +	//			(eqCONS info_Nil eqUNIT)  +	//			(eqCONS info_Cons (eqPAIR eqElt (eqList eqElt)))  	build_instance_expr :: !AType ![TypeVar] ![FreeVar] !(Global DefinedSymbol) !*GenericState   		-> (Expression, !*GenericState)  	build_instance_expr {at_type} type_vars vars gen_sym gs  @@ -1707,11 +2153,12 @@ where  		# (kind, gs) = get_kind_of_type_def type_index gs	  		= build_generic_app gen_sym kind arg_exprs gs -	build_instance_expr1 (arg_type --> res_type) type_vars vars gen_sym gs	 -		= abort "build_instance_expr1: arrow type\n" -	build_instance_expr1 (type_cons_var :@: type_args) type_vars vars gen_sym gs	 -		= abort "build_instance_expr1: type cons var application\n" -				 +	build_instance_expr1 (arg_type --> res_type) type_vars vars gen_sym gs=:{gs_error}	 +		# gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) "arrow types are not yet supported" gs_error +		= (EE, {gs & gs_error = gs_error}) +	build_instance_expr1 (type_cons_var :@: type_args) type_vars vars gen_sym gs=:{gs_error}	 +		# gs_error = checkErrorWithIdentPos (newPosition ins_ident ins_pos) "application of type constructor variable is not supported" gs_error +		= (EE, {gs & gs_error = gs_error})				  	build_instance_expr1 (TB basic_type) type_vars vars gen_sym gs 	  		= build_generic_app gen_sym KindConst [] gs  	build_instance_expr1 (TV type_var) type_vars vars gen_sym gs  @@ -1722,8 +2169,7 @@ where  		= build_expr_for_type_var type_var type_vars vars gs   	build_instance_expr1 _ type_vars vars gen_sym gs  		= abort "build_instance_expr1: type does not match\n"  -	 -		 +			  	build_expr_for_type_var type_var type_vars vars gs=:{gs_predefs, gs_heaps}  		# (var_expr, gs_heaps) = buildExprForTypeVar type_var type_vars vars gs_predefs gs_heaps   		= (var_expr, {gs & gs_heaps = gs_heaps}) @@ -1772,7 +2218,7 @@ buildKindConstInstance  	# (gen_exprs, gs_heaps) = mapSt build_gen_expr [1 .. (length kinds) - 1] gs_heaps  	#! (body_expr, gs_heaps) = buildGenericApp generic_module generic_def_sym kind (gen_exprs ++ arg_exprs) gs_heaps -	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] []					 +	#! fun_def = makeFunction def_sym group_index arg_vars body_expr No [] [] NoPos					  	= (fun_def, {gs & gs_heaps = gs_heaps})	  where  	build_gen_expr _ heaps @@ -1973,6 +2419,12 @@ where  		= performOnTypeVars on_type_var at th_vars  	on_type_var ta tv=:{tv_info_ptr} th_vars  		= writePtr tv_info_ptr (TVI_Attribute ta) th_vars + +buildTypeApp :: !Index !CheckedTypeDef [AType] -> AType +buildTypeApp  td_module {td_name, td_arity, td_index} args +	# global_index = {glob_module = td_module, glob_object = td_index} +	# type_symb = MakeTypeSymbIdent global_index td_name (length args) 	 + 	= makeAType (TA type_symb args) TA_Multi  buildPredefTypeApp :: !Int [AType] !PredefinedSymbols -> !AType  buildPredefTypeApp predef_index args predefs @@ -1985,7 +2437,8 @@ buildATypeISO	x y predefs = buildPredefTypeApp PD_TypeISO [x, y] predefs  buildATypeUNIT  predefs		= buildPredefTypeApp PD_TypeUNIT [] predefs  buildATypePAIR x y predefs 	= buildPredefTypeApp PD_TypePAIR [x, y] predefs  buildATypeEITHER x y predefs = buildPredefTypeApp PD_TypeEITHER [x, y] predefs - +buildATypeARROW x y predefs = buildPredefTypeApp PD_TypeARROW [x, y] predefs +buildATypeCONS	x predefs 	= buildPredefTypeApp PD_TypeCONS [x] predefs  buildProductType :: ![AType] !PredefinedSymbols -> !AType   buildProductType [] predefs = buildATypeUNIT predefs @@ -1998,9 +2451,9 @@ buildProductType types predefs  // Functions   //=================================== -makeFunction :: !DefinedSymbol !Index ![FreeVar] Expression !(Optional SymbolType) [FreeVar] [Index]  +makeFunction :: !DefinedSymbol !Index ![FreeVar] Expression !(Optional SymbolType) [FreeVar] [Index] Position  	-> FunDef -makeFunction {ds_index, ds_arity, ds_ident} group_index arg_vars body_expr opt_sym_type local_vars fun_call_indexes +makeFunction {ds_index, ds_arity, ds_ident} group_index arg_vars body_expr opt_sym_type local_vars fun_call_indexes fun_pos  	| length arg_vars <> ds_arity   		= abort "length arg_vars <> ds_arity\n"    	= { @@ -2012,12 +2465,12 @@ makeFunction {ds_index, ds_arity, ds_ident} group_index arg_vars body_expr opt_s  			tb_rhs = body_expr  			},  		fun_type = opt_sym_type, -		fun_pos = NoPos, +		fun_pos = fun_pos,  		fun_index = ds_index,  		fun_kind  = FK_ImpFunction cNameNotLocationDependent,  		fun_lifted = 0,  		fun_info = {	 -			fi_calls = map (\ind->{fc_level = NotALevel, fc_index = ind}) fun_call_indexes,	 +			fi_calls = [{fc_level = NotALevel, fc_index = ind} \\ ind <- fun_call_indexes],	  			fi_group_index = group_index,  			fi_def_level = NotALevel,  			fi_free_vars =  [], @@ -2059,7 +2512,7 @@ where  		| n_new_fun_defs <> gs_last_fun - gs_first_fun  			= abort "error in number of fun_defs" 	  		# fun_defs = createArray (n_new_fun_defs + n_gs_fun_defs)  -			(makeFunction EmptyDefinedSymbol NoIndex [] EE No [] []) +			(makeFunction EmptyDefinedSymbol NoIndex [] EE No [] [] NoPos)  		#! fun_defs = { fun_defs & [i] = gs_fun_defs . [i] \\ i <- [0..(n_gs_fun_defs - 1)]}  		#! fun_defs = { fun_defs & [i] = check_fun fun_def i \\   			i <- [n_gs_fun_defs .. (n_gs_fun_defs + n_new_fun_defs - 1)] &  @@ -2102,7 +2555,7 @@ where  buildIdFunction :: !DefinedSymbol Int !Ident !PredefinedSymbols !*Heaps-> (!FunDef, !*Heaps)  buildIdFunction def_sym group_index name predefs heaps  	# (arg_expr, arg_var, heaps) = buildVarExpr "x" heaps  -	# fun_def = makeFunction def_sym group_index [arg_var] arg_expr No [] []		 +	# fun_def = makeFunction def_sym group_index [arg_var] arg_expr No [] [] NoPos	  	= (fun_def, heaps)  buildUndefFunction :: !DefinedSymbol !Int !PredefinedSymbols !*Heaps-> (!FunDef, !*Heaps) @@ -2111,7 +2564,7 @@ buildUndefFunction def_sym group_index predefs heaps  	# (arg_vars, heaps) = mapSt build_free_var names heaps  	# (body_expr, heaps) = buildUndefFunApp [] predefs heaps  	//# (body_expr, heaps) = buildUNIT predefs heaps -	# fun_def = makeFunction def_sym group_index arg_vars body_expr No [] []		 +	# fun_def = makeFunction def_sym group_index arg_vars body_expr No [] [] NoPos	  	= (fun_def, heaps)  where  	build_free_var :: !String !*Heaps -> (!FreeVar, !*Heaps) @@ -2146,6 +2599,7 @@ buildUNITPattern expr predefs :== buildPredefConsPattern PD_ConsUNIT [] expr pre  buildLEFTPattern var expr predefs :== buildPredefConsPattern PD_ConsLEFT [var] expr predefs  buildRIGHTPattern var expr predefs :== buildPredefConsPattern PD_ConsRIGHT [var] expr predefs  buildPAIRPattern var1 var2 expr predefs :== buildPredefConsPattern PD_ConsPAIR [var1, var2] expr predefs +buildCONSPattern cons_info_var cons_arg_var expr predefs :== buildPredefConsPattern PD_ConsCONS [cons_info_var, cons_arg_var] expr predefs  //===================================  // Expressions  @@ -2236,6 +2690,16 @@ buildCasePAIRExpr arg_expr var1 var2 body_expr predefs heaps  	# case_patterns = AlgebraicPatterns {glob_module = pds_module, glob_object = pds_def} [pair_pat]	  	= buildCaseExpr arg_expr case_patterns heaps +buildCaseCONSExpr :: !Expression !FreeVar !FreeVar !Expression !PredefinedSymbols !*Heaps +	-> (!Expression, !*Heaps) +buildCaseCONSExpr arg_expr cons_info_var arg_var body_expr predefs heaps +	# cons_pat = buildCONSPattern cons_info_var arg_var body_expr predefs	 +	# {pds_module, pds_def} = predefs.[PD_TypeCONS] +	# case_patterns = AlgebraicPatterns {glob_module = pds_module, glob_object = pds_def} [cons_pat]	 +	= buildCaseExpr arg_expr case_patterns heaps +	 + +  buildPredefConsApp :: !Int [Expression] !PredefinedSymbols !*Heaps  	-> (!Expression, !*Heaps)  buildPredefConsApp predef_index args predefs heaps=:{hp_expression_heap} @@ -2255,6 +2719,8 @@ buildUNIT predefs heaps		:== buildPredefConsApp PD_ConsUNIT [] predefs heaps  buildPAIR x y predefs heaps	:== buildPredefConsApp PD_ConsPAIR [x, y] predefs heaps  buildLEFT x predefs heaps	:== buildPredefConsApp PD_ConsLEFT [x] predefs heaps  buildRIGHT x predefs heaps	:== buildPredefConsApp PD_ConsRIGHT [x] predefs heaps +buildARROW x y predefs heaps :== buildPredefConsApp PD_ConsARROW [x, y] predefs heaps +buildCONS cons_info arg predefs heaps :== buildPredefConsApp PD_ConsCONS [cons_info, arg] predefs heaps  buildPredefFunApp :: !Int [Expression] !PredefinedSymbols !*Heaps  	-> (!Expression, !*Heaps) @@ -2315,6 +2781,15 @@ buildFreeVar name heaps=:{hp_var_heap}  	# var = { fv_def_level = NotALevel, fv_count = 1, fv_info_ptr = var_info_ptr, fv_name = var_name}  	= (var, {heaps & hp_var_heap = hp_var_heap}) + +buildFreeVar0 :: !String !*Heaps -> (!FreeVar, !*Heaps) +buildFreeVar0 name heaps=:{hp_var_heap} +	# (var_info_ptr, hp_var_heap) = newPtr VI_Empty hp_var_heap +	# var_name = { id_name = name, id_info = nilPtr } +	# var = { fv_def_level = NotALevel, fv_count = 0, fv_info_ptr = var_info_ptr, fv_name = var_name} +	= (var, {heaps & hp_var_heap = hp_var_heap}) + +  buildFreeVars :: ![String] !*Heaps -> (![FreeVar], !*Heaps)  buildFreeVars names heaps = mapSt buildFreeVar names heaps 	 @@ -2338,6 +2813,15 @@ buildBoundVarExprs [free_var:free_vars] heaps  makeIdent :: String -> Ident  makeIdent str = {id_name = str, id_info = nilPtr}  +makeIntExpr :: Int -> Expression +makeIntExpr value = BasicExpr (BVI (toString value)) BT_Int + +makeStringExpr :: String !PredefinedSymbols -> Expression +makeStringExpr str predefs +	#! {pds_ident, pds_module, pds_def} = predefs.[PD_StringType] +	#! type_symb = MakeTypeSymbIdent { glob_module = pds_module, glob_object = pds_def } pds_ident 0 +	=  BasicExpr (BVS str) (BT_String (TA type_symb [])) +  transpose []             = []  transpose [[] : xss]     = transpose xss  transpose [[x:xs] : xss] =  diff --git a/frontend/overloading.icl b/frontend/overloading.icl index bd16b9e..4ef4143 100644 --- a/frontend/overloading.icl +++ b/frontend/overloading.icl @@ -695,10 +695,11 @@ where  			 heaps_and_ptrs)  	adjust_member_application  defs contexts  {me_symb,me_offset,me_class={glob_module,glob_object}} symb_arity (CA_Context tc) class_exprs (heaps=:{hp_type_heaps}, ptrs)  		# (class_context, address, hp_type_heaps) = determineContextAddress contexts defs tc hp_type_heaps -		  {class_dictionary={ds_index}} = defs.[glob_module].com_class_defs.[glob_object] +		  {class_dictionary={ds_index,ds_ident}} = defs.[glob_module].com_class_defs.[glob_object]  		  selector = selectFromDictionary glob_module ds_index me_offset defs  		= (EI_Selection (generateClassSelection address [RecordSelection selector me_offset]) class_context.tc_var class_exprs,  				({ heaps & hp_type_heaps = hp_type_heaps }, ptrs)) +  	adjust_member_application defs contexts  _ _ (CA_GlobalTypeCode {tci_index,tci_contexts}) _ heaps_and_ptrs  		# (exprs, heaps_and_ptrs) = convertClassApplsToExpressions defs contexts tci_contexts heaps_and_ptrs  		= (EI_TypeCode (TCE_Constructor tci_index (map expressionToTypeCodeExpression exprs)), heaps_and_ptrs) diff --git a/frontend/parse.icl b/frontend/parse.icl index 02a07e1..bdc3736 100644 --- a/frontend/parse.icl +++ b/frontend/parse.icl @@ -1228,6 +1228,7 @@ wantGenericDefinition context pos pState  				,	gt_arity = length arg_vars  				}  		,	gen_pos = pos +		,	gen_kinds_ptr = nilPtr  		,	gen_classes = []  		,	gen_isomap = MakeDefinedSymbol {id_name="",id_info=nilPtr} NoIndex 0  		} diff --git a/frontend/predef.dcl b/frontend/predef.dcl index cfa0c04..ad7ff6f 100644 --- a/frontend/predef.dcl +++ b/frontend/predef.dcl @@ -105,20 +105,26 @@ PD_ConsPAIR					:== 145  PD_TypeARROW				:== 146  PD_ConsARROW				:== 147 -PD_isomap_ARROW_			:== 148 -PD_isomap_ID				:== 149 +PD_TypeCONSInfo				:== 148  +PD_ConsCONSInfo				:== 149 +PD_cons_info				:== 150 +PD_TypeCONS					:== 151 +PD_ConsCONS					:== 152 + +PD_isomap_ARROW_			:== 153 +PD_isomap_ID				:== 154  /* StdMisc */ -PD_StdMisc					:== 150 -PD_abort					:== 151 -PD_undef					:== 152 +PD_StdMisc					:== 155 +PD_abort					:== 156 +PD_undef					:== 157 -PD_Start					:== 153 +PD_Start					:== 158  // MW.. -PD_DummyForStrictAliasFun	:== 154 +PD_DummyForStrictAliasFun	:== 159 -PD_NrOfPredefSymbols		:== 155 +PD_NrOfPredefSymbols		:== 160  // ..MW  GetTupleConsIndex tup_arity :== PD_Arity2TupleSymbol + tup_arity - 2 diff --git a/frontend/predef.icl b/frontend/predef.icl index 327e7ba..e33a4c8 100644 --- a/frontend/predef.icl +++ b/frontend/predef.icl @@ -103,20 +103,26 @@ PD_ConsPAIR					:== 145  PD_TypeARROW				:== 146  PD_ConsARROW				:== 147 -PD_isomap_ARROW_			:== 148 -PD_isomap_ID				:== 149 +PD_TypeCONSInfo				:== 148  +PD_ConsCONSInfo				:== 149 +PD_cons_info				:== 150 +PD_TypeCONS					:== 151 +PD_ConsCONS					:== 152 + +PD_isomap_ARROW_			:== 153 +PD_isomap_ID				:== 154  /* StdMisc */ -PD_StdMisc					:== 150 -PD_abort					:== 151 -PD_undef					:== 152 +PD_StdMisc					:== 155 +PD_abort					:== 156 +PD_undef					:== 157 -PD_Start					:== 153 +PD_Start					:== 158  // MW.. -PD_DummyForStrictAliasFun	:== 154 +PD_DummyForStrictAliasFun	:== 159 -PD_NrOfPredefSymbols		:== 155 +PD_NrOfPredefSymbols		:== 160  // ..MW @@ -211,6 +217,11 @@ where  					<<- ("ARROW",				IC_Expression, 	PD_ConsARROW)										  					<<- ("isomap_ARROW_",		IC_Expression, 	PD_isomap_ARROW_)										  					<<- ("isomap_ID",			IC_Expression, 	PD_isomap_ID)										 +					<<- ("CONSInfo",			IC_Type, 		PD_TypeCONSInfo)					 +					<<- ("_CONSInfo",			IC_Expression,	PD_ConsCONSInfo)					 +					<<- ("CONS",				IC_Type, 		PD_TypeCONS)					 +					<<- ("CONS",				IC_Expression,	PD_ConsCONS)					 +					<<- ("_cons_info",			IC_Expression, 	PD_cons_info)										  					<<- ("StdMisc",				IC_Module, 		PD_StdMisc)  					<<- ("abort",				IC_Expression, 	PD_abort) diff --git a/frontend/syntax.dcl b/frontend/syntax.dcl index 623462f..fc1476b 100644 --- a/frontend/syntax.dcl +++ b/frontend/syntax.dcl @@ -269,6 +269,7 @@ cNameLocationDependent :== True  	,	gen_member_name	:: !Ident				// the generics name in the IC_Member  	,	gen_type		:: !GenericType  	, 	gen_pos			:: !Position +	,	gen_kinds_ptr	:: !TypeVarInfoPtr		// hack: contains all used kinds   	, 	gen_classes		:: !GenericClassInfos 	// generated classes  	,	gen_isomap		:: !DefinedSymbol		// isomap function  	} @@ -865,6 +866,7 @@ cNonRecursiveAppl	:== False  					| TVI_Used /* to administer that this variable is encountered (in checkOpenTypes) */  					| TVI_TypeCode !TypeCodeExpression  					| TVI_CPSLocalTypeVar !Int /* MdM - the index of the variable as generated by the theorem prover */ +					| TVI_Kinds ![TypeKind] // AA: used to collect kinds during checking   					| TVI_Normalized !Int /* MV - position of type variable in its definition */  ::	TypeVarInfoPtr	:== Ptr TypeVarInfo diff --git a/frontend/syntax.icl b/frontend/syntax.icl index 80889f9..64c62b4 100644 --- a/frontend/syntax.icl +++ b/frontend/syntax.icl @@ -259,6 +259,7 @@ cNameLocationDependent :== True  	,	gen_member_name	:: !Ident	// the generics name in IC_Member  	,	gen_type		:: !GenericType  	, 	gen_pos			:: !Position +	,	gen_kinds_ptr	:: !TypeVarInfoPtr		// hack: contains all used kinds   	, 	gen_classes		:: !GenericClassInfos 	// generated classes  	,	gen_isomap		:: !DefinedSymbol		// isomap function  	} @@ -835,6 +836,7 @@ cNotVarNumber :== -1  					| TVI_Used /* to adminster that this variable is encountered (in checkOpenTypes) */  					| TVI_TypeCode !TypeCodeExpression  					| TVI_CPSLocalTypeVar !Int /* MdM - the index of the variable as generated by the theorem prover */ +					| TVI_Kinds ![TypeKind] // AA: used to collect kinds during checking   					| TVI_Normalized !Int /* MV - position of type variable in its definition */  ::	TypeVarInfoPtr	:== Ptr TypeVarInfo | 
