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