src/Tools/Code/code_scala.ML
changeset 52520 4a884366b0d8
parent 52519 598addf65209
child 55145 2bb3cd36bcf7
equal deleted inserted replaced
52519:598addf65209 52520:4a884366b0d8
   258       | print_stmt (name, Code_Thingol.Classinst
   258       | print_stmt (name, Code_Thingol.Classinst
   259           { class, tyco, vs, inst_params, superinst_params, ... }) =
   259           { class, tyco, vs, inst_params, superinst_params, ... }) =
   260           let
   260           let
   261             val tyvars = intro_tyvars vs reserved;
   261             val tyvars = intro_tyvars vs reserved;
   262             val classtyp = (class, tyco `%% map (ITyVar o fst) vs);
   262             val classtyp = (class, tyco `%% map (ITyVar o fst) vs);
   263             fun print_classparam_instance ((classparam, (const as { dom, ... }, _)), (thm, _)) =
   263             fun print_classparam_instance ((classparam, (const as { dom, ... }, dom_length)), (thm, _)) =
   264               let
   264               let
   265                 val aux_dom = Name.invent_names (snd reserved) "a" dom;
   265                 val aux_dom = Name.invent_names (snd reserved) "a" dom;
   266                 val auxs = map fst aux_dom;
   266                 val auxs = map fst aux_dom;
   267                 val vars = intro_vars auxs reserved;
   267                 val vars = intro_vars auxs reserved;
   268                 val aux_abstr = if null auxs then [] else [enum "," "(" ")"
   268                 val (aux_dom1, aux_dom2) = chop dom_length aux_dom;
   269                   (map (fn (aux, ty) => constraint ((str o lookup_var vars) aux)
   269                 fun abstract_using [] = []
   270                   (print_typ tyvars NOBR ty)) aux_dom), str "=>"];
   270                   | abstract_using aux_dom = [enum "," "(" ")"
       
   271                       (map (fn (aux, ty) => constraint ((str o lookup_var vars) aux)
       
   272                       (print_typ tyvars NOBR ty)) aux_dom), str "=>"];
       
   273                 val aux_abstr1 = abstract_using aux_dom1;
       
   274                 val aux_abstr2 = abstract_using aux_dom2;
   271               in
   275               in
   272                 concat ([str "val", print_method classparam, str "="]
   276                 concat ([str "val", print_method classparam, str "="]
   273                   @ aux_abstr @| print_app tyvars false (SOME thm) vars NOBR
   277                   @ aux_abstr1 @ aux_abstr2 @| print_app tyvars false (SOME thm) vars NOBR
   274                     (const, map (IVar o SOME) auxs))
   278                     (const, map (IVar o SOME) auxs))
   275               end;
   279               end;
   276           in
   280           in
   277             Pretty.block_enclose (concat [str "implicit def",
   281             Pretty.block_enclose (concat [str "implicit def",
   278               constraint (print_context tyvars vs name) (print_dicttyp tyvars classtyp),
   282               constraint (print_context tyvars vs name) (print_dicttyp tyvars classtyp),