181 end; |
181 end; |
182 fun print_context tyvars vs s = applify "[" "]" |
182 fun print_context tyvars vs s = applify "[" "]" |
183 (fn (v, sort) => (Pretty.block o map str) |
183 (fn (v, sort) => (Pretty.block o map str) |
184 (lookup_tyvar tyvars v :: maps (fn class => [" : ", deresolve_class class]) sort)) |
184 (lookup_tyvar tyvars v :: maps (fn class => [" : ", deresolve_class class]) sort)) |
185 NOBR (str s) vs; |
185 NOBR (str s) vs; |
186 fun print_defhead export tyvars vars const vs params tys ty = |
186 fun print_defhead tyvars vars const vs params tys ty = |
187 concat [str "def", constraint (applify "(" ")" (fn (param, ty) => |
187 concat [str "def", constraint (applify "(" ")" (fn (param, ty) => |
188 constraint ((str o lookup_var vars) param) (print_typ tyvars NOBR ty)) |
188 constraint ((str o lookup_var vars) param) (print_typ tyvars NOBR ty)) |
189 NOBR (print_context tyvars vs (deresolve_const const)) (params ~~ tys)) (print_typ tyvars NOBR ty), |
189 NOBR (print_context tyvars vs (deresolve_const const)) (params ~~ tys)) (print_typ tyvars NOBR ty), |
190 str "="]; |
190 str "="]; |
191 fun print_def export const (vs, ty) [] = |
191 fun print_def const (vs, ty) [] = |
192 let |
192 let |
193 val (tys, ty') = Code_Thingol.unfold_fun ty; |
193 val (tys, ty') = Code_Thingol.unfold_fun ty; |
194 val params = Name.invent (snd reserved) "a" (length tys); |
194 val params = Name.invent (snd reserved) "a" (length tys); |
195 val tyvars = intro_tyvars vs reserved; |
195 val tyvars = intro_tyvars vs reserved; |
196 val vars = intro_vars params reserved; |
196 val vars = intro_vars params reserved; |
197 in |
197 in |
198 concat [print_defhead export tyvars vars const vs params tys ty', |
198 concat [print_defhead tyvars vars const vs params tys ty', |
199 str ("sys.error(\"" ^ const ^ "\")")] |
199 str ("sys.error(\"" ^ const ^ "\")")] |
200 end |
200 end |
201 | print_def export const (vs, ty) eqs = |
201 | print_def const (vs, ty) eqs = |
202 let |
202 let |
203 val tycos = fold (fn ((ts, t), _) => |
203 val tycos = fold (fn ((ts, t), _) => |
204 fold Code_Thingol.add_tyconames (t :: ts)) eqs []; |
204 fold Code_Thingol.add_tyconames (t :: ts)) eqs []; |
205 val tyvars = reserved |
205 val tyvars = reserved |
206 |> intro_base_names |
206 |> intro_base_names |
228 in |
228 in |
229 concat [str "case", |
229 concat [str "case", |
230 tuplify (map (print_term tyvars true some_thm vars' NOBR) ts), |
230 tuplify (map (print_term tyvars true some_thm vars' NOBR) ts), |
231 str "=>", print_rhs vars' eq] |
231 str "=>", print_rhs vars' eq] |
232 end; |
232 end; |
233 val head = print_defhead export tyvars vars2 const vs params tys' ty'; |
233 val head = print_defhead tyvars vars2 const vs params tys' ty'; |
234 in if simple then |
234 in if simple then |
235 concat [head, print_rhs vars2 (hd eqs)] |
235 concat [head, print_rhs vars2 (hd eqs)] |
236 else |
236 else |
237 Pretty.block_enclose |
237 Pretty.block_enclose |
238 (concat [head, tuplify (map (str o lookup_var vars2) params), |
238 (concat [head, tuplify (map (str o lookup_var vars2) params), |
267 ((Library.enclose "`" "`" o deresolve_full o Class_Instance) (tyco, class))) |
267 ((Library.enclose "`" "`" o deresolve_full o Class_Instance) (tyco, class))) |
268 (print_dicttyp tyvars classtyp), |
268 (print_dicttyp tyvars classtyp), |
269 str "=", str "new", print_dicttyp tyvars classtyp, str "{"], str "}") |
269 str "=", str "new", print_dicttyp tyvars classtyp, str "{"], str "}") |
270 (map print_classparam_instance (inst_params @ superinst_params)) |
270 (map print_classparam_instance (inst_params @ superinst_params)) |
271 end; |
271 end; |
272 fun print_stmt (Constant const, (export, Fun ((vs, ty), raw_eqs))) = |
272 fun print_stmt (Constant const, (_, Fun ((vs, ty), raw_eqs))) = |
273 print_def export const (vs, ty) (filter (snd o snd) raw_eqs) |
273 print_def const (vs, ty) (filter (snd o snd) raw_eqs) |
274 | print_stmt (Type_Constructor tyco, (export, Datatype (vs, cos))) = |
274 | print_stmt (Type_Constructor tyco, (_, Datatype (vs, cos))) = |
275 let |
275 let |
276 val tyvars = intro_tyvars (map (rpair []) vs) reserved; |
276 val tyvars = intro_tyvars (map (rpair []) vs) reserved; |
277 fun print_co ((co, vs_args), tys) = |
277 fun print_co ((co, vs_args), tys) = |
278 concat [Pretty.block ((applify "[" "]" (str o lookup_tyvar tyvars) NOBR |
278 concat [Pretty.block ((applify "[" "]" (str o lookup_tyvar tyvars) NOBR |
279 ((concat o map str) ["final", "case", "class", deresolve_const co]) vs_args) |
279 ((concat o map str) ["final", "case", "class", deresolve_const co]) vs_args) |
286 in |
286 in |
287 Pretty.chunks (applify "[" "]" (str o lookup_tyvar tyvars) |
287 Pretty.chunks (applify "[" "]" (str o lookup_tyvar tyvars) |
288 NOBR ((concat o map str) ["abstract", "sealed", "class", deresolve_tyco tyco]) vs |
288 NOBR ((concat o map str) ["abstract", "sealed", "class", deresolve_tyco tyco]) vs |
289 :: map print_co cos) |
289 :: map print_co cos) |
290 end |
290 end |
291 | print_stmt (Type_Class class, (export, Class ((v, (classrels, classparams)), insts))) = |
291 | print_stmt (Type_Class class, (_, Class ((v, (classrels, classparams)), insts))) = |
292 let |
292 let |
293 val tyvars = intro_tyvars [(v, [class])] reserved; |
293 val tyvars = intro_tyvars [(v, [class])] reserved; |
294 fun add_typarg s = Pretty.block |
294 fun add_typarg s = Pretty.block |
295 [str s, str "[", (str o lookup_tyvar tyvars) v, str "]"]; |
295 [str s, str "[", (str o lookup_tyvar tyvars) v, str "]"]; |
296 fun print_super_classes [] = NONE |
296 fun print_super_classes [] = NONE |