334 fun mkUpper str = |
334 fun mkUpper str = |
335 (case String.explode str of |
335 (case String.explode str of |
336 [] => "" |
336 [] => "" |
337 | c::cs => String.implode (Char.toUpper c::cs )) |
337 | c::cs => String.implode (Char.toUpper c::cs )) |
338 |
338 |
339 fun mkName (Type (T,args)) = concat (map mkName args) ^ mkUpper (NameSpace.base T) |
339 fun mkName (Type (T,args)) = concat (map mkName args) ^ mkUpper (NameSpace.base_name T) |
340 | mkName (TFree (x,_)) = mkUpper (NameSpace.base x) |
340 | mkName (TFree (x,_)) = mkUpper (NameSpace.base_name x) |
341 | mkName (TVar ((x,_),_)) = mkUpper (NameSpace.base x); |
341 | mkName (TVar ((x,_),_)) = mkUpper (NameSpace.base_name x); |
342 |
342 |
343 fun is_datatype thy n = is_some (Symtab.lookup (DatatypePackage.get_datatypes thy) n); |
343 fun is_datatype thy n = is_some (Symtab.lookup (DatatypePackage.get_datatypes thy) n); |
344 |
344 |
345 fun mk_map ("List.list") = Syntax.const "List.map" |
345 fun mk_map "List.list" = Syntax.const "List.map" |
346 | mk_map n = Syntax.const ("StateFun." ^ "map_" ^ NameSpace.base n); |
346 | mk_map n = Syntax.const ("StateFun.map_" ^ NameSpace.base_name n); |
347 |
347 |
348 fun gen_constr_destr comp prfx thy (Type (T,[])) = |
348 fun gen_constr_destr comp prfx thy (Type (T,[])) = |
349 Syntax.const (deco prfx (mkUpper (NameSpace.base T))) |
349 Syntax.const (deco prfx (mkUpper (NameSpace.base_name T))) |
350 | gen_constr_destr comp prfx thy (T as Type ("fun",_)) = |
350 | gen_constr_destr comp prfx thy (T as Type ("fun",_)) = |
351 let val (argTs,rangeT) = strip_type T; |
351 let val (argTs,rangeT) = strip_type T; |
352 in comp |
352 in comp |
353 (Syntax.const (deco prfx (concat (map mkName argTs) ^ "Fun"))) |
353 (Syntax.const (deco prfx (concat (map mkName argTs) ^ "Fun"))) |
354 (fold (fn x => fn y => x$y) |
354 (fold (fn x => fn y => x$y) |
358 | gen_constr_destr comp prfx thy (T' as Type (T,argTs)) = |
358 | gen_constr_destr comp prfx thy (T' as Type (T,argTs)) = |
359 if is_datatype thy T |
359 if is_datatype thy T |
360 then (* datatype args are recursively embedded into val *) |
360 then (* datatype args are recursively embedded into val *) |
361 (case argTs of |
361 (case argTs of |
362 [argT] => comp |
362 [argT] => comp |
363 ((Syntax.const (deco prfx (mkUpper (NameSpace.base T))))) |
363 ((Syntax.const (deco prfx (mkUpper (NameSpace.base_name T))))) |
364 ((mk_map T $ gen_constr_destr comp prfx thy argT)) |
364 ((mk_map T $ gen_constr_destr comp prfx thy argT)) |
365 | _ => raise (TYPE ("StateFun.gen_constr_destr",[T'],[]))) |
365 | _ => raise (TYPE ("StateFun.gen_constr_destr",[T'],[]))) |
366 else (* type args are not recursively embedded into val *) |
366 else (* type args are not recursively embedded into val *) |
367 Syntax.const (deco prfx (concat (map mkName argTs) ^ mkUpper (NameSpace.base T))) |
367 Syntax.const (deco prfx (concat (map mkName argTs) ^ mkUpper (NameSpace.base_name T))) |
368 | gen_constr_destr thy _ _ T = raise (TYPE ("StateFun.gen_constr_destr",[T],[])); |
368 | gen_constr_destr thy _ _ T = raise (TYPE ("StateFun.gen_constr_destr",[T],[])); |
369 |
369 |
370 val mk_constr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ a $ b) "" |
370 val mk_constr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ a $ b) "" |
371 val mk_destr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ b $ a) "the_" |
371 val mk_destr = gen_constr_destr (fn a => fn b => Syntax.const "Fun.comp" $ b $ a) "the_" |
372 |
372 |