module generic_print import StdEnv, StdGeneric generic gPrint a :: a [String] -> [String] gPrint{|Int|} x acc = [toString x:acc] gPrint{|Bool|} x acc = [toString x:acc] gPrint{|Real|} x acc = [toString x:acc] gPrint{|Char|} x acc = [toString x:acc] gPrint{|UNIT|} x acc = acc gPrint{|PAIR|} fl fr (PAIR l r) acc = fl l [" ":fr r acc] gPrint{|EITHER|} fl _ (LEFT x) acc = fl x acc gPrint{|EITHER|} _ fr (RIGHT x) acc = fr x acc gPrint{|OBJECT|} f (OBJECT x) acc = f x acc gPrint{|CONS of gcd|} f (CONS x) acc = ["(", gcd.gcd_name, " ":f x [")":acc]] gPrint{|RECORD of grd|} f (RECORD x) acc = ["{", grd.grd_name, " | ":f x ["}":acc]] gPrint{|FIELD of gfd|} f (FIELD x) acc = [pre, gfd.gfd_name, "=":f x acc] where pre = if (gfd.gfd_index == 0) "" ", " :: T = {f1 :: Int, f2 :: (Real, [?Int])} derive gPrint (,), [], ?, T Start = gPrint{|*|} {f1=42, f2=(3.14, [?None])} [] // {T | f1=42 , f2=(_Tuple2 3.14 (_Cons (_!None ) (_Nil )))}