src/Pure/Tools/codegen_serializer.ML
changeset 20845 c55dcf606f65
parent 20699 0cc77abb185a
child 20858 1fbbc10d475b
equal deleted inserted replaced
20844:6792583aa463 20845:c55dcf606f65
    56 
    56 
    57 structure CodegenSerializer: CODEGEN_SERIALIZER =
    57 structure CodegenSerializer: CODEGEN_SERIALIZER =
    58 struct
    58 struct
    59 
    59 
    60 open BasicCodegenThingol;
    60 open BasicCodegenThingol;
    61 val debug_msg = CodegenThingol.debug_msg;
    61 val tracing = CodegenThingol.tracing;
    62 
    62 
    63 (** precedences **)
    63 (** precedences **)
    64 
    64 
    65 datatype lrx = L | R | X;
    65 datatype lrx = L | R | X;
    66 
    66 
   290     fun from_module' resolv imps ((name_qual, name), defs) =
   290     fun from_module' resolv imps ((name_qual, name), defs) =
   291       from_module resolv imps ((name_qual, name), defs)
   291       from_module resolv imps ((name_qual, name), defs)
   292       |> postprocess (resolv name_qual);
   292       |> postprocess (resolv name_qual);
   293   in
   293   in
   294     code
   294     code
   295     |> debug_msg (fn _ => "dropping shadowed defintions...")
   295     |> tracing (fn _ => "dropping shadowed defintions...")
   296     |> CodegenThingol.delete_garbage drop
   296     |> CodegenThingol.delete_garbage drop
   297     |> debug_msg (fn _ => "projecting...")
   297     |> tracing (fn _ => "projecting...")
   298     |> (if is_some select then (CodegenThingol.project_module o the) select else I)
   298     |> (if is_some select then (CodegenThingol.project_module o the) select else I)
   299     |> debug_msg (fn _ => "serializing...")
   299     |> tracing (fn _ => "serializing...")
   300     |> CodegenThingol.serialize (from_defs (class_syntax, tyco_syntax, const_syntax))
   300     |> CodegenThingol.serialize (from_defs (class_syntax, tyco_syntax, const_syntax))
   301          from_module' validator postproc nspgrp name_root
   301          from_module' validator postproc nspgrp name_root
   302     |> K ()
   302     |> K ()
   303   end;
   303   end;
   304 
   304 
   461     fun first_upper s =
   461     fun first_upper s =
   462       implode (nth_map 0 (Symbol.to_ascii_upper) (explode s));
   462       implode (nth_map 0 (Symbol.to_ascii_upper) (explode s));
   463     fun ml_from_dictvar v = 
   463     fun ml_from_dictvar v = 
   464       first_upper v ^ "_";
   464       first_upper v ^ "_";
   465     val ml_from_label =
   465     val ml_from_label =
   466       str o translate_string (fn "_" => "__" | "." => "_" | c => c)
   466       str o translate_string (fn "." => "__" | c => c);
   467         o NameSpace.base o resolv;
       
   468     fun ml_from_tyvar (v, []) =
   467     fun ml_from_tyvar (v, []) =
   469           str "()"
   468           str "()"
   470       | ml_from_tyvar (v, sort) =
   469       | ml_from_tyvar (v, sort) =
   471           let
   470           let
   472             fun mk_class class =
   471             fun mk_class class =
   757         )
   756         )
   758       end;
   757       end;
   759   in (ml_from_funs, ml_from_datatypes) end;
   758   in (ml_from_funs, ml_from_datatypes) end;
   760 
   759 
   761 fun ml_from_defs init_ctxt
   760 fun ml_from_defs init_ctxt
   762     (_, tyco_syntax, const_syntax) resolver prefix defs =
   761     (_, tyco_syntax, const_syntax) resolver prefx defs =
   763   let
   762   let
   764     val resolv = resolver prefix;
   763     val resolv = resolver prefx;
   765     val (ml_from_dictvar, ml_from_label, ml_from_tyvar, ml_from_insts, ml_from_tycoexpr, ml_from_type, ml_from_expr) =
   764     val (ml_from_dictvar, ml_from_label, ml_from_tyvar, ml_from_insts, ml_from_tycoexpr, ml_from_type, ml_from_expr) =
   766       ml_expr_seri (tyco_syntax, const_syntax) resolv;
   765       ml_expr_seri (tyco_syntax, const_syntax) resolv;
   767     val (ml_from_funs, ml_from_datatypes) =
   766     val (ml_from_funs, ml_from_datatypes) =
   768       ml_fun_datatype init_ctxt (tyco_syntax, const_syntax) resolv;
   767       ml_fun_datatype init_ctxt (tyco_syntax, const_syntax) resolv;
   769     val filter_datatype =
   768     val filter_datatype =
   792             Pretty.brk 1,
   791             Pretty.brk 1,
   793             (str o resolv) class
   792             (str o resolv) class
   794           ];
   793           ];
   795         fun from_membr (m, ty) =
   794         fun from_membr (m, ty) =
   796           Pretty.block [
   795           Pretty.block [
   797             ml_from_label m,
   796             (ml_from_label o suffix "_" o NameSpace.base) m,
   798             str ":",
   797             str ":",
   799             Pretty.brk 1,
   798             Pretty.brk 1,
   800             ml_from_type NOBR ty
   799             ml_from_type NOBR ty
   801           ];
   800           ];
   802         fun from_membr_fun (m, _) =
   801         fun from_membr_fun (m, _) =
   803           (Pretty.block o Pretty.breaks) [
   802           (Pretty.block o Pretty.breaks) [
   804             str "fun",
   803             str "fun",
   805             (str o resolv) m,
   804             (str o resolv) m,
   806             Pretty.enclose "(" ")" [str (w ^ ":'" ^ v ^ " " ^ resolv name)],
   805             Pretty.enclose "(" ")" [str (w ^ ":'" ^ v ^ " " ^ resolv name)],
   807             str "=",
   806             str "=",
   808             Pretty.block [str "#", ml_from_label m],
   807             Pretty.block [str "#", (ml_from_label o suffix "_" o NameSpace.base) m],
   809             str (w ^ ";")
   808             str (w ^ ";")
   810           ];
   809           ];
   811       in
   810       in
   812         Pretty.chunks (
   811         Pretty.chunks (
   813           (Pretty.block o Pretty.breaks) [
   812           (Pretty.block o Pretty.breaks) [
   849                     then NONE else (SOME o NameSpace.base o resolv) c) (CodegenThingol.add_constnames e []);
   848                     then NONE else (SOME o NameSpace.base o resolv) c) (CodegenThingol.add_constnames e []);
   850                 val var_ctxt = init_ctxt
   849                 val var_ctxt = init_ctxt
   851                   |> intro_ctxt consts;
   850                   |> intro_ctxt consts;
   852               in
   851               in
   853                 (Pretty.block o Pretty.breaks) [
   852                 (Pretty.block o Pretty.breaks) [
   854                   ml_from_label m,
   853                   (ml_from_label o suffix "_" o NameSpace.base) m,
   855                   str "=",
   854                   str "=",
   856                   ml_from_expr var_ctxt NOBR e
   855                   ml_from_expr var_ctxt NOBR e
   857                 ]
   856                 ]
   858               end;
   857               end;
   859             fun mk_corp rhs =
   858             fun mk_corp rhs =
  1112                   hs_from_expr var_ctxt' NOBR se,
  1111                   hs_from_expr var_ctxt' NOBR se,
  1113                   str "->",
  1112                   str "->",
  1114                   hs_from_expr var_ctxt' NOBR be
  1113                   hs_from_expr var_ctxt' NOBR be
  1115                 ]
  1114                 ]
  1116               end
  1115               end
  1117           in Pretty.block [
  1116           in Pretty.enclose "(" ")" [
  1118             str "case",
  1117             str "case",
  1119             Pretty.brk 1,
  1118             Pretty.brk 1,
  1120             hs_from_expr var_ctxt NOBR de,
  1119             hs_from_expr var_ctxt NOBR de,
  1121             Pretty.brk 1,
  1120             Pretty.brk 1,
  1122             str "of",
  1121             str "of",
  1197           in
  1196           in
  1198             (Pretty.block o Pretty.breaks) [
  1197             (Pretty.block o Pretty.breaks) [
  1199               str "data",
  1198               str "data",
  1200               hs_from_typparms_tycoexpr tyvar_ctxt (vs, (resolv_here name, map (ITyVar o fst) vs)),
  1199               hs_from_typparms_tycoexpr tyvar_ctxt (vs, (resolv_here name, map (ITyVar o fst) vs)),
  1201               str "=",
  1200               str "=",
  1202               Pretty.block (separate (Pretty.block [Pretty.brk 1, str "| "]) (map mk_cons constrs))
  1201               Pretty.block (separate (Pretty.block [Pretty.fbrk, str "| "]) (map mk_cons constrs))
  1203             ]
  1202             ]
  1204           end |> SOME
  1203           end |> SOME
  1205       | hs_from_def (_, CodegenThingol.Datatypecons _) =
  1204       | hs_from_def (_, CodegenThingol.Datatypecons _) =
  1206           NONE
  1205           NONE
  1207       | hs_from_def (name, CodegenThingol.Class (supclasss, (v, membrs))) =
  1206       | hs_from_def (name, CodegenThingol.Class (supclasss, (v, membrs))) =