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 = |
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))) = |