210 applify "[" "]" NOBR ((concat o map str) ["sealed", "class", deresolve_base name]) |
210 applify "[" "]" NOBR ((concat o map str) ["sealed", "class", deresolve_base name]) |
211 (map (str o prefix "+" o lookup_tyvar tyvars o fst) vs) |
211 (map (str o prefix "+" o lookup_tyvar tyvars o fst) vs) |
212 :: map print_co cos |
212 :: map print_co cos |
213 ) |
213 ) |
214 end |
214 end |
215 | print_stmt (name, Code_Thingol.Class (_, (v, (superclasses, classparams)))) = |
215 | print_stmt (name, Code_Thingol.Class (_, (v, (super_classes, classparams)))) = |
216 let |
216 let |
217 val tyvars = intro_vars [v] reserved; |
217 val tyvars = intro_vars [v] reserved; |
218 val vs = [(v, [name])]; |
218 val vs = [(v, [name])]; |
219 fun add_typarg p = applify "[" "]" NOBR p [(str o lookup_tyvar tyvars) v]; |
219 fun add_typarg p = applify "[" "]" NOBR p [(str o lookup_tyvar tyvars) v]; |
220 fun print_superclasses [] = NONE |
220 fun print_super_classes [] = NONE |
221 | print_superclasses classes = SOME (concat (str "extends" |
221 | print_super_classes classes = SOME (concat (str "extends" |
222 :: separate (str "with") (map (add_typarg o str o deresolve o fst) classes))); |
222 :: separate (str "with") (map (add_typarg o str o deresolve o fst) classes))); |
223 fun print_tupled_typ ([], ty) = |
223 fun print_tupled_typ ([], ty) = |
224 print_typ tyvars NOBR ty |
224 print_typ tyvars NOBR ty |
225 | print_tupled_typ ([ty1], ty2) = |
225 | print_tupled_typ ([ty1], ty2) = |
226 concat [print_typ tyvars BR ty1, str "=>", print_typ tyvars NOBR ty2] |
226 concat [print_typ tyvars BR ty1, str "=>", print_typ tyvars NOBR ty2] |
244 end; |
244 end; |
245 in |
245 in |
246 Pretty.chunks ( |
246 Pretty.chunks ( |
247 (Pretty.block_enclose |
247 (Pretty.block_enclose |
248 (concat ([str "trait", add_typarg ((str o deresolve_base) name)] |
248 (concat ([str "trait", add_typarg ((str o deresolve_base) name)] |
249 @ the_list (print_superclasses superclasses) @ [str "{"]), str "}") |
249 @ the_list (print_super_classes super_classes) @ [str "{"]), str "}") |
250 (map print_classparam_val classparams)) |
250 (map print_classparam_val classparams)) |
251 :: map print_classparam_def classparams |
251 :: map print_classparam_def classparams |
252 ) |
252 ) |
253 end |
253 end |
254 | print_stmt (name, Code_Thingol.Classinst ((class, (tyco, vs)), |
254 | print_stmt (name, Code_Thingol.Classinst ((class, (tyco, vs)), |
255 (super_instances, classparam_insts))) = |
255 ((super_instances, _), classparam_instances))) = |
256 let |
256 let |
257 val tyvars = intro_vars (map fst vs) reserved; |
257 val tyvars = intro_vars (map fst vs) reserved; |
258 val insttyp = tyco `%% map (ITyVar o fst) vs; |
258 val insttyp = tyco `%% map (ITyVar o fst) vs; |
259 val p_inst_typ = print_typ tyvars NOBR insttyp; |
259 val p_inst_typ = print_typ tyvars NOBR insttyp; |
260 fun add_typ_params p = applify "[" "]" NOBR p (map (str o lookup_tyvar tyvars o fst) vs); |
260 fun add_typ_params p = applify "[" "]" NOBR p (map (str o lookup_tyvar tyvars o fst) vs); |
261 fun add_inst_typ p = Pretty.block [p, str "[", p_inst_typ, str "]"]; |
261 fun add_inst_typ p = Pretty.block [p, str "[", p_inst_typ, str "]"]; |
262 val ((implicit_names, implicit_ps), vars) = implicit_arguments tyvars vs reserved; |
262 val ((implicit_names, implicit_ps), vars) = implicit_arguments tyvars vs reserved; |
263 fun print_classparam_inst ((classparam, const as (_, (_, tys))), (thm, _)) = |
263 fun print_classparam_instance ((classparam, const as (_, (_, tys))), (thm, _)) = |
264 let |
264 let |
265 val auxs = Name.invents (snd reserved) "a" (length tys); |
265 val auxs = Name.invents (snd reserved) "a" (length tys); |
266 val vars = intro_vars auxs reserved; |
266 val vars = intro_vars auxs reserved; |
267 val args = if null auxs then [] else |
267 val args = if null auxs then [] else |
268 [concat [enum "," "(" ")" (map2 (fn aux => fn ty => print_typed tyvars ((str o lookup_var vars) aux) ty) |
268 [concat [enum "," "(" ")" (map2 (fn aux => fn ty => print_typed tyvars ((str o lookup_var vars) aux) ty) |
276 Pretty.block_enclose |
276 Pretty.block_enclose |
277 (concat ([str "trait", |
277 (concat ([str "trait", |
278 add_typ_params ((str o deresolve_base) name), |
278 add_typ_params ((str o deresolve_base) name), |
279 str "extends", |
279 str "extends", |
280 Pretty.block [(str o deresolve) class, str "[", p_inst_typ, str "]"]] |
280 Pretty.block [(str o deresolve) class, str "[", p_inst_typ, str "]"]] |
281 @ map (fn (_, (_, (superinst, _))) => add_typ_params (str ("with " ^ deresolve superinst))) |
281 @ map (fn (_, (_, (super_instance, _))) => add_typ_params (str ("with " ^ deresolve super_instance))) |
282 super_instances @| str "{"), str "}") |
282 super_instances @| str "{"), str "}") |
283 (map (fn p => Pretty.block [str "implicit val arg$", p]) implicit_ps |
283 (map (fn p => Pretty.block [str "implicit val arg$", p]) implicit_ps |
284 @ map print_classparam_inst classparam_insts), |
284 @ map print_classparam_instance classparam_instances), |
285 concat [str "implicit", str (if null vs then "val" else "def"), |
285 concat [str "implicit", str (if null vs then "val" else "def"), |
286 applify "(implicit " ")" NOBR (applify "[" "]" NOBR |
286 applify "(implicit " ")" NOBR (applify "[" "]" NOBR |
287 ((str o deresolve_base) name) (map (str o lookup_tyvar tyvars o fst) vs)) |
287 ((str o deresolve_base) name) (map (str o lookup_tyvar tyvars o fst) vs)) |
288 implicit_ps, |
288 implicit_ps, |
289 str "=", str "new", applify "[" "]" NOBR ((str o deresolve_base) name) |
289 str "=", str "new", applify "[" "]" NOBR ((str o deresolve_base) name) |