src/Pure/Tools/codegen_serializer.ML
changeset 22070 a10ad9d71eaf
parent 22061 547b0303f37b
child 22076 42ae57200d96
equal deleted inserted replaced
22069:8668c056c507 22070:a10ad9d71eaf
    60   | NOBR
    60   | NOBR
    61   | INFX of (int * lrx);
    61   | INFX of (int * lrx);
    62 
    62 
    63 val APP = INFX (~1, L);
    63 val APP = INFX (~1, L);
    64 
    64 
    65 type typ_syntax = int * ((fixity -> itype -> Pretty.T) -> fixity
    65 type typ_syntax = int * ((fixity -> itype -> Pretty.T)
    66   -> itype list -> Pretty.T);
    66   -> fixity -> itype list -> Pretty.T);
    67 type term_syntax = int * ((vname list -> fixity -> iterm -> Pretty.T) -> fixity
    67 type term_syntax = int * ((CodegenNames.var_ctxt -> fixity -> iterm -> Pretty.T)
    68   -> iterm list -> Pretty.T);
    68   -> CodegenNames.var_ctxt ->  fixity -> iterm list -> Pretty.T);
    69 
    69 
    70 fun eval_lrx L L = false
    70 fun eval_lrx L L = false
    71   | eval_lrx R R = false
    71   | eval_lrx R R = false
    72   | eval_lrx _ _ = true;
    72   | eval_lrx _ _ = true;
    73 
    73 
   151     | NONE => error "bad serializer arguments";
   151     | NONE => error "bad serializer arguments";
   152 
   152 
   153 
   153 
   154 (* generic serializer combinators *)
   154 (* generic serializer combinators *)
   155 
   155 
   156 fun gen_pr_app pr_app' pr_term const_syntax fxy (app as ((c, (_, ty)), ts)) =
   156 fun gen_pr_app pr_app' pr_term const_syntax vars fxy (app as ((c, (_, ty)), ts)) =
   157   case const_syntax c
   157   case const_syntax c
   158    of NONE => brackify fxy (pr_app' app)
   158    of NONE => brackify fxy (pr_app' vars app)
   159     | SOME (i, pr) =>
   159     | SOME (i, pr) =>
   160         let
   160         let
   161           val k = if i < 0 then (length o fst o CodegenThingol.unfold_fun) ty else i
   161           val k = if i < 0 then (length o fst o CodegenThingol.unfold_fun) ty else i
   162         in if k = length ts
   162         in if k = length ts
   163           then 
   163           then 
   164             pr pr_term fxy ts
   164             pr pr_term vars fxy ts
   165           else if k < length ts
   165           else if k < length ts
   166           then case chop k ts of (ts1, ts2) =>
   166           then case chop k ts of (ts1, ts2) =>
   167             brackify fxy (pr pr_term APP ts1 :: map (pr_term [] BR) ts2)
   167             brackify fxy (pr pr_term vars APP ts1 :: map (pr_term vars BR) ts2)
   168           else pr_term [] fxy (CodegenThingol.eta_expand app k)
   168           else pr_term vars fxy (CodegenThingol.eta_expand app k)
   169         end;
   169         end;
   170 
   170 
   171 fun gen_pr_bind pr_bind' pr_term fxy ((v, pat), ty) vars =
   171 fun gen_pr_bind pr_bind' pr_term fxy ((v, pat), ty) vars =
   172   let
   172   let
   173     val vs = case pat
   173     val vs = case pat
   215             | NONE => NONE;
   215             | NONE => NONE;
   216   in CodegenThingol.unfoldr dest_monad t end;
   216   in CodegenThingol.unfoldr dest_monad t end;
   217 
   217 
   218 fun pretty_ml_string c_nil c_cons mk_char mk_string target_implode =
   218 fun pretty_ml_string c_nil c_cons mk_char mk_string target_implode =
   219   let
   219   let
   220     fun pretty pr fxy [t] =
   220     fun pretty pr vars fxy [t] =
   221       case implode_list c_nil c_cons t
   221       case implode_list c_nil c_cons t
   222        of SOME ts => (case implode_string mk_char mk_string ts
   222        of SOME ts => (case implode_string mk_char mk_string ts
   223            of SOME p => p
   223            of SOME p => p
   224             | NONE => Pretty.block [str target_implode, Pretty.brk 1, pr [] BR t])
   224             | NONE => Pretty.block [str target_implode, Pretty.brk 1, pr vars BR t])
   225         | NONE => Pretty.block [str target_implode, Pretty.brk 1, pr [] BR t]
   225         | NONE => Pretty.block [str target_implode, Pretty.brk 1, pr vars BR t]
   226   in (1, pretty) end;
   226   in (1, pretty) end;
   227 
   227 
   228 fun pretty_list c_nil c_cons mk_list mk_char_string (target_fxy, target_cons) =
   228 fun pretty_list c_nil c_cons mk_list mk_char_string (target_fxy, target_cons) =
   229   let
   229   let
   230     fun default pr fxy t1 t2 =
   230     fun default pr fxy t1 t2 =
   231       brackify_infix (target_fxy, R) fxy [
   231       brackify_infix (target_fxy, R) fxy [
   232         pr (INFX (target_fxy, X)) t1,
   232         pr (INFX (target_fxy, X)) t1,
   233         str target_cons,
   233         str target_cons,
   234         pr (INFX (target_fxy, R)) t2
   234         pr (INFX (target_fxy, R)) t2
   235       ];
   235       ];
   236     fun pretty pr fxy [t1, t2] =
   236     fun pretty pr vars fxy [t1, t2] =
   237       case Option.map (cons t1) (implode_list c_nil c_cons t2)
   237       case Option.map (cons t1) (implode_list c_nil c_cons t2)
   238        of SOME ts =>
   238        of SOME ts =>
   239             (case mk_char_string
   239             (case mk_char_string
   240              of SOME (mk_char, mk_string) =>
   240              of SOME (mk_char, mk_string) =>
   241                   (case implode_string mk_char mk_string ts
   241                   (case implode_string mk_char mk_string ts
   242                    of SOME p => p
   242                    of SOME p => p
   243                     | NONE => mk_list (map (pr [] NOBR) ts))
   243                     | NONE => mk_list (map (pr vars NOBR) ts))
   244               | NONE => mk_list (map (pr [] NOBR) ts))
   244               | NONE => mk_list (map (pr vars NOBR) ts))
   245         | NONE => default (pr []) fxy t1 t2;
   245         | NONE => default (pr vars) fxy t1 t2;
   246   in (2, pretty) end;
   246   in (2, pretty) end;
   247 
   247 
   248 val pretty_imperative_monad_bind =
   248 val pretty_imperative_monad_bind =
   249   let
   249   let
   250     fun pretty (pr : vname list -> fixity -> iterm -> Pretty.T) fxy [t1, (v, ty) `|-> t2] =
   250     fun pretty (pr : CodegenNames.var_ctxt -> fixity -> iterm -> Pretty.T) vars fxy [t1, (v, ty) `|-> t2] =
   251           pr [] fxy (ICase ((t1, ty), ([(IVar v, t2)])))
   251           pr vars fxy (ICase ((t1, ty), ([(IVar v, t2)])))
   252       | pretty _ _ _ = error "bad arguments for imperative monad bind";
   252       | pretty _ _ _ _ = error "bad arguments for imperative monad bind";
   253   in (2, pretty) end;
   253   in (2, pretty) end;
   254 
       
   255 fun pretty_haskell_monad c_mbind c_kbind =
       
   256   let
       
   257     fun pr_bnd pr ((SOME v, NONE), _) = str "<FOO>"
       
   258       | pr_bnd pr ((NONE, SOME t), _) = str "<FOO>"
       
   259       | pr_bnd pr ((SOME v, SOME t), _) = str "<FOO>";
       
   260     fun pr_bind pr (NONE, t) = semicolon [pr [] NOBR t]
       
   261       | pr_bind pr (SOME (bind, true), t) = semicolon [pr_bnd pr bind, str "<-", pr [] NOBR t]
       
   262       | pr_bind pr (SOME (bind, false), t) = semicolon [str "let", pr_bnd pr bind, str "=", pr [] NOBR t];
       
   263     fun brack fxy p = if eval_fxy BR fxy then Pretty.block [str "(", p, str ")"] else p;
       
   264     fun pretty pr fxy [t] =
       
   265       let
       
   266         val (binds, t) = implode_monad c_mbind c_kbind t;
       
   267       in (brack fxy o Pretty.block_enclose (str "do {", str "}")) (
       
   268         map (pr_bind pr) binds
       
   269         @| pr [] NOBR t
       
   270       ) end;
       
   271   in (1, pretty) end;
       
   272 
   254 
   273 
   255 
   274 
   256 
   275 (** name auxiliary **)
   257 (** name auxiliary **)
   276 
   258 
   441       else if k = length ts then
   423       else if k = length ts then
   442         [(str o deresolv) c, Pretty.enum "," "(" ")" (map (pr_term vars NOBR) ts)]
   424         [(str o deresolv) c, Pretty.enum "," "(" ")" (map (pr_term vars NOBR) ts)]
   443       else [pr_term vars BR (CodegenThingol.eta_expand app k)] end else
   425       else [pr_term vars BR (CodegenThingol.eta_expand app k)] end else
   444         (str o deresolv) c
   426         (str o deresolv) c
   445           :: ((map (pr_insts BR) o filter_out null) iss @ map (pr_term vars BR) ts)
   427           :: ((map (pr_insts BR) o filter_out null) iss @ map (pr_term vars BR) ts)
   446     and pr_app vars fxy (app as ((c, (iss, ty)), ts)) =
   428     and pr_app vars = gen_pr_app pr_app' pr_term const_syntax vars
   447       gen_pr_app (pr_app' vars) (fn vars' => pr_term (CodegenNames.intro_vars vars' vars))
       
   448         const_syntax fxy app
       
   449     and pr_bind' ((NONE, NONE), _) = str "_"
   429     and pr_bind' ((NONE, NONE), _) = str "_"
   450       | pr_bind' ((SOME v, NONE), _) = str v
   430       | pr_bind' ((SOME v, NONE), _) = str v
   451       | pr_bind' ((NONE, SOME p), _) = p
   431       | pr_bind' ((NONE, SOME p), _) = p
   452       | pr_bind' ((SOME v, SOME p), _) = concat [str v, str "as", p]
   432       | pr_bind' ((SOME v, SOME p), _) = concat [str v, str "as", p]
   453     and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy;
   433     and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy;
   721           | [t] => [(str o deresolv) c, pr_term vars BR t]
   701           | [t] => [(str o deresolv) c, pr_term vars BR t]
   722           | _ => [(str o deresolv) c, Pretty.enum "," "(" ")" (map (pr_term vars NOBR) ts)]
   702           | _ => [(str o deresolv) c, Pretty.enum "," "(" ")" (map (pr_term vars NOBR) ts)]
   723         else [pr_term vars BR (CodegenThingol.eta_expand app ((length o fst o CodegenThingol.unfold_fun) ty))]
   703         else [pr_term vars BR (CodegenThingol.eta_expand app ((length o fst o CodegenThingol.unfold_fun) ty))]
   724       else (str o deresolv) c
   704       else (str o deresolv) c
   725         :: ((map (pr_insts BR) o filter_out null) iss @ map (pr_term vars BR) ts)
   705         :: ((map (pr_insts BR) o filter_out null) iss @ map (pr_term vars BR) ts)
   726     and pr_app vars fxy (app as ((c, (iss, ty)), ts)) =
   706     and pr_app vars = gen_pr_app pr_app' pr_term const_syntax vars
   727       gen_pr_app (pr_app' vars) (fn vars' => pr_term (CodegenNames.intro_vars vars' vars))
       
   728         const_syntax fxy app
       
   729     and pr_bind' ((NONE, NONE), _) = str "_"
   707     and pr_bind' ((NONE, NONE), _) = str "_"
   730       | pr_bind' ((SOME v, NONE), _) = str v
   708       | pr_bind' ((SOME v, NONE), _) = str v
   731       | pr_bind' ((NONE, SOME p), _) = p
   709       | pr_bind' ((NONE, SOME p), _) = p
   732       | pr_bind' ((SOME v, SOME p), _) = brackets [p, str "as", str v]
   710       | pr_bind' ((SOME v, SOME p), _) = brackets [p, str "as", str v]
   733     and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy;
   711     and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy;
  1105   end;
  1083   end;
  1106 
  1084 
  1107 
  1085 
  1108 (** Haskell serializer **)
  1086 (** Haskell serializer **)
  1109 
  1087 
       
  1088 local
       
  1089 
       
  1090 fun pr_bind' ((NONE, NONE), _) = str "_"
       
  1091   | pr_bind' ((SOME v, NONE), _) = str v
       
  1092   | pr_bind' ((NONE, SOME p), _) = p
       
  1093   | pr_bind' ((SOME v, SOME p), _) = brackets [str v, str "@", p]
       
  1094 
       
  1095 val pr_bind_haskell = gen_pr_bind pr_bind';
       
  1096 
       
  1097 in
       
  1098 
  1110 fun pr_haskell class_syntax tyco_syntax const_syntax keyword_vars deresolv_here deresolv deriving_show def =
  1099 fun pr_haskell class_syntax tyco_syntax const_syntax keyword_vars deresolv_here deresolv deriving_show def =
  1111   let
  1100   let
  1112     fun class_name class = case class_syntax class
  1101     fun class_name class = case class_syntax class
  1113      of NONE => deresolv class
  1102      of NONE => deresolv class
  1114       | SOME (class, _) => class;
  1103       | SOME (class, _) => class;
  1201               str "})"
  1190               str "})"
  1202             ) (map pr bs)
  1191             ) (map pr bs)
  1203           end
  1192           end
  1204     and pr_app' vars ((c, _), ts) =
  1193     and pr_app' vars ((c, _), ts) =
  1205       (str o deresolv) c :: map (pr_term vars BR) ts
  1194       (str o deresolv) c :: map (pr_term vars BR) ts
  1206     and pr_app vars fxy =
  1195     and pr_app vars = gen_pr_app pr_app' pr_term const_syntax vars
  1207       gen_pr_app (pr_app' vars) (fn vars' => pr_term (CodegenNames.intro_vars vars' vars))
  1196     and pr_bind fxy = pr_bind_haskell pr_term fxy;
  1208         const_syntax fxy
       
  1209     and pr_bind' ((NONE, NONE), _) = str "_"
       
  1210       | pr_bind' ((SOME v, NONE), _) = str v
       
  1211       | pr_bind' ((NONE, SOME p), _) = p
       
  1212       | pr_bind' ((SOME v, SOME p), _) = brackets [str v, str "@", p]
       
  1213     and pr_bind fxy = gen_pr_bind pr_bind' pr_term fxy;
       
  1214     fun pr_def (name, CodegenThingol.Fun (eqs, (vs, ty))) =
  1197     fun pr_def (name, CodegenThingol.Fun (eqs, (vs, ty))) =
  1215           let
  1198           let
  1216             val tyvars = CodegenNames.intro_vars (map fst vs) keyword_vars;
  1199             val tyvars = CodegenNames.intro_vars (map fst vs) keyword_vars;
  1217             fun pr_eq (ts, t) =
  1200             fun pr_eq (ts, t) =
  1218               let
  1201               let
  1323               ],
  1306               ],
  1324               str "};"
  1307               str "};"
  1325             ) (map pr_instdef classop_defs)
  1308             ) (map pr_instdef classop_defs)
  1326           end;
  1309           end;
  1327   in pr_def def end;
  1310   in pr_def def end;
       
  1311 
       
  1312 fun pretty_haskell_monad c_mbind c_kbind =
       
  1313   let
       
  1314     fun pretty pr vars fxy [t] =
       
  1315       let
       
  1316         val pr_bind = pr_bind_haskell pr;
       
  1317         fun pr_mbind (NONE, t) vars =
       
  1318               (semicolon [pr vars NOBR t], vars)
       
  1319           | pr_mbind (SOME (bind, true), t) vars = vars
       
  1320               |> pr_bind NOBR bind
       
  1321               |>> (fn p => semicolon [p, str "<-", pr vars NOBR t])
       
  1322           | pr_mbind (SOME (bind, false), t) vars = vars
       
  1323               |> pr_bind NOBR bind
       
  1324               |>> (fn p => semicolon [str "let", p, str "=", pr vars NOBR t]);
       
  1325         val (binds, t) = implode_monad c_mbind c_kbind t;
       
  1326         val (ps, vars') = fold_map pr_mbind binds vars;
       
  1327         fun brack p = if eval_fxy BR fxy then Pretty.block [str "(", p, str ")"] else p;
       
  1328       in (brack o Pretty.block_enclose (str "do {", str "}")) (ps @| pr vars' NOBR t) end;
       
  1329   in (1, pretty) end;
       
  1330 
       
  1331 end; (*local*)
  1328 
  1332 
  1329 val reserved_haskell = [
  1333 val reserved_haskell = [
  1330   "hiding", "deriving", "where", "case", "of", "infix", "infixl", "infixr",
  1334   "hiding", "deriving", "where", "case", "of", "infix", "infixl", "infixr",
  1331   "import", "default", "forall", "let", "in", "class", "qualified", "data",
  1335   "import", "default", "forall", "let", "in", "class", "qualified", "data",
  1332   "newtype", "instance", "if", "then", "else", "type", "as", "do", "module"
  1336   "newtype", "instance", "if", "then", "else", "type", "as", "do", "module"
  1579   in
  1583   in
  1580     thy
  1584     thy
  1581     |> (CodegenSerializerData.map o Symtab.map_entry target o map_target) f
  1585     |> (CodegenSerializerData.map o Symtab.map_entry target o map_target) f
  1582   end;
  1586   end;
  1583 
  1587 
       
  1588 val target_SML = "SML";
       
  1589 val target_OCaml = "OCaml";
       
  1590 val target_Haskell = "Haskell";
  1584 val target_diag = "diag";
  1591 val target_diag = "diag";
  1585 
  1592 
  1586 val _ = Context.add_setup (
  1593 val _ = Context.add_setup (
  1587   CodegenSerializerData.init
  1594   CodegenSerializerData.init
  1588   #> add_serializer ("SML", isar_seri_sml)
  1595   #> add_serializer (target_SML, isar_seri_sml)
  1589   #> add_serializer ("OCaml", isar_seri_ocaml)
  1596   #> add_serializer (target_OCaml, isar_seri_ocaml)
  1590   #> add_serializer ("Haskell", isar_seri_haskell)
  1597   #> add_serializer (target_Haskell, isar_seri_haskell)
  1591   #> add_serializer (target_diag, (fn _ => fn _ => seri_diagnosis))
  1598   #> add_serializer (target_diag, (fn _ => fn _ => seri_diagnosis))
  1592 );
  1599 );
  1593 
  1600 
  1594 fun get_serializer thy target args = fn cs =>
  1601 fun get_serializer thy target args = fn cs =>
  1595   let
  1602   let
  1751     val tyco = Sign.intern_type thy raw_tyco;
  1758     val tyco = Sign.intern_type thy raw_tyco;
  1752     val _ = if Sign.declared_tyname thy tyco then ()
  1759     val _ = if Sign.declared_tyname thy tyco then ()
  1753       else error ("No such type constructor: " ^ quote raw_tyco);
  1760       else error ("No such type constructor: " ^ quote raw_tyco);
  1754   in tyco end;
  1761   in tyco end;
  1755 
  1762 
  1756 fun idfs_of_const_names thy c =
  1763 fun idfs_of_const thy c =
  1757   let
  1764   let
  1758     val c' = (c, Sign.the_const_type thy c);
  1765     val c' = (c, Sign.the_const_type thy c);
  1759     val c'' = CodegenConsts.norm_of_typ thy c';
  1766     val c'' = CodegenConsts.norm_of_typ thy c';
  1760   in (c'', CodegenNames.const thy c'') end;
  1767   in (c'', CodegenNames.const thy c'') end;
       
  1768 
       
  1769 fun gen_add_haskell_monad prep_const c_run c_mbind c_kbind thy =
       
  1770   let
       
  1771     val c_run' =
       
  1772       (CodegenConsts.norm thy o prep_const thy) c_run;
       
  1773     val c_mbind'' =
       
  1774       (CodegenNames.const thy o CodegenConsts.norm thy o prep_const thy) c_mbind;
       
  1775     val c_kbind'' =
       
  1776       (CodegenNames.const thy o CodegenConsts.norm thy o prep_const thy) c_kbind;
       
  1777     val pr = pretty_haskell_monad c_mbind'' c_kbind''
       
  1778   in
       
  1779     thy
       
  1780     |> gen_add_syntax_const (K I) target_Haskell c_run' (SOME pr)
       
  1781   end;
  1761 
  1782 
  1762 val add_syntax_class = gen_add_syntax_class read_class CodegenConsts.read_const;
  1783 val add_syntax_class = gen_add_syntax_class read_class CodegenConsts.read_const;
  1763 val add_syntax_inst = gen_add_syntax_inst read_class read_type;
  1784 val add_syntax_inst = gen_add_syntax_inst read_class read_type;
  1764 val add_syntax_tyco = gen_add_syntax_tyco read_type;
  1785 val add_syntax_tyco = gen_add_syntax_tyco read_type;
  1765 val add_syntax_const = gen_add_syntax_const CodegenConsts.read_const;
  1786 val add_syntax_const = gen_add_syntax_const CodegenConsts.read_const;
  1788   P.and_list1 parse_thing
  1809   P.and_list1 parse_thing
  1789   #-> (fn things => Scan.repeat1 (P.$$$ "(" |-- P.name --
  1810   #-> (fn things => Scan.repeat1 (P.$$$ "(" |-- P.name --
  1790         (zip_list things parse_syntax (P.$$$ "and")) --| P.$$$ ")"));
  1811         (zip_list things parse_syntax (P.$$$ "and")) --| P.$$$ ")"));
  1791 
  1812 
  1792 fun no_bindings x = (Option.map o apsnd)
  1813 fun no_bindings x = (Option.map o apsnd)
  1793   (fn pretty => fn pr => pretty (pr [])) x;
  1814   (fn pretty => fn pr => fn vars => pretty (pr vars)) x;
  1794 
  1815 
  1795 val (infixK, infixlK, infixrK) = ("infix", "infixl", "infixr");
  1816 val (infixK, infixlK, infixrK) = ("infix", "infixl", "infixr");
  1796 
  1817 
  1797 fun parse_syntax xs =
  1818 fun parse_syntax xs =
  1798   Scan.option ((
  1819   Scan.option ((
  1811 
  1832 
  1812 in
  1833 in
  1813 
  1834 
  1814 fun add_pretty_list target nill cons mk_list mk_char_string target_cons thy =
  1835 fun add_pretty_list target nill cons mk_list mk_char_string target_cons thy =
  1815   let
  1836   let
  1816     val (_, nil'') = idfs_of_const_names thy nill;
  1837     val (_, nil'') = idfs_of_const thy nill;
  1817     val (cons', cons'') = idfs_of_const_names thy cons;
  1838     val (cons', cons'') = idfs_of_const thy cons;
  1818     val pr = pretty_list nil'' cons'' mk_list mk_char_string target_cons;
  1839     val pr = pretty_list nil'' cons'' mk_list mk_char_string target_cons;
  1819   in
  1840   in
  1820     thy
  1841     thy
  1821     |> gen_add_syntax_const (K I) target cons' (SOME pr)
  1842     |> gen_add_syntax_const (K I) target cons' (SOME pr)
  1822   end;
  1843   end;
  1823 
  1844 
  1824 fun add_pretty_ml_string target nill cons str mk_char mk_string target_implode thy =
  1845 fun add_pretty_ml_string target nill cons str mk_char mk_string target_implode thy =
  1825   let
  1846   let
  1826     val (_, nil'') = idfs_of_const_names thy nill;
  1847     val (_, nil'') = idfs_of_const thy nill;
  1827     val (_, cons'') = idfs_of_const_names thy cons;
  1848     val (_, cons'') = idfs_of_const thy cons;
  1828     val (str', _) = idfs_of_const_names thy str;
  1849     val (str', _) = idfs_of_const thy str;
  1829     val pr = pretty_ml_string nil'' cons'' mk_char mk_string target_implode;
  1850     val pr = pretty_ml_string nil'' cons'' mk_char mk_string target_implode;
  1830   in
  1851   in
  1831     thy
  1852     thy
  1832     |> gen_add_syntax_const (K I) target str' (SOME pr)
  1853     |> gen_add_syntax_const (K I) target str' (SOME pr)
  1833   end;
  1854   end;
  1834 
  1855 
  1835 fun add_undefined target undef target_undefined thy =
  1856 fun add_undefined target undef target_undefined thy =
  1836   let
  1857   let
  1837     val (undef', _) = idfs_of_const_names thy undef;
  1858     val (undef', _) = idfs_of_const thy undef;
  1838     fun pr _ _ _ = str target_undefined;
  1859     fun pr _ _ _ _ = str target_undefined;
  1839   in
  1860   in
  1840     thy
  1861     thy
  1841     |> gen_add_syntax_const (K I) target undef' (SOME (~1, pr))
  1862     |> gen_add_syntax_const (K I) target undef' (SOME (~1, pr))
  1842   end;
  1863   end;
  1843 
  1864 
  1844 fun add_pretty_imperative_monad_bind target bind thy =
  1865 fun add_pretty_imperative_monad_bind target bind thy =
  1845   let
  1866   let
  1846     val (bind', _) = idfs_of_const_names thy bind;
  1867     val (bind', _) = idfs_of_const thy bind;
  1847     val pr = pretty_imperative_monad_bind
  1868     val pr = pretty_imperative_monad_bind
  1848   in
  1869   in
  1849     thy
  1870     thy
  1850     |> gen_add_syntax_const (K I) target bind' (SOME pr)
  1871     |> gen_add_syntax_const (K I) target bind' (SOME pr)
  1851   end;
  1872   end;
       
  1873 
       
  1874 val add_haskell_monad = gen_add_haskell_monad CodegenConsts.read_const;
  1852 
  1875 
  1853 val code_classP =
  1876 val code_classP =
  1854   OuterSyntax.command code_classK "define code syntax for class" K.thy_decl (
  1877   OuterSyntax.command code_classK "define code syntax for class" K.thy_decl (
  1855     parse_multi_syntax P.xname
  1878     parse_multi_syntax P.xname
  1856       (Scan.option (P.string -- Scan.optional (P.$$$ "where" |-- Scan.repeat1
  1879       (Scan.option (P.string -- Scan.optional (P.$$$ "where" |-- Scan.repeat1
  1879     parse_multi_syntax P.term parse_syntax
  1902     parse_multi_syntax P.term parse_syntax
  1880     >> (Toplevel.theory oo fold) (fn (target, syns) =>
  1903     >> (Toplevel.theory oo fold) (fn (target, syns) =>
  1881           fold (fn (raw_const, syn) => add_syntax_const target raw_const (no_bindings syn)) syns)
  1904           fold (fn (raw_const, syn) => add_syntax_const target raw_const (no_bindings syn)) syns)
  1882   );
  1905   );
  1883 
  1906 
  1884 (*val code_monadP =
  1907 val code_monadP =
  1885   OuterSyntax.command code_typeK "define code syntax for Haskell monads" K.thy_decl (
  1908   OuterSyntax.command code_monadK "define code syntax for Haskell monads" K.thy_decl (
  1886     parse_multi_syntax P.xname parse_syntax
  1909     P.term -- P.term -- P.term
  1887     >> (Toplevel.theory oo fold) (fn (target, syns) =>
  1910     >> (fn ((raw_run, raw_mbind), raw_kbind) => Toplevel.theory 
  1888           fold (fn (raw_tyco, syn) => add_syntax_monad target raw_tyco syn) syns)
  1911           (add_haskell_monad raw_run raw_mbind raw_kbind))
  1889   );*)
  1912   );
  1890 
  1913 
  1891 val code_reservedP =
  1914 val code_reservedP =
  1892   OuterSyntax.command code_reservedK "declare words as reserved for target language" K.thy_decl (
  1915   OuterSyntax.command code_reservedK "declare words as reserved for target language" K.thy_decl (
  1893     P.name -- Scan.repeat1 P.name
  1916     P.name -- Scan.repeat1 P.name
  1894     >> (fn (target, reserveds) => (Toplevel.theory o fold (add_reserved target)) reserveds)
  1917     >> (fn (target, reserveds) => (Toplevel.theory o fold (add_reserved target)) reserveds)
  1907   )
  1930   )
  1908 
  1931 
  1909 val _ = OuterSyntax.add_keywords [infixK, infixlK, infixrK];
  1932 val _ = OuterSyntax.add_keywords [infixK, infixlK, infixrK];
  1910 
  1933 
  1911 val _ = OuterSyntax.add_parsers [code_classP, code_instanceP, code_typeP, code_constP,
  1934 val _ = OuterSyntax.add_parsers [code_classP, code_instanceP, code_typeP, code_constP,
  1912   code_reservedP, code_modulenameP, code_moduleprologP];
  1935   code_reservedP, code_modulenameP, code_moduleprologP, code_monadP];
  1913 
  1936 
  1914 (*including serializer defaults*)
  1937 (*including serializer defaults*)
  1915 val _ = Context.add_setup (
  1938 val _ = Context.add_setup (
  1916   gen_add_syntax_tyco (K I) "SML" "fun" (SOME (2, fn pr_typ => fn fxy => fn [ty1, ty2] =>
  1939   gen_add_syntax_tyco (K I) "SML" "fun" (SOME (2, fn pr_typ => fn fxy => fn [ty1, ty2] =>
  1917       (gen_brackify (case fxy of NOBR => false | _ => eval_fxy (INFX (1, R)) fxy) o Pretty.breaks) [
  1940       (gen_brackify (case fxy of NOBR => false | _ => eval_fxy (INFX (1, R)) fxy) o Pretty.breaks) [