src/Tools/Code/code_scala.ML
changeset 66326 9eb8a2d07852
parent 65531 24544e3f183d
child 66327 f44f7cf3d1a1
equal deleted inserted replaced
66325:fd28cb6e6f2c 66326:9eb8a2d07852
   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