src/Tools/code/code_target.ML
changeset 24811 3bf788a0c49a
parent 24750 95a315591af8
child 24841 df8448bc7a8b
equal deleted inserted replaced
24810:862b71696efe 24811:3bf788a0c49a
   295 (** SML/OCaml serializer **)
   295 (** SML/OCaml serializer **)
   296 
   296 
   297 datatype ml_def =
   297 datatype ml_def =
   298     MLFuns of (string * (typscheme * (iterm list * iterm) list)) list
   298     MLFuns of (string * (typscheme * (iterm list * iterm) list)) list
   299   | MLDatas of (string * ((vname * sort) list * (string * itype list) list)) list
   299   | MLDatas of (string * ((vname * sort) list * (string * itype list) list)) list
   300   | MLClass of string * ((class * string) list * (vname * (string * itype) list))
   300   | MLClass of string * (vname * ((class * string) list * (string * itype) list))
   301   | MLClassinst of string * ((class * (string * (vname * sort) list))
   301   | MLClassinst of string * ((class * (string * (vname * sort) list))
   302         * ((class * (string * (string * dict list list))) list
   302         * ((class * (string * (string * dict list list))) list
   303       * (string * const) list));
   303       * (string * const) list));
   304 
   304 
   305 fun pr_sml allows_exception tyco_syntax const_syntax labelled_name init_syms deresolv is_cons ml_def =
   305 fun pr_sml allows_exception tyco_syntax const_syntax labelled_name init_syms deresolv is_cons ml_def =
   489                     :: str "="
   489                     :: str "="
   490                     :: separate (str "|") (map pr_co cos)
   490                     :: separate (str "|") (map pr_co cos)
   491                   );
   491                   );
   492             val (ps, p) = split_last (pr_data "datatype" data :: map (pr_data "and") datas');
   492             val (ps, p) = split_last (pr_data "datatype" data :: map (pr_data "and") datas');
   493           in Pretty.chunks (ps @ [Pretty.block ([p, str ";"])]) end
   493           in Pretty.chunks (ps @ [Pretty.block ([p, str ";"])]) end
   494      | pr_def (MLClass (class, (superclasses, (v, classops)))) =
   494      | pr_def (MLClass (class, (v, (superclasses, classops)))) =
   495           let
   495           let
   496             val w = first_upper v ^ "_";
   496             val w = first_upper v ^ "_";
   497             fun pr_superclass_field (class, classrel) =
   497             fun pr_superclass_field (class, classrel) =
   498               (concat o map str) [
   498               (concat o map str) [
   499                 pr_label_classrel classrel, ":", "'" ^ v, deresolv class
   499                 pr_label_classrel classrel, ":", "'" ^ v, deresolv class
   786                     :: str "="
   786                     :: str "="
   787                     :: separate (str "|") (map pr_co cos)
   787                     :: separate (str "|") (map pr_co cos)
   788                   );
   788                   );
   789             val (ps, p) = split_last (pr_data "type" data :: map (pr_data "and") datas');
   789             val (ps, p) = split_last (pr_data "type" data :: map (pr_data "and") datas');
   790           in Pretty.chunks (ps @ [Pretty.block ([p, str ";;"])]) end
   790           in Pretty.chunks (ps @ [Pretty.block ([p, str ";;"])]) end
   791      | pr_def (MLClass (class, (superclasses, (v, classops)))) =
   791      | pr_def (MLClass (class, (v, (superclasses, classops)))) =
   792           let
   792           let
   793             val w = "_" ^ first_upper v;
   793             val w = "_" ^ first_upper v;
   794             fun pr_superclass_field (class, classrel) =
   794             fun pr_superclass_field (class, classrel) =
   795               (concat o map str) [
   795               (concat o map str) [
   796                 deresolv classrel, ":", "'" ^ v, deresolv class
   796                 deresolv classrel, ":", "'" ^ v, deresolv class
   946           |> fold (fold (insert (op =)) o Graph.imm_succs code) names
   946           |> fold (fold (insert (op =)) o Graph.imm_succs code) names
   947           |> subtract (op =) names;
   947           |> subtract (op =) names;
   948         val (modls, _) = (split_list o map dest_name) names;
   948         val (modls, _) = (split_list o map dest_name) names;
   949         val modl' = (the_single o distinct (op =) o map name_modl) modls
   949         val modl' = (the_single o distinct (op =) o map name_modl) modls
   950           handle Empty =>
   950           handle Empty =>
   951             error ("Illegal mutual dependencies: " ^ commas (map labelled_name names));
   951             error ("Different namespace prefixes for mutual dependencies:\n"
       
   952               ^ commas (map labelled_name names)
       
   953               ^ "\n"
       
   954               ^ commas (map (NameSpace.qualifier o NameSpace.qualifier) names));
   952         val modl_explode = NameSpace.explode modl';
   955         val modl_explode = NameSpace.explode modl';
   953         fun add_dep name name'' =
   956         fun add_dep name name'' =
   954           let
   957           let
   955             val modl'' = (name_modl o fst o dest_name) name'';
   958             val modl'' = (name_modl o fst o dest_name) name'';
   956           in if modl' = modl'' then
   959           in if modl' = modl'' then
  1230               :: pr_co co
  1233               :: pr_co co
  1231               :: map ((fn p => Pretty.block [str "| ", p]) o pr_co) cos
  1234               :: map ((fn p => Pretty.block [str "| ", p]) o pr_co) cos
  1232               @ (if deriving_show name then [str "deriving (Read, Show)"] else [])
  1235               @ (if deriving_show name then [str "deriving (Read, Show)"] else [])
  1233             )
  1236             )
  1234           end
  1237           end
  1235       | pr_def (name, CodeThingol.Class (superclasss, (v, classops))) =
  1238       | pr_def (name, CodeThingol.Class (v, (superclasses, classops))) =
  1236           let
  1239           let
  1237             val tyvars = CodeName.intro_vars [v] init_syms;
  1240             val tyvars = CodeName.intro_vars [v] init_syms;
  1238             fun pr_classop (classop, ty) =
  1241             fun pr_classop (classop, ty) =
  1239               semicolon [
  1242               semicolon [
  1240                 (str o classop_name name) classop,
  1243                 (str o classop_name name) classop,
  1243               ]
  1246               ]
  1244           in
  1247           in
  1245             Pretty.block_enclose (
  1248             Pretty.block_enclose (
  1246               Pretty.block [
  1249               Pretty.block [
  1247                 str "class ",
  1250                 str "class ",
  1248                 pr_typparms tyvars [(v, map fst superclasss)],
  1251                 pr_typparms tyvars [(v, map fst superclasses)],
  1249                 str (deresolv_here name ^ " " ^ CodeName.lookup_var tyvars v),
  1252                 str (deresolv_here name ^ " " ^ CodeName.lookup_var tyvars v),
  1250                 str " where {"
  1253                 str " where {"
  1251               ],
  1254               ],
  1252               str "};"
  1255               str "};"
  1253             ) (map pr_classop classops)
  1256             ) (map pr_classop classops)