Commit 8b5a14d2 authored by Martijn Vervoort's avatar Martijn Vervoort
Browse files

- type synonyms in type definition written to a tcl-file are fully expanded now.

parent 31fac1de
...@@ -13,7 +13,6 @@ extended_unify_and_coerce no yes :== no; // change also _unify and _coerce in St ...@@ -13,7 +13,6 @@ extended_unify_and_coerce no yes :== no; // change also _unify and _coerce in St
import type_io; import type_io;
//import pp; //import pp;
:: TypeCodeVariableInfo = TCI_TypeVar !Expression | TCI_TypePatternVar !Expression :: TypeCodeVariableInfo = TCI_TypeVar !Expression | TCI_TypePatternVar !Expression
:: DynamicValueAliasInfo :== BoundVar :: DynamicValueAliasInfo :== BoundVar
...@@ -49,22 +48,27 @@ fatal :: {#Char} {#Char} -> .a ...@@ -49,22 +48,27 @@ fatal :: {#Char} {#Char} -> .a
fatal function_name message fatal function_name message
= abort ("convertDynamics, " +++ function_name +++ ": " +++ message) = abort ("convertDynamics, " +++ function_name +++ ": " +++ message)
//write_tcl_file :: !Int {#DclModule} CommonDefs !*File [String] -> (.Bool,.File) write_tcl_file main_dcl_module_n dcl_mods=:{[main_dcl_module_n] = main_dcl_module} icl_common_defs tcl_file directly_imported_dcl_modules global_type_instances ci_type_constructor_used_in_dynamic_patterns type_heaps
//write_tcl_file :: !Int {#DclModule} CommonDefs !*File [String] _ _ !*TypeHeaps !*PredefinedSymbols -> (.Bool,.File,!*TypeHeaps,!*PredefinedSymbols) predefined_symbols imported_types var_heap common_defs icl_mod
// write_tcl_file ({#},{!},{#},[{#Char}],CommonDefs,{#}) :: !.Int !{#y:DclModule} CommonDefs !*File [{#Char}] !{!x:GlobalTCType} {#w:Bool} !*TypeHeaps !{#v:PredefinedSymbol} -> (.Bool,.File,.TypeHeaps,{#PredefinedSymbol}), [u <=
write_tcl_file main_dcl_module_n dcl_mods=:{[main_dcl_module_n] = main_dcl_module} common_defs tcl_file directly_imported_dcl_modules global_type_instances ci_type_constructor_used_in_dynamic_patterns type_heaps predefined_symbols
# (pre_mod, predefined_symbols) = predefined_symbols![PD_PredefinedModule] # (pre_mod, predefined_symbols) = predefined_symbols![PD_PredefinedModule]
# write_type_info_state2 # write_type_info_state2
= { WriteTypeInfoState | = { WriteTypeInfoState |
wtis_type_heaps = type_heaps wtis_n_type_vars = 0
, wtis_n_type_vars = 0 , wtis_predefined_module_def = pre_mod.pds_module
, wtis_predefined_module_def = pre_mod.pds_module , wtis_common_defs = common_defs
, wtis_type_defs = imported_types
, wtis_collected_conses = []
, wtis_type_heaps = type_heaps
, wtis_var_heap = var_heap
, wtis_main_dcl_module_n = main_dcl_module_n
}; };
# (j,tcl_file) # (j,tcl_file)
= fposition tcl_file = fposition tcl_file
#! (tcl_file,write_type_info_state) #! (tcl_file,write_type_info_state)
= write_type_info common_defs tcl_file write_type_info_state2 = write_type_info icl_common_defs tcl_file write_type_info_state2
#! (tcl_file,write_type_info_state) #! (tcl_file,write_type_info_state)
= write_type_info directly_imported_dcl_modules tcl_file write_type_info_state = write_type_info directly_imported_dcl_modules tcl_file write_type_info_state
...@@ -80,31 +84,29 @@ write_tcl_file main_dcl_module_n dcl_mods=:{[main_dcl_module_n] = main_dcl_modul ...@@ -80,31 +84,29 @@ write_tcl_file main_dcl_module_n dcl_mods=:{[main_dcl_module_n] = main_dcl_modul
help_20_compiler :: {#{#Char}} -> {#{#Char}} help_20_compiler :: {#{#Char}} -> {#{#Char}}
help_20_compiler l = l help_20_compiler l = l
#! (type_heaps,_)
= f write_type_info_state;
#! tcl_file #! tcl_file
= fwritei (size main_dcl_module.dcl_common.com_type_defs) tcl_file = fwritei (size main_dcl_module.dcl_common.com_type_defs) tcl_file
#! tcl_file #! tcl_file
= fwritei (size main_dcl_module.dcl_common.com_cons_defs) tcl_file = fwritei (size main_dcl_module.dcl_common.com_cons_defs) tcl_file
#! (type_heaps,imported_types,var_heap)
= f write_type_info_state;
= (True,tcl_file,type_heaps,predefined_symbols) = (True,tcl_file,type_heaps,predefined_symbols,imported_types,var_heap)
where where
collect_type_constructors_in_dynamic_patterns :: !Int !Int [TypeSymbIdent] -> [TypeSymbIdent] collect_type_constructors_in_dynamic_patterns :: !Int !Int [TypeSymbIdent] -> [TypeSymbIdent]
collect_type_constructors_in_dynamic_patterns i limit type_constructors_in_dynamic_patterns collect_type_constructors_in_dynamic_patterns i limit type_constructors_in_dynamic_patterns
= [] = []
f write_type_info_state=:{wtis_type_heaps} f write_type_info_state=:{wtis_type_heaps,wtis_type_defs,wtis_var_heap}
= (wtis_type_heaps,{write_type_info_state & wtis_type_heaps = abort "convertDynamics.icl"}); = (wtis_type_heaps,wtis_type_defs,wtis_var_heap)
/*2.0 /*2.0
f (Yes tcl_file) f (Yes tcl_file)
= tcl_file; = tcl_file;
0.2*/ 0.2*/
convertDynamicPatternsIntoUnifyAppls :: {! GlobalTCType} !{# CommonDefs} !Int !*{! Group} !*{#FunDef} !*PredefinedSymbols !*VarHeap !*TypeHeaps !*ExpressionHeap (Optional *File) {# DclModule} !IclModule [String] convertDynamicPatternsIntoUnifyAppls :: {! GlobalTCType} !{# CommonDefs} !Int !*{! Group} !*{#FunDef} !*PredefinedSymbols !*VarHeap !*TypeHeaps !*ExpressionHeap (Optional *File) {# DclModule} !IclModule [String]
-> (!*{! Group}, !*{#FunDef}, !*PredefinedSymbols, !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, (Optional *File)) -> (!*{! Group}, !*{#FunDef}, !*PredefinedSymbols, !*{#{# CheckedTypeDef}}, !ImportedConstructors, !*VarHeap, !*TypeHeaps, !*ExpressionHeap, (Optional *File))
...@@ -125,17 +127,18 @@ convertDynamicPatternsIntoUnifyAppls global_type_instances common_defs main_dcl_ ...@@ -125,17 +127,18 @@ convertDynamicPatternsIntoUnifyAppls global_type_instances common_defs main_dcl_
}) })
// store type info // store type info
# (tcl_file,type_heaps,ci_predef_symb) # (tcl_file,type_heaps,ci_predef_symb,imported_types,ci_var_heap)
= case tcl_file of = case tcl_file of
No No
-> (No,type_heaps,ci_predef_symb) -> (No,type_heaps,ci_predef_symb,imported_types,ci_var_heap)
_ _
# tcl_file = f tcl_file; # tcl_file = f tcl_file;
# (ok,tcl_file,type_heaps,ci_predef_symb) # (ok,tcl_file,type_heaps,ci_predef_symb,imported_types,ci_var_heap)
= write_tcl_file main_dcl_module_n dcl_mods icl_mod.icl_common tcl_file directly_imported_dcl_modules global_type_instances ci_type_constructor_used_in_dynamic_patterns type_heaps ci_predef_symb = write_tcl_file main_dcl_module_n dcl_mods icl_mod.icl_common tcl_file directly_imported_dcl_modules global_type_instances ci_type_constructor_used_in_dynamic_patterns type_heaps ci_predef_symb
imported_types ci_var_heap common_defs icl_mod
| not ok | not ok
-> abort "convertDynamicPatternsIntoUnifyAppls: error writing tcl file" -> abort "convertDynamicPatternsIntoUnifyAppls: error writing tcl file"
-> (Yes tcl_file,type_heaps,ci_predef_symb) -> (Yes tcl_file,type_heaps,ci_predef_symb,imported_types,ci_var_heap)
= (groups, fun_defs, ci_predef_symb, imported_types, [], ci_var_heap, type_heaps, ci_expr_heap, tcl_file) = (groups, fun_defs, ci_predef_symb, imported_types, [], ci_var_heap, type_heaps, ci_expr_heap, tcl_file)
where where
......
...@@ -17,14 +17,19 @@ splitBy :: Char {#Char} -> [{#Char}] ...@@ -17,14 +17,19 @@ splitBy :: Char {#Char} -> [{#Char}]
// system. // system.
import scanner, general, Heap, typeproperties, utilities, checksupport import scanner, general, Heap, typeproperties, utilities, checksupport
import StdEnv import StdEnv
import trans
:: WriteTypeInfoState :: WriteTypeInfoState
= { = {
wtis_type_heaps :: !.TypeHeaps wtis_n_type_vars :: !Int
, wtis_n_type_vars :: !Int , wtis_predefined_module_def :: !Index
, wtis_predefined_module_def :: !Index , wtis_common_defs :: !{#CommonDefs}
, wtis_type_defs :: !.{#{#CheckedTypeDef}}
, wtis_collected_conses :: !ImportedConstructors
, wtis_type_heaps :: !.TypeHeaps
, wtis_var_heap :: !.VarHeap
, wtis_main_dcl_module_n :: !Int
}; };
class WriteTypeInfo a class WriteTypeInfo a
...@@ -45,3 +50,5 @@ instance WriteTypeInfo {#b} | select_u, size_u, WriteTypeInfo b ...@@ -45,3 +50,5 @@ instance WriteTypeInfo {#b} | select_u, size_u, WriteTypeInfo b
instance WriteTypeInfo (a,b) | WriteTypeInfo a & WriteTypeInfo b instance WriteTypeInfo (a,b) | WriteTypeInfo a & WriteTypeInfo b
instance WriteTypeInfo TypeSymbIdent instance WriteTypeInfo TypeSymbIdent
instance WriteTypeInfo Int
\ No newline at end of file
...@@ -9,6 +9,7 @@ implementation module type_io ...@@ -9,6 +9,7 @@ implementation module type_io
import StdEnv, compare_constructor import StdEnv, compare_constructor
import scanner, general, Heap, typeproperties, utilities, checksupport import scanner, general, Heap, typeproperties, utilities, checksupport
import trans
import type_io_common import type_io_common
// normal form: // normal form:
...@@ -19,18 +20,20 @@ import type_io_common ...@@ -19,18 +20,20 @@ import type_io_common
// module // module
// //
// unsupported: // unsupported:
// - type synonyms
// - ADTs // - ADTs
//import DebugUtilities;
F a b :== b; F a b :== b;
:: WriteTypeInfoState :: WriteTypeInfoState
= { = {
wtis_type_heaps :: !.TypeHeaps wtis_n_type_vars :: !Int
, wtis_n_type_vars :: !Int , wtis_predefined_module_def :: !Index
, wtis_predefined_module_def :: !Index , wtis_common_defs :: !{#CommonDefs}
, wtis_type_defs :: !.{#{#CheckedTypeDef}}
, wtis_collected_conses :: !ImportedConstructors
, wtis_type_heaps :: !.TypeHeaps
, wtis_var_heap :: !.VarHeap
, wtis_main_dcl_module_n :: !Int
}; };
class WriteTypeInfo a class WriteTypeInfo a
...@@ -64,63 +67,25 @@ where ...@@ -64,63 +67,25 @@ where
# (_,(_,th_vars)) # (_,(_,th_vars))
= mapSt normalize_type_var cons_exi_vars (wtis_n_type_vars,th_vars) = mapSt normalize_type_var cons_exi_vars (wtis_n_type_vars,th_vars)
# wtis # wtis
= { wtis & = { wtis & wtis_type_heaps.th_vars = th_vars }
wtis_type_heaps = { wtis.wtis_type_heaps & th_vars = th_vars }
}
// ... normalize // ... normalize
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_symb tcl_file wtis = write_type_info cons_symb tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_type tcl_file wtis = write_type_info cons_type tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_arg_vars tcl_file wtis = write_type_info cons_arg_vars tcl_file wtis
// # (tcl_file,wtis)
// = write_type_info cons_priority tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_index tcl_file wtis = write_type_info cons_index tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_type_index tcl_file wtis = write_type_info cons_type_index tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info cons_exi_vars tcl_file wtis = write_type_info cons_exi_vars tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
/*
instance WriteTypeInfo Priority
where
write_type_info (Prio assoc i) tcl_file wtis
# tcl_file
= fwritec PrioCode tcl_file
# (tcl_file,wtis)
= write_type_info assoc tcl_file wtis
# (tcl_file,wtis)
= write_type_info i tcl_file wtis
= (tcl_file,wtis)
write_type_info NoPrio tcl_file wtis
# tcl_file
= fwritec NoPrioCode tcl_file
= (tcl_file,wtis)
instance WriteTypeInfo Assoc
where
write_type_info LeftAssoc tcl_file wtis
# tcl_file
= fwritec LeftAssocCode tcl_file
= (tcl_file,wtis)
write_type_info RightAssoc tcl_file wtis
# tcl_file
= fwritec RightAssocCode tcl_file
= (tcl_file,wtis)
write_type_info NoAssoc tcl_file wtis
# tcl_file
= fwritec NoAssocCode tcl_file
= (tcl_file,wtis)
*/
//1.3 //1.3
instance WriteTypeInfo TypeDef TypeRhs instance WriteTypeInfo TypeDef TypeRhs
//3.1 //3.1
...@@ -136,7 +101,7 @@ where ...@@ -136,7 +101,7 @@ where
= mapSt normalize_type_var td_args (0,th_vars) = mapSt normalize_type_var td_args (0,th_vars)
# wtis # wtis
= { wtis & = { wtis &
wtis_type_heaps = { wtis.wtis_type_heaps & th_vars = th_vars } wtis_type_heaps.th_vars = th_vars
, wtis_n_type_vars = n_type_vars , wtis_n_type_vars = n_type_vars
} }
// ... normalize // ... normalize
...@@ -146,7 +111,7 @@ where ...@@ -146,7 +111,7 @@ where
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info td_arity tcl_file wtis = write_type_info td_arity tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info td_args tcl_file wtis = write_type_info td_args tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info td_rhs tcl_file wtis = write_type_info td_rhs tcl_file wtis
...@@ -157,16 +122,15 @@ normalize_type_var td_arg=:{atv_variable={tv_info_ptr}} (id,th_vars) ...@@ -157,16 +122,15 @@ normalize_type_var td_arg=:{atv_variable={tv_info_ptr}} (id,th_vars)
# th_vars # th_vars
= writePtr tv_info_ptr (TVI_Normalized id) th_vars = writePtr tv_info_ptr (TVI_Normalized id) th_vars
= (id,(inc id,th_vars)); = (id,(inc id,th_vars));
sel_type_var_heap :: !*WriteTypeInfoState -> (!*TypeVarHeap,!*WriteTypeInfoState) sel_type_var_heap :: !*WriteTypeInfoState -> (!*TypeVarHeap,!*WriteTypeInfoState)
sel_type_var_heap wtis=:{wtis_type_heaps} sel_type_var_heap wtis=:{wtis_type_heaps}
# (th_vars,wtis_type_heaps) # (th_vars,wtis_type_heaps)
= sel wtis_type_heaps = sel wtis_type_heaps
= (th_vars,{ wtis & wtis_type_heaps = wtis_type_heaps} ) = (th_vars,{ wtis & wtis_type_heaps = wtis_type_heaps} )
where
where sel wtis_type_heaps=:{th_vars}
sel wtis_type_heaps=:{th_vars} = (th_vars,{ wtis_type_heaps & th_vars = newHeap } )
= (th_vars,{ wtis_type_heaps & th_vars = newHeap } )
instance WriteTypeInfo ATypeVar instance WriteTypeInfo ATypeVar
where where
...@@ -187,7 +151,7 @@ where ...@@ -187,7 +151,7 @@ where
# wtis # wtis
= { wtis & = { wtis &
wtis_type_heaps = { wtis.wtis_type_heaps & th_vars = th_vars } wtis_type_heaps.th_vars = th_vars
} }
= (tcl_file,wtis) = (tcl_file,wtis)
where where
...@@ -209,9 +173,7 @@ where ...@@ -209,9 +173,7 @@ where
write_type_info (SynType _) tcl_file wtis write_type_info (SynType _) tcl_file wtis
# tcl_file # tcl_file
= fwritec SynTypeCode tcl_file; = fwritec SynTypeCode tcl_file;
= (tcl_file,wtis)
// unimplemented
= (tcl_file,wtis)
write_type_info (RecordType {rt_constructor,rt_fields}) tcl_file wtis write_type_info (RecordType {rt_constructor,rt_fields}) tcl_file wtis
#! tcl_file #! tcl_file
...@@ -258,10 +220,12 @@ where ...@@ -258,10 +220,12 @@ where
= write_type_info fs_index tcl_file wtis = write_type_info fs_index tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
// NEW ->
instance WriteTypeInfo SymbolType instance WriteTypeInfo SymbolType
where where
write_type_info {st_vars,st_args,st_args_strictness,st_arity,st_result} tcl_file wtis write_type_info symbol_type tcl_file wtis
#! ({st_vars,st_args,st_args_strictness,st_arity,st_result},wtis)
= expand_symbol_type symbol_type wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info st_vars tcl_file wtis = write_type_info st_vars tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
...@@ -273,7 +237,18 @@ where ...@@ -273,7 +237,18 @@ where
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info st_result tcl_file wtis = write_type_info st_result tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
where
expand_symbol_type symbol_type wtis=:{wtis_common_defs,wtis_type_defs,wtis_main_dcl_module_n,wtis_collected_conses,wtis_type_heaps,wtis_var_heap}
# (expanded_symbol_type,wtis_type_defs,wtis_collected_conses,wtis_type_heaps,wtis_var_heap)
= convertSymbolType False wtis_common_defs symbol_type wtis_main_dcl_module_n wtis_type_defs [] /* ? */ wtis_type_heaps wtis_var_heap;
# wtis
= { wtis &
wtis_type_defs = wtis_type_defs
, wtis_type_heaps = wtis_type_heaps
, wtis_var_heap = wtis_var_heap
};
= (expanded_symbol_type,wtis)
instance WriteTypeInfo StrictnessList instance WriteTypeInfo StrictnessList
where where
write_type_info NotStrict tcl_file wtis write_type_info NotStrict tcl_file wtis
...@@ -311,8 +286,6 @@ where ...@@ -311,8 +286,6 @@ where
= write_type_info atypes tcl_file wtis = write_type_info atypes tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info NotStrict tcl_file wtis = write_type_info NotStrict tcl_file wtis
// # (tcl_file,wtis)
// = write_annotated_type_info atypes strictness tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
write_type_info (TAS type_symb_ident atypes strictness) tcl_file wtis write_type_info (TAS type_symb_ident atypes strictness) tcl_file wtis
...@@ -324,8 +297,6 @@ where ...@@ -324,8 +297,6 @@ where
= write_type_info atypes tcl_file wtis = write_type_info atypes tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info strictness tcl_file wtis = write_type_info strictness tcl_file wtis
// # (tcl_file,wtis)
// = write_annotated_type_info atypes strictness tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
write_type_info (atype1 --> atype2) tcl_file wtis write_type_info (atype1 --> atype2) tcl_file wtis
...@@ -415,7 +386,7 @@ where ...@@ -415,7 +386,7 @@ where
instance WriteTypeInfo TypeSymbIdent instance WriteTypeInfo TypeSymbIdent
where where
write_type_info tsi=:{type_name,type_arity,type_index={glob_module}} tcl_file wtis=:{wtis_predefined_module_def} write_type_info tsi=:{type_name,type_arity,type_index={glob_module,glob_object}} tcl_file wtis=:{wtis_predefined_module_def}
# is_type_without_definition # is_type_without_definition
= glob_module == wtis_predefined_module_def = glob_module == wtis_predefined_module_def
# tcl_file # tcl_file
...@@ -423,12 +394,13 @@ where ...@@ -423,12 +394,13 @@ where
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info type_name tcl_file wtis = write_type_info type_name tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info type_arity tcl_file wtis = write_type_info type_arity tcl_file wtis
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info tsi.type_index tcl_file wtis = write_type_info tsi.type_index tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
instance WriteTypeInfo (Global object) | WriteTypeInfo object instance WriteTypeInfo (Global object) | WriteTypeInfo object
where where
write_type_info {glob_object,glob_module} tcl_file wtis write_type_info {glob_object,glob_module} tcl_file wtis
...@@ -437,7 +409,7 @@ where ...@@ -437,7 +409,7 @@ where
# (tcl_file,wtis) # (tcl_file,wtis)
= write_type_info glob_module tcl_file wtis = write_type_info glob_module tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
// basic and structural write_type_info's // basic and structural write_type_info's
instance WriteTypeInfo Int instance WriteTypeInfo Int
where where
...@@ -497,7 +469,6 @@ where ...@@ -497,7 +469,6 @@ where
= write_type_info c2 tcl_file wtis = write_type_info c2 tcl_file wtis
= (tcl_file,wtis) = (tcl_file,wtis)
// MV ...
from CoclSystemDependent import DirectorySeparator, ensureCleanSystemFilesExists from CoclSystemDependent import DirectorySeparator, ensureCleanSystemFilesExists
openTclFile :: !Bool !String !*Files -> (Optional .File, !*Files) openTclFile :: !Bool !String !*Files -> (Optional .File, !*Files)
...@@ -551,6 +522,4 @@ splitBy char string ...@@ -551,6 +522,4 @@ splitBy char string
= splitBy` frm (to+1) = splitBy` frm (to+1)
stringSize stringSize
= size string = size string
// ... copy from compile.icl
// ... copy from compile.icl \ No newline at end of file
// ... MV
...@@ -85,3 +85,4 @@ create_type_string type_name module_name ...@@ -85,3 +85,4 @@ create_type_string type_name module_name
(type_name +++ (APPEND_DEFINING_TYPE_MODULE_NAMES_TO_TYPE_NAMES ("'" +++ module_name ) "")) (type_name +++ (APPEND_DEFINING_TYPE_MODULE_NAMES_TO_TYPE_NAMES ("'" +++ module_name ) ""))
get_type_name_and_module_name_from_type_string :: !String -> (!String,!String) get_type_name_and_module_name_from_type_string :: !String -> (!String,!String)
...@@ -112,4 +112,4 @@ where ...@@ -112,4 +112,4 @@ where
= (True,i) = (True,i)
= CharIndex s (inc i) char; = CharIndex s (inc i) char;
= abort "CharIndex: index out of range" = abort "CharIndex: index out of range"
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment