| author | wenzelm | 
| Fri, 05 May 2006 21:59:43 +0200 | |
| changeset 19575 | 2d9940cd52d3 | 
| parent 19482 | 9f11af8f7ef9 | 
| child 19597 | 8ced57ffc090 | 
| permissions | -rw-r--r-- | 
| 18169 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 1 | (* Title: Pure/Tools/codegen_serializer.ML | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 2 | ID: $Id$ | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 3 | Author: Florian Haftmann, TU Muenchen | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 4 | |
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 5 | Serializer from intermediate language ("Thin-gol") to
 | 
| 18216 | 6 | target languages (like ML or Haskell). | 
| 18169 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 7 | *) | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 8 | |
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 9 | signature CODEGEN_SERIALIZER = | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 10 | sig | 
| 18702 | 11 | type 'a pretty_syntax; | 
| 12 | type serializer = | |
| 13 | string list list | |
| 18756 | 14 | -> OuterParse.token list -> | 
| 18865 | 15 | ((string -> string option) | 
| 16 | * (string -> CodegenThingol.itype pretty_syntax option) | |
| 18702 | 17 | * (string -> CodegenThingol.iexpr pretty_syntax option) | 
| 18 | -> string list option | |
| 18756 | 19 | -> CodegenThingol.module -> unit) | 
| 20 | * OuterParse.token list; | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 21 |   val parse_syntax: ('b -> int) -> (string -> 'b -> 'a * 'b) -> OuterParse.token list ->
 | 
| 18702 | 22 |     ('b -> 'a pretty_syntax * 'b) * OuterParse.token list;
 | 
| 18963 | 23 | val parse_targetdef: string -> CodegenThingol.prim list; | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 24 | val pretty_list: string -> string -> int * string -> CodegenThingol.iexpr pretty_syntax; | 
| 18702 | 25 |   val serializers: {
 | 
| 18865 | 26 | ml: string * (string * string * (string -> bool) -> serializer), | 
| 18919 | 27 | haskell: string * (string list -> serializer) | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 28 | }; | 
| 19150 | 29 | val mk_flat_ml_resolver: string list -> string -> string; | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 30 | val ml_fun_datatype: string * string * (string -> bool) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 31 | -> ((string -> CodegenThingol.itype pretty_syntax option) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 32 | * (string -> CodegenThingol.iexpr pretty_syntax option)) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 33 | -> (string -> string) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 34 | -> ((string * CodegenThingol.funn) list -> Pretty.T) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 35 | * ((string * CodegenThingol.datatyp) list -> Pretty.T); | 
| 18169 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 36 | end; | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 37 | |
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 38 | structure CodegenSerializer: CODEGEN_SERIALIZER = | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 39 | struct | 
| 
45def66f86cb
added modules for code generator generation two, not operational yet
 haftmann parents: diff
changeset | 40 | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 41 | open BasicCodegenThingol; | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 42 | val debug_msg = CodegenThingol.debug_msg; | 
| 18850 | 43 | |
| 18216 | 44 | (** generic serialization **) | 
| 45 | ||
| 18702 | 46 | (* precedences *) | 
| 47 | ||
| 18216 | 48 | datatype lrx = L | R | X; | 
| 49 | ||
| 18516 | 50 | datatype fixity = | 
| 18216 | 51 | BR | 
| 52 | | NOBR | |
| 53 | | INFX of (int * lrx); | |
| 54 | ||
| 18702 | 55 | datatype 'a mixfix = | 
| 56 | Arg of fixity | |
| 57 | | Ignore | |
| 58 | | Pretty of Pretty.T | |
| 59 | | Quote of 'a; | |
| 18516 | 60 | |
| 18865 | 61 | type 'a pretty_syntax = (int * int) * (fixity -> (fixity -> 'a -> Pretty.T) | 
| 62 | -> 'a list -> Pretty.T); | |
| 18516 | 63 | |
| 18216 | 64 | fun eval_lrx L L = false | 
| 65 | | eval_lrx R R = false | |
| 66 | | eval_lrx _ _ = true; | |
| 67 | ||
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 68 | fun eval_fxy NOBR _ = false | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 69 | | eval_fxy _ BR = true | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 70 | | eval_fxy _ NOBR = false | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 71 | | eval_fxy (INFX (pr, lr)) (INFX (pr_ctxt, lr_ctxt)) = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 72 | pr < pr_ctxt | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 73 | orelse pr = pr_ctxt | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 74 | andalso eval_lrx lr lr_ctxt | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 75 | | eval_fxy _ (INFX _) = false; | 
| 18216 | 76 | |
| 18702 | 77 | val str = setmp print_mode [] Pretty.str; | 
| 18216 | 78 | |
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 79 | fun gen_brackify _ [p] = p | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 80 |   | gen_brackify true (ps as _::_) = Pretty.enclose "(" ")" ps
 | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 81 | | gen_brackify false (ps as _::_) = Pretty.block ps; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 82 | |
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 83 | fun brackify fxy_ctxt ps = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 84 | gen_brackify (eval_fxy BR fxy_ctxt) (Pretty.breaks ps); | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 85 | |
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 86 | fun brackify_infix infx fxy_ctxt ps = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 87 | gen_brackify (eval_fxy (INFX infx) fxy_ctxt) (Pretty.breaks ps); | 
| 18216 | 88 | |
| 19136 | 89 | fun from_app mk_app from_expr const_syntax fxy ((c, ty), es) = | 
| 18702 | 90 | let | 
| 91 | fun mk NONE es = | |
| 18865 | 92 | brackify fxy (mk_app c es) | 
| 18702 | 93 | | mk (SOME ((i, k), pr)) es = | 
| 19136 | 94 | (*if i <= length es then*) | 
| 95 | let | |
| 96 | val (es1, es2) = chop k es; | |
| 97 | in | |
| 98 | brackify fxy (pr fxy from_expr es1 :: map (from_expr BR) es2) | |
| 99 | end | |
| 100 | (*else | |
| 101 |             error ("illegal const_syntax")*)
 | |
| 18865 | 102 | in mk (const_syntax c) es end; | 
| 103 | ||
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 104 | fun fillin_mixfix fxy_this ms fxy_ctxt pr args = | 
| 18702 | 105 | let | 
| 106 | fun fillin [] [] = | |
| 19008 | 107 | [] | 
| 18702 | 108 | | fillin (Arg fxy :: ms) (a :: args) = | 
| 109 | pr fxy a :: fillin ms args | |
| 110 | | fillin (Ignore :: ms) args = | |
| 111 | fillin ms args | |
| 112 | | fillin (Pretty p :: ms) args = | |
| 113 | p :: fillin ms args | |
| 114 | | fillin (Quote q :: ms) args = | |
| 19008 | 115 | pr BR q :: fillin ms args | 
| 116 | | fillin [] _ = | |
| 117 |           error ("inconsistent mixfix: too many arguments")
 | |
| 118 | | fillin _ [] = | |
| 119 |           error ("inconsistent mixfix: too less arguments");
 | |
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 120 | in gen_brackify (eval_fxy fxy_this fxy_ctxt) (fillin ms args) end; | 
| 18702 | 121 | |
| 122 | ||
| 123 | (* user-defined syntax *) | |
| 124 | ||
| 125 | val (atomK, infixK, infixlK, infixrK) = | |
| 18756 | 126 |   ("target_atom", "infix", "infixl", "infixr");
 | 
| 127 | val _ = OuterSyntax.add_keywords [atomK, infixK, infixlK, infixrK]; | |
| 18216 | 128 | |
| 18702 | 129 | fun parse_infix (fixity as INFX (i, x)) s = | 
| 130 | let | |
| 131 | val l = case x of L => fixity | |
| 132 | | _ => INFX (i, X); | |
| 133 | val r = case x of R => fixity | |
| 134 | | _ => INFX (i, X); | |
| 135 | in | |
| 136 | pair [Arg l, (Pretty o Pretty.brk) 1, (Pretty o str) s, (Pretty o Pretty.brk) 1, Arg r] | |
| 137 | end; | |
| 138 | ||
| 139 | fun parse_mixfix reader s ctxt = | |
| 18335 | 140 | let | 
| 18702 | 141 | fun sym s = Scan.lift ($$ s); | 
| 142 | fun lift_reader ctxt s = | |
| 143 | ctxt | |
| 144 | |> reader s | |
| 145 | |-> (fn x => pair (Quote x)); | |
| 146 | val sym_any = Scan.lift (Scan.one Symbol.not_eof); | |
| 147 | val parse = Scan.repeat ( | |
| 148 | (sym "_" -- sym "_" >> K (Arg NOBR)) | |
| 149 | || (sym "_" >> K (Arg BR)) | |
| 150 | || (sym "?" >> K Ignore) | |
| 151 | || (sym "/" |-- Scan.repeat (sym " ") >> (Pretty o Pretty.brk o length)) | |
| 152 |       || Scan.depend (fn ctxt => $$ "{" |-- $$ "*" |-- Scan.repeat1
 | |
| 153 | ( $$ "'" |-- Scan.one Symbol.not_eof | |
| 154 | || Scan.unless ($$ "*" -- $$ "}") (Scan.one Symbol.not_eof)) --| | |
| 155 | $$ "*" --| $$ "}" >> (implode #> lift_reader ctxt #> swap)) | |
| 156 | || (Scan.repeat1 | |
| 157 | ( sym "'" |-- sym_any | |
| 158 |             || Scan.unless (sym "_" || sym "?" || sym "/" || sym "{" |-- sym "*")
 | |
| 159 | sym_any) >> (Pretty o str o implode))); | |
| 160 | in case Scan.finite' Symbol.stopper parse (ctxt, Symbol.explode s) | |
| 161 | of (p, (ctxt, [])) => (p, ctxt) | |
| 162 |     | _ => error ("Malformed mixfix annotation: " ^ quote s)
 | |
| 163 | end; | |
| 164 | ||
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 165 | fun parse_nonatomic_mixfix reader s ctxt = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 166 | case parse_mixfix reader s ctxt | 
| 18865 | 167 | of ([Pretty _], _) => | 
| 168 |         error ("mixfix contains just one pretty element; either declare as "
 | |
| 169 | ^ quote atomK ^ " or consider adding a break") | |
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 170 | | x => x; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 171 | |
| 18702 | 172 | fun parse_syntax_proto reader = OuterParse.$$$ "(" |-- (
 | 
| 18865 | 173 | OuterParse.$$$ infixK |-- OuterParse.nat | 
| 174 | >> (fn i => (parse_infix (INFX (i, X)), INFX (i, X))) | |
| 175 | || OuterParse.$$$ infixlK |-- OuterParse.nat | |
| 176 | >> (fn i => (parse_infix (INFX (i, L)), INFX (i, L))) | |
| 177 | || OuterParse.$$$ infixrK |-- OuterParse.nat | |
| 178 | >> (fn i => (parse_infix (INFX (i, R)), INFX (i, R))) | |
| 18702 | 179 | || OuterParse.$$$ atomK |-- pair (parse_mixfix reader, NOBR) | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 180 | || pair (parse_nonatomic_mixfix reader, BR) | 
| 18702 | 181 | ) -- OuterParse.string --| OuterParse.$$$ ")" >> (fn ((p, fxy), s) => (p s, fxy)); | 
| 18282 | 182 | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 183 | fun parse_syntax no_args reader = | 
| 18335 | 184 | let | 
| 18702 | 185 | fun is_arg (Arg _) = true | 
| 186 | | is_arg Ignore = true | |
| 187 | | is_arg _ = false; | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 188 | fun mk fixity mfx ctxt = | 
| 18702 | 189 | let | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 190 | val i = (length o List.filter is_arg) mfx; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 191 | val _ = if i > no_args ctxt then error "too many arguments in codegen syntax" else (); | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 192 | in (((i, i), fillin_mixfix fixity mfx), ctxt) end; | 
| 18702 | 193 | in | 
| 194 | parse_syntax_proto reader | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 195 | #-> (fn (mfx_reader, fixity) => | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 196 | pair (mfx_reader #-> (fn mfx => mk fixity mfx)) | 
| 18702 | 197 | ) | 
| 198 | end; | |
| 199 | ||
| 200 | fun newline_correct s = | |
| 201 | s | |
| 202 | |> Symbol.strip_blanks | |
| 203 | |> space_explode "\n" | |
| 204 | |> map (implode o (fn [] => [] | |
| 205 |                       | (" "::xs) => xs
 | |
| 206 | | xs => xs) o explode) | |
| 207 | |> space_implode "\n"; | |
| 208 | ||
| 18963 | 209 | fun parse_targetdef s = | 
| 18702 | 210 | case Scan.finite Symbol.stopper (Scan.repeat ( | 
| 18963 | 211 | ($$ "`" |-- $$ "`" >> (CodegenThingol.Pretty o str)) | 
| 18702 | 212 | || ($$ "`" |-- Scan.repeat1 (Scan.unless ($$ "`") (Scan.one Symbol.not_eof)) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 213 |             --| $$ "`" >> (fn ["_"] => CodegenThingol.Name | s => error ("malformed antiquote: " ^ implode s)))
 | 
| 18702 | 214 | || Scan.repeat1 | 
| 18963 | 215 | (Scan.unless ($$ "`") (Scan.one Symbol.not_eof)) >> (CodegenThingol.Pretty o str o implode) | 
| 19038 | 216 | )) ((Symbol.explode o Symbol.strip_blanks) s) | 
| 18702 | 217 | of (p, []) => p | 
| 18963 | 218 |     | (p, ss) => error ("Malformed definition: " ^ quote s ^ " - " ^ commas ss);
 | 
| 18702 | 219 | |
| 220 | ||
| 221 | (* abstract serializer *) | |
| 18282 | 222 | |
| 18702 | 223 | type serializer = | 
| 224 | string list list | |
| 18756 | 225 | -> OuterParse.token list -> | 
| 18865 | 226 | ((string -> string option) | 
| 18963 | 227 | * (string -> itype pretty_syntax option) | 
| 228 | * (string -> iexpr pretty_syntax option) | |
| 18702 | 229 | -> string list option | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 230 | -> CodegenThingol.module -> unit) | 
| 18756 | 231 | * OuterParse.token list; | 
| 18702 | 232 | |
| 18919 | 233 | fun abstract_serializer (target, nspgrp) name_root (from_defs, from_module, validator, postproc) | 
| 18963 | 234 | postprocess preprocess (class_syntax, tyco_syntax, const_syntax) | 
| 18865 | 235 | select module = | 
| 18702 | 236 | let | 
| 18963 | 237 | fun pretty_of_prim resolv (name, primdef) = | 
| 238 | let | |
| 239 | fun pr (CodegenThingol.Pretty p) = p | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 240 | | pr CodegenThingol.Name = (str o resolv) name; | 
| 18963 | 241 | in case AList.lookup (op = : string * string -> bool) primdef target | 
| 18702 | 242 |        of NONE => error ("no primitive definition for " ^ quote name)
 | 
| 18963 | 243 | | SOME ps => (case map pr ps | 
| 244 | of [] => NONE | |
| 245 | | ps => (SOME o Pretty.block) ps) | |
| 246 | end; | |
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 247 | fun from_module' resolv imps ((name_qual, name), defs) = | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 248 | from_module resolv imps ((name_qual, name), defs) | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 249 | |> postprocess (resolv name_qual); | 
| 18702 | 250 | in | 
| 251 | module | |
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 252 | |> debug_msg (fn _ => "selecting submodule...") | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 253 | |> (if is_some select then (CodegenThingol.project_module o the) select else I) | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 254 | |> debug_msg (fn _ => "preprocessing...") | 
| 18702 | 255 | |> preprocess | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 256 | |> debug_msg (fn _ => "serializing...") | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 257 | |> CodegenThingol.serialize (from_defs (pretty_of_prim, (class_syntax : string -> string option, tyco_syntax, const_syntax))) | 
| 18919 | 258 | from_module' validator postproc nspgrp name_root | 
| 18850 | 259 | |> K () | 
| 18702 | 260 | end; | 
| 261 | ||
| 19150 | 262 | fun replace_invalid s = | 
| 263 | let | |
| 264 | fun replace_invalid c = | |
| 265 | if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'" | |
| 266 | andalso not (NameSpace.separator = c) | |
| 267 | then c | |
| 268 | else "_"; | |
| 269 | fun contract "_" (acc as "_" :: _) = acc | |
| 270 | | contract c acc = c :: acc; | |
| 271 | fun contract_underscores s = | |
| 272 | implode (fold_rev contract (explode s) []); | |
| 273 | in | |
| 274 | s | |
| 275 | |> translate_string replace_invalid | |
| 276 | |> contract_underscores | |
| 277 | end; | |
| 278 | ||
| 18702 | 279 | fun abstract_validator keywords name = | 
| 280 | let | |
| 281 | fun replace_invalid c = | |
| 282 | if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'" | |
| 283 | andalso not (NameSpace.separator = c) | |
| 284 | then c | |
| 285 | else "_" | |
| 286 | fun suffix_it name = | |
| 287 | name | |
| 288 | |> member (op =) keywords ? suffix "'" | |
| 289 | |> (fn name' => if name = name' then name else suffix_it name') | |
| 290 | in | |
| 291 | name | |
| 292 | |> translate_string replace_invalid | |
| 293 | |> suffix_it | |
| 294 | |> (fn name' => if name = name' then NONE else SOME name') | |
| 295 | end; | |
| 296 | ||
| 18850 | 297 | fun write_file mkdir path p = ( | 
| 298 | if mkdir | |
| 299 | then | |
| 300 | File.mkdir (Path.dir path) | |
| 301 | else (); | |
| 302 | File.write path (Pretty.output p ^ "\n"); | |
| 303 | p | |
| 304 | ); | |
| 305 | ||
| 306 | fun mk_module_file postprocess_module ext path name p = | |
| 307 | let | |
| 308 | val prfx = Path.dir path; | |
| 309 | val name' = case name | |
| 310 | of "" => Path.base path | |
| 311 | | _ => (Path.ext ext o Path.unpack o implode o separate "/" o NameSpace.unpack) name; | |
| 312 | in | |
| 313 | p | |
| 314 | |> write_file true (Path.append prfx name') | |
| 315 | |> postprocess_module name | |
| 316 | end; | |
| 317 | ||
| 19202 | 318 | fun constructive_fun (name, (eqs, ty)) = | 
| 319 | let | |
| 320 | fun check_eq (eq as (lhs, rhs)) = | |
| 321 | if forall CodegenThingol.is_pat lhs | |
| 322 | then SOME eq | |
| 323 |       else (warning ("in function " ^ quote name ^ ", throwing away one "
 | |
| 324 | ^ "non-executable function clause"); NONE) | |
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19466diff
changeset | 325 | in case map_filter check_eq eqs | 
| 19202 | 326 |    of [] => error ("in function " ^ quote name ^ ", no"
 | 
| 327 | ^ "executable function clauses found") | |
| 328 | | eqs => (name, (eqs, ty)) | |
| 329 | end; | |
| 330 | ||
| 18756 | 331 | fun parse_single_file serializer = | 
| 18850 | 332 | OuterParse.path | 
| 333 | >> (fn path => serializer | |
| 334 | (fn "" => write_file false path #> K NONE | |
| 335 | | _ => SOME)); | |
| 336 | ||
| 337 | fun parse_multi_file postprocess_module ext serializer = | |
| 338 | OuterParse.path | |
| 339 | >> (fn path => (serializer o mk_module_file postprocess_module ext) path); | |
| 18702 | 340 | |
| 18756 | 341 | fun parse_internal serializer = | 
| 342 | OuterParse.name | |
| 18850 | 343 | >> (fn "-" => serializer | 
| 344 | (fn "" => (fn p => (use_text Context.ml_output false (Pretty.output p); NONE)) | |
| 345 | | _ => SOME) | |
| 18756 | 346 | | _ => Scan.fail ()); | 
| 18702 | 347 | |
| 18282 | 348 | |
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 349 | (* list serializer *) | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 350 | |
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 351 | fun pretty_list thingol_nil thingol_cons (target_pred, target_cons) = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 352 | let | 
| 19202 | 353 | fun dest_cons (IConst (c, _) `$ e1 `$ e2) = | 
| 18850 | 354 | if c = thingol_cons | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 355 | then SOME (e1, e2) | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 356 | else NONE | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 357 | | dest_cons _ = NONE; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 358 | fun pretty_default fxy pr e1 e2 = | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 359 | brackify_infix (target_pred, R) fxy [ | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 360 | pr (INFX (target_pred, X)) e1, | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 361 | str target_cons, | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 362 | pr (INFX (target_pred, R)) e2 | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 363 | ]; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 364 | fun pretty_compact fxy pr [e1, e2] = | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 365 | case CodegenThingol.unfoldr dest_cons e2 | 
| 19202 | 366 | of (es, IConst (c, _)) => | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 367 | if c = thingol_nil | 
| 18812 | 368 | then Pretty.enum "," "[" "]" (map (pr NOBR) (e1::es)) | 
| 18853 | 369 | else pretty_default fxy pr e1 e2 | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 370 | | _ => pretty_default fxy pr e1 e2; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 371 | in ((2, 2), pretty_compact) end; | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 372 | |
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 373 | |
| 18216 | 374 | |
| 375 | (** ML serializer **) | |
| 376 | ||
| 377 | local | |
| 378 | ||
| 19150 | 379 | val reserved_ml = ThmDatabase.ml_reserved @ [ | 
| 380 | "bool", "int", "list", "unit", "option", "true", "false", "not", "None", "Some", "o" | |
| 381 | ]; | |
| 382 | ||
| 383 | structure NameMangler = NameManglerFun ( | |
| 384 | type ctxt = string list; | |
| 385 | type src = string; | |
| 386 | val ord = string_ord; | |
| 387 | fun mk reserved_ml (name, 0) = | |
| 388 | (replace_invalid o NameSpace.base) name | |
| 389 | | mk reserved_ml (name, i) = | |
| 390 | (replace_invalid o NameSpace.base) name ^ replicate_string i "'"; | |
| 391 | fun is_valid reserved_ml = not o member (op =) reserved_ml; | |
| 392 | fun maybe_unique _ _ = NONE; | |
| 393 |   fun re_mangle _ dst = error ("no such definition name: " ^ quote dst);
 | |
| 394 | ); | |
| 395 | ||
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 396 | fun ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv = | 
| 18216 | 397 | let | 
| 18865 | 398 | val ml_from_label = | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 399 | str o translate_string (fn "_" => "__" | "." => "_" | c => c) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 400 | o NameSpace.base o resolv; | 
| 19213 | 401 | fun ml_from_tyvar (v, sort) = | 
| 402 | let | |
| 403 | fun mk_class v class = | |
| 404 | str (prefix "'" v ^ " " ^ resolv class); | |
| 405 | in | |
| 406 | Pretty.block [ | |
| 407 |           str "(",
 | |
| 408 | str v, | |
| 409 | str ":", | |
| 410 | case sort | |
| 19253 | 411 | of [] => str "unit" | 
| 412 | | [class] => mk_class v class | |
| 19213 | 413 | | _ => Pretty.enum " *" "" "" (map (mk_class v) sort), | 
| 414 | str ")" | |
| 415 | ] | |
| 416 | end; | |
| 19280 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 417 | fun ml_from_sortlookup fxy lss = | 
| 18885 | 418 | let | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 419 | fun from_label l = | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 420 | Pretty.block [str "#", | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 421 | if (is_some o Int.fromString) l then str l | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 422 | else ml_from_label l | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 423 | ]; | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 424 | fun from_lookup fxy [] p = p | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 425 | | from_lookup fxy [l] p = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 426 | brackify fxy [ | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 427 | from_label l, | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 428 | p | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 429 | ] | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 430 | | from_lookup fxy ls p = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 431 | brackify fxy [ | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 432 |                 Pretty.enum " o" "(" ")" (map from_label ls),
 | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 433 | p | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 434 | ]; | 
| 18885 | 435 | fun from_classlookup fxy (Instance (inst, lss)) = | 
| 436 | brackify fxy ( | |
| 437 | (str o resolv) inst | |
| 438 | :: map (ml_from_sortlookup BR) lss | |
| 439 | ) | |
| 440 | | from_classlookup fxy (Lookup (classes, (v, ~1))) = | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 441 | from_lookup BR classes (str v) | 
| 18885 | 442 | | from_classlookup fxy (Lookup (classes, (v, i))) = | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 443 | from_lookup BR (string_of_int (i+1) :: classes) (str v) | 
| 19280 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 444 | in case lss | 
| 19253 | 445 | of [] => str "()" | 
| 19280 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 446 | | [ls] => from_classlookup fxy ls | 
| 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 447 |         | lss => (Pretty.list "(" ")" o map (from_classlookup NOBR)) lss
 | 
| 18885 | 448 | end; | 
| 18963 | 449 | fun ml_from_tycoexpr fxy (tyco, tys) = | 
| 450 | let | |
| 451 | val tyco' = (str o resolv) tyco | |
| 452 | in case map (ml_from_type BR) tys | |
| 453 | of [] => tyco' | |
| 454 | | [p] => Pretty.block [p, Pretty.brk 1, tyco'] | |
| 455 |         | (ps as _::_) => Pretty.block [Pretty.list "(" ")" ps, Pretty.brk 1, tyco']
 | |
| 456 | end | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 457 | and ml_from_type fxy (tycoexpr as tyco `%% tys) = | 
| 18702 | 458 | (case tyco_syntax tyco | 
| 18963 | 459 | of NONE => ml_from_tycoexpr fxy (tyco, tys) | 
| 18702 | 460 | | SOME ((i, k), pr) => | 
| 461 | if not (i <= length tys andalso length tys <= k) | |
| 462 |                 then error ("number of argument mismatch in customary serialization: "
 | |
| 18865 | 463 | ^ (string_of_int o length) tys ^ " given, " | 
| 464 | ^ string_of_int i ^ " to " ^ string_of_int k | |
| 18702 | 465 | ^ " expected") | 
| 466 | else pr fxy ml_from_type tys) | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 467 | | ml_from_type fxy (t1 `-> t2) = | 
| 18216 | 468 | let | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 469 | val brackify = gen_brackify | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 470 | (case fxy | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 471 | of BR => false | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 472 | | _ => eval_fxy (INFX (1, R)) fxy) o Pretty.breaks; | 
| 18216 | 473 | in | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 474 | brackify [ | 
| 18702 | 475 | ml_from_type (INFX (1, X)) t1, | 
| 476 | str "->", | |
| 477 | ml_from_type (INFX (1, R)) t2 | |
| 478 | ] | |
| 18216 | 479 | end | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 480 | | ml_from_type fxy (ITyVar v) = | 
| 18885 | 481 |           str ("'" ^ v);
 | 
| 19202 | 482 | fun typify ty p = | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 483 | let | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 484 | fun needs_type_t (tyco `%% tys) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 485 | needs_type tyco | 
| 19202 | 486 | orelse exists needs_type_t tys | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 487 | | needs_type_t (ITyVar _) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 488 | false | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 489 | | needs_type_t (ty1 `-> ty2) = | 
| 19202 | 490 | needs_type_t ty1 orelse needs_type_t ty2; | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 491 | in if needs_type_t ty | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 492 | then | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 493 |           Pretty.enclose "(" ")" [
 | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 494 | p, | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 495 | str ":", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 496 | ml_from_type NOBR ty | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 497 | ] | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 498 | else p | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 499 | end; | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 500 | fun ml_from_expr fxy (e as IConst x) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 501 | ml_from_app fxy (x, []) | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 502 | | ml_from_expr fxy (IVar v) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 503 | str v | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 504 | | ml_from_expr fxy (e as e1 `$ e2) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 505 | (case CodegenThingol.unfold_const_app e | 
| 18885 | 506 | of SOME x => ml_from_app fxy x | 
| 18865 | 507 | | NONE => | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 508 | brackify fxy [ | 
| 18885 | 509 | ml_from_expr NOBR e1, | 
| 510 | ml_from_expr BR e2 | |
| 18216 | 511 | ]) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 512 | | ml_from_expr fxy ((v, ty) `|-> e) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 513 | brackify BR [ | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 514 | str "fn", | 
| 19202 | 515 | typify ty (str v), | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 516 | str "=>", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 517 | ml_from_expr NOBR e | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 518 | ] | 
| 19202 | 519 | | ml_from_expr fxy (INum ((n, ty), _)) = | 
| 19213 | 520 | brackify BR [ | 
| 19202 | 521 | (str o IntInf.toString) n, | 
| 522 | str ":", | |
| 523 | ml_from_type NOBR ty | |
| 524 | ] | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 525 | | ml_from_expr fxy (IAbs (((ve, vty), be), _)) = | 
| 19038 | 526 | brackify BR [ | 
| 527 | str "fn", | |
| 19202 | 528 | typify vty (ml_from_expr NOBR ve), | 
| 19038 | 529 | str "=>", | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 530 | ml_from_expr NOBR be | 
| 18216 | 531 | ] | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 532 | | ml_from_expr fxy (e as ICase ((_, [_]), _)) = | 
| 18216 | 533 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 534 | val (ves, be) = CodegenThingol.unfold_let e; | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 535 | fun mk_val ((ve, vty), se) = Pretty.block [ | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 536 | (Pretty.block o Pretty.breaks) [ | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 537 | str "val", | 
| 19202 | 538 | typify vty (ml_from_expr NOBR ve), | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 539 | str "=", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 540 | ml_from_expr NOBR se | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 541 | ], | 
| 18702 | 542 | str ";" | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 543 | ]; | 
| 18216 | 544 | in Pretty.chunks [ | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 545 |             [str ("let"), Pretty.fbrk, map mk_val ves |> Pretty.chunks] |> Pretty.block,
 | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 546 |             [str ("in"), Pretty.fbrk, ml_from_expr NOBR be] |> Pretty.block,
 | 
| 18702 | 547 |             str ("end")
 | 
| 18216 | 548 | ] end | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 549 | | ml_from_expr fxy (ICase (((de, dty), bse::bses), _)) = | 
| 18216 | 550 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 551 | fun mk_clause definer (se, be) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 552 | (Pretty.block o Pretty.breaks) [ | 
| 18702 | 553 | str definer, | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 554 | ml_from_expr NOBR se, | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 555 | str "=>", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 556 | ml_from_expr NOBR be | 
| 18216 | 557 | ] | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 558 | in brackify fxy ( | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 559 | str "(case" | 
| 19202 | 560 | :: typify dty (ml_from_expr NOBR de) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 561 | :: mk_clause "of" bse | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 562 | :: map (mk_clause "|") bses | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 563 | @ [str ")"] | 
| 18216 | 564 | ) end | 
| 18885 | 565 | | ml_from_expr _ e = | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 566 |           error ("dubious expression: " ^ (Pretty.output o CodegenThingol.pretty_iexpr) e)
 | 
| 18885 | 567 | and ml_mk_app f es = | 
| 19136 | 568 | if is_cons f andalso length es > 1 then | 
| 19038 | 569 |         [(str o resolv) f, Pretty.enum "," "(" ")" (map (ml_from_expr BR) es)]
 | 
| 18702 | 570 | else | 
| 18885 | 571 | (str o resolv) f :: map (ml_from_expr BR) es | 
| 19202 | 572 | and ml_from_app fxy ((c, (lss, ty)), es) = | 
| 18885 | 573 | case map (ml_from_sortlookup BR) lss | 
| 574 | of [] => | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 575 | from_app ml_mk_app ml_from_expr const_syntax fxy ((c, ty), es) | 
| 18885 | 576 | | lss => | 
| 577 | brackify fxy ( | |
| 578 | (str o resolv) c | |
| 579 | :: (lss | |
| 580 | @ map (ml_from_expr BR) es) | |
| 581 | ); | |
| 19213 | 582 | in (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) end; | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 583 | |
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 584 | fun ml_fun_datatyp (is_cons, needs_type) (tyco_syntax, const_syntax) resolv = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 585 | let | 
| 19213 | 586 | val (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) = | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 587 | ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 588 | fun chunk_defs ps = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 589 | let | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 590 | val (p_init, p_last) = split_last ps | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 591 | in | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 592 | Pretty.chunks (p_init @ [Pretty.block ([p_last, str ";"])]) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 593 | end; | 
| 18912 | 594 | fun ml_from_funs (defs as def::defs_tl) = | 
| 18216 | 595 | let | 
| 19213 | 596 | fun mk_definer [] [] = "val" | 
| 597 | | mk_definer _ _ = "fun"; | |
| 598 | fun check_args (_, ((pats, _)::_, (sortctxt, _))) NONE = | |
| 599 | SOME (mk_definer pats sortctxt) | |
| 600 | | check_args (_, ((pats, _)::_, (sortctxt, _))) (SOME definer) = | |
| 601 | if mk_definer pats sortctxt = definer | |
| 18216 | 602 | then SOME definer | 
| 19213 | 603 |               else error ("mixing simultaneous vals and funs not implemented");
 | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 604 | fun mk_fun definer (name, (eqs as eq::eq_tl, (sortctxt, ty))) = | 
| 18216 | 605 | let | 
| 19136 | 606 | val shift = if null eq_tl then I else | 
| 607 | map (Pretty.block o single o Pretty.block o single); | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 608 | fun mk_arg e ty = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 609 | ml_from_expr BR e | 
| 19202 | 610 | |> typify ty | 
| 18912 | 611 | fun mk_eq definer (pats, expr) = | 
| 612 | (Pretty.block o Pretty.breaks) ( | |
| 613 | [str definer, (str o resolv) name] | |
| 19213 | 614 | @ (if null pats andalso null sortctxt | 
| 18912 | 615 | then [str ":", ml_from_type NOBR ty] | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 616 | else | 
| 19213 | 617 | map ml_from_tyvar sortctxt | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 618 | @ map2 mk_arg pats | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 619 | ((curry Library.take (length pats) o fst o CodegenThingol.unfold_fun) ty)) | 
| 18912 | 620 | @ [str "=", ml_from_expr NOBR expr] | 
| 621 | ) | |
| 18216 | 622 | in | 
| 18912 | 623 | (Pretty.block o Pretty.fbreaks o shift) ( | 
| 624 | mk_eq definer eq | |
| 625 | :: map (mk_eq "|") eq_tl | |
| 626 | ) | |
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 627 | end; | 
| 18216 | 628 | in | 
| 629 | chunk_defs ( | |
| 19202 | 630 | (mk_fun (the (fold check_args defs NONE)) o constructive_fun) def | 
| 631 | :: map (mk_fun "and" o constructive_fun) defs_tl | |
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 632 | ) | 
| 18216 | 633 | end; | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 634 | fun ml_from_datatypes (defs as (def::defs_tl)) = | 
| 18216 | 635 | let | 
| 18702 | 636 | fun mk_cons (co, []) = | 
| 637 | str (resolv co) | |
| 638 | | mk_cons (co, tys) = | |
| 19136 | 639 | Pretty.block [ | 
| 640 | str (resolv co), | |
| 641 | str " of", | |
| 642 | Pretty.brk 1, | |
| 643 | Pretty.enum " *" "" "" (map (ml_from_type NOBR) tys) | |
| 644 | ] | |
| 19038 | 645 | fun mk_datatype definer (t, (vs, cs)) = | 
| 18912 | 646 | (Pretty.block o Pretty.breaks) ( | 
| 18702 | 647 | str definer | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 648 | :: ml_from_tycoexpr NOBR (t, map (ITyVar o fst) vs) | 
| 18912 | 649 | :: str "=" | 
| 650 | :: separate (str "|") (map mk_cons cs) | |
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 651 | ) | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 652 | in | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 653 | chunk_defs ( | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 654 | mk_datatype "datatype" def | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 655 | :: map (mk_datatype "and") defs_tl | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 656 | ) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 657 | end; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 658 | in (ml_from_funs, ml_from_datatypes) end; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 659 | |
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 660 | fun ml_from_defs (is_cons, needs_type) | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 661 | (from_prim, (_, tyco_syntax, const_syntax)) resolver prefix defs = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 662 | let | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 663 | val resolv = resolver prefix; | 
| 19213 | 664 | val (ml_from_label, ml_from_tyvar, ml_from_sortlookup, ml_from_tycoexpr, ml_from_type, typify, ml_from_expr) = | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 665 | ml_expr_seri (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 666 | val (ml_from_funs, ml_from_datatypes) = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 667 | ml_fun_datatyp (is_cons, needs_type) (tyco_syntax, const_syntax) resolv; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 668 | val filter_datatype = | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19466diff
changeset | 669 | map_filter | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 670 | (fn (name, CodegenThingol.Datatype info) => SOME (name, info) | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 671 | | (name, CodegenThingol.Datatypecons _) => NONE | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 672 |           | (name, def) => error ("datatype block containing illegal def: "
 | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 673 | ^ (Pretty.output o CodegenThingol.pretty_def) def)); | 
| 19136 | 674 | fun filter_class defs = | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19466diff
changeset | 675 | case map_filter | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 676 | (fn (name, CodegenThingol.Class info) => SOME (name, info) | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 677 | | (name, CodegenThingol.Classmember _) => NONE | 
| 19136 | 678 |           | (name, def) => error ("class block containing illegal def: "
 | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 679 | ^ (Pretty.output o CodegenThingol.pretty_def) def)) defs | 
| 19136 | 680 | of [class] => class | 
| 681 |         | _ => error ("class block without class: " ^ (commas o map (quote o fst)) defs)
 | |
| 682 | fun ml_from_class (name, (supclasses, (v, membrs))) = | |
| 683 | let | |
| 684 | fun from_supclass class = | |
| 685 | Pretty.block [ | |
| 686 | ml_from_label class, | |
| 687 | str ":", | |
| 688 | Pretty.brk 1, | |
| 689 |             str ("'" ^ v),
 | |
| 690 | Pretty.brk 1, | |
| 691 | (str o resolv) class | |
| 692 | ]; | |
| 693 | fun from_membr (m, (_, ty)) = | |
| 694 | Pretty.block [ | |
| 695 | ml_from_label m, | |
| 696 | str ":", | |
| 697 | Pretty.brk 1, | |
| 698 | ml_from_type NOBR ty | |
| 699 | ]; | |
| 700 | fun from_membr_fun (m, _) = | |
| 701 | (Pretty.block o Pretty.breaks) [ | |
| 702 | str "fun", | |
| 703 | (str o resolv) m, | |
| 704 |             Pretty.enclose "(" ")" [str (v ^ ":'" ^ v ^ " " ^ resolv name)],
 | |
| 705 | str "=", | |
| 706 | Pretty.block [str "#", ml_from_label m], | |
| 707 | str (v ^ ";") | |
| 708 | ]; | |
| 709 | in | |
| 710 | Pretty.chunks ( | |
| 711 | (Pretty.block o Pretty.breaks) [ | |
| 712 | str "type", | |
| 713 |             str ("'" ^ v),
 | |
| 714 | (str o resolv) name, | |
| 715 | str "=", | |
| 716 |             Pretty.enum "," "{" "};" (
 | |
| 717 | map from_supclass supclasses @ map from_membr membrs | |
| 718 | ) | |
| 719 | ] | |
| 720 | :: map from_membr_fun membrs) | |
| 721 | end | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 722 | fun ml_from_def (name, CodegenThingol.Undef) = | 
| 18702 | 723 |           error ("empty definition during serialization: " ^ quote name)
 | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 724 | | ml_from_def (name, CodegenThingol.Prim prim) = | 
| 18963 | 725 | from_prim resolv (name, prim) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 726 | | ml_from_def (name, CodegenThingol.Typesyn (vs, ty)) = | 
| 18865 | 727 | (map (fn (vname, []) => () | _ => | 
| 728 | error "can't serialize sort constrained type declaration to ML") vs; | |
| 18702 | 729 | Pretty.block [ | 
| 730 | str "type ", | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 731 | ml_from_tycoexpr NOBR (name, map (ITyVar o fst) vs), | 
| 18702 | 732 | str " =", | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 733 | Pretty.brk 1, | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 734 | ml_from_type NOBR ty, | 
| 18702 | 735 | str ";" | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 736 | ] | 
| 18702 | 737 | ) |> SOME | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 738 | | ml_from_def (name, CodegenThingol.Classinst (((class, (tyco, arity)), suparities), memdefs)) = | 
| 18865 | 739 | let | 
| 740 | val definer = if null arity then "val" else "fun" | |
| 19136 | 741 | fun from_supclass (supclass, (supinst, lss)) = | 
| 18885 | 742 | (Pretty.block o Pretty.breaks) ( | 
| 743 | ml_from_label supclass | |
| 744 | :: str "=" | |
| 19136 | 745 | :: (str o resolv) supinst | 
| 19280 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 746 | :: (if null lss andalso (not o null) arity | 
| 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 747 | then [str "()"] | 
| 
5091dc43817b
slight improvement in serializer, stub for code generator theorems added
 haftmann parents: 
19253diff
changeset | 748 | else map (ml_from_sortlookup NOBR) lss) | 
| 18885 | 749 | ); | 
| 19253 | 750 | fun from_memdef (m, ((m', def), lss)) = | 
| 19213 | 751 | (ml_from_funs [(m', def)], (Pretty.block o Pretty.breaks) ( | 
| 19136 | 752 | ml_from_label m | 
| 753 | :: str "=" | |
| 19213 | 754 | :: (str o resolv) m' | 
| 19253 | 755 | :: map (ml_from_sortlookup NOBR) lss | 
| 19136 | 756 | )); | 
| 19253 | 757 | fun mk_corp rhs = | 
| 758 | (Pretty.block o Pretty.breaks) ( | |
| 759 | str definer | |
| 760 | :: (str o resolv) name | |
| 761 | :: map ml_from_tyvar arity | |
| 762 | @ [str "=", rhs] | |
| 763 | ); | |
| 18865 | 764 | fun mk_memdefs supclassexprs [] = | 
| 765 |                   Pretty.enum "," "{" "};" (
 | |
| 766 | supclassexprs | |
| 19253 | 767 | ) |> mk_corp | 
| 18865 | 768 | | mk_memdefs supclassexprs memdefs = | 
| 769 | let | |
| 770 | val (defs, assigns) = (split_list o map from_memdef) memdefs; | |
| 771 | in | |
| 772 | Pretty.chunks [ | |
| 19253 | 773 | Pretty.block [ | 
| 774 | str "local", | |
| 775 | Pretty.fbrk, | |
| 776 | Pretty.chunks defs | |
| 777 | ], | |
| 778 | Pretty.block [str "in", Pretty.brk 1, | |
| 779 | (mk_corp o Pretty.block o Pretty.breaks) [ | |
| 780 |                           Pretty.enum "," "{" "}" (supclassexprs @ assigns),
 | |
| 781 | str ":", | |
| 782 | ml_from_tycoexpr NOBR (class, [tyco `%% map (ITyVar o fst) arity]) | |
| 783 | ] | |
| 784 | ], | |
| 785 | str "end; (* instance *)" | |
| 786 | ] | |
| 18865 | 787 | end; | 
| 788 | in | |
| 19253 | 789 | mk_memdefs (map from_supclass suparities) memdefs |> SOME | 
| 19213 | 790 | end | 
| 791 | | ml_from_def (name, CodegenThingol.Classinstmember) = NONE; | |
| 18850 | 792 | in case defs | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 793 | of (_, CodegenThingol.Fun _)::_ => (SOME o ml_from_funs o map (fn (name, CodegenThingol.Fun info) => (name, info))) defs | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 794 | | (_, CodegenThingol.Datatypecons _)::_ => (SOME o ml_from_datatypes o filter_datatype) defs | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 795 | | (_, CodegenThingol.Datatype _)::_ => (SOME o ml_from_datatypes o filter_datatype) defs | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 796 | | (_, CodegenThingol.Class _)::_ => (SOME o ml_from_class o filter_class) defs | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 797 | | (_, CodegenThingol.Classmember _)::_ => (SOME o ml_from_class o filter_class) defs | 
| 18850 | 798 | | [def] => ml_from_def def | 
| 19136 | 799 |     | defs => error ("illegal mutual dependencies: " ^ (commas o map fst) defs)
 | 
| 18216 | 800 | end; | 
| 801 | ||
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 802 | fun ml_annotators (nsp_dtcon, nsp_class, is_int_tyco) = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 803 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 804 | fun needs_type tyco = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 805 | CodegenThingol.has_nsp tyco nsp_class | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 806 | orelse is_int_tyco tyco; | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 807 | fun is_cons c = CodegenThingol.has_nsp c nsp_dtcon; | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 808 | in (is_cons, needs_type) end; | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 809 | |
| 18216 | 810 | in | 
| 811 | ||
| 18865 | 812 | fun ml_from_thingol target (nsp_dtcon, nsp_class, is_int_tyco) nspgrp = | 
| 18216 | 813 | let | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 814 | fun ml_from_module resolv _ ((_, name), ps) = | 
| 18756 | 815 | Pretty.chunks ([ | 
| 18702 | 816 |         str ("structure " ^ name ^ " = "),
 | 
| 817 | str "struct", | |
| 818 | str "" | |
| 819 | ] @ separate (str "") ps @ [ | |
| 820 | str "", | |
| 821 |         str ("end; (* struct " ^ name ^ " *)")
 | |
| 18756 | 822 | ]); | 
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 823 | val (is_cons, needs_type) = ml_annotators (nsp_dtcon, nsp_class, is_int_tyco); | 
| 18756 | 824 | val serializer = abstract_serializer (target, nspgrp) | 
| 18919 | 825 | "ROOT" (ml_from_defs (is_cons, needs_type), ml_from_module, | 
| 826 | abstract_validator reserved_ml, snd); | |
| 18756 | 827 | fun eta_expander module const_syntax s = | 
| 18702 | 828 | case const_syntax s | 
| 829 | of SOME ((i, _), _) => i | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 830 | | _ => if CodegenThingol.has_nsp s nsp_dtcon | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 831 | then case CodegenThingol.get_def module s | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 832 | of CodegenThingol.Datatypecons dtname => | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 833 | case CodegenThingol.get_def module dtname | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 834 | of CodegenThingol.Datatype (_, cs) => | 
| 18702 | 835 | let val l = AList.lookup (op =) cs s |> the |> length | 
| 836 | in if l >= 2 then l else 0 end | |
| 837 | else 0; | |
| 18756 | 838 | fun preprocess const_syntax module = | 
| 18702 | 839 | module | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 840 | |> debug_msg (fn _ => "eta-expanding...") | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 841 | |> CodegenThingol.eta_expand (eta_expander module const_syntax) | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 842 | |> debug_msg (fn _ => "eta-expanding polydefs...") | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 843 | |> CodegenThingol.eta_expand_poly | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 844 | (*|> debug 3 (fn _ => "unclashing expression/type variables...") | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 845 | |> CodegenThingol.unclash_vars_tvars*); | 
| 18850 | 846 | val parse_multi = | 
| 847 | OuterParse.name | |
| 848 | #-> (fn "dir" => | |
| 849 | parse_multi_file | |
| 850 | (K o SOME o str o suffix ";" o prefix "val _ = use " | |
| 851 | o quote o suffix ".ML" o translate_string (fn "." => "/" | s => s)) "ML" serializer | |
| 852 | | _ => Scan.fail ()); | |
| 18282 | 853 | in | 
| 18850 | 854 | (parse_multi | 
| 855 | || parse_internal serializer | |
| 856 | || parse_single_file serializer) | |
| 18865 | 857 | >> (fn seri => fn (class_syntax, tyco_syntax, const_syntax) => seri | 
| 858 | (preprocess const_syntax) (class_syntax, tyco_syntax, const_syntax)) | |
| 18216 | 859 | end; | 
| 860 | ||
| 19150 | 861 | fun mk_flat_ml_resolver names = | 
| 862 | let | |
| 863 | val mangler = | |
| 864 | NameMangler.empty | |
| 865 | |> fold_map (NameMangler.declare reserved_ml) names | |
| 866 | |-> (fn _ => I) | |
| 867 | in NameMangler.get reserved_ml mangler end; | |
| 868 | ||
| 19042 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 869 | fun ml_fun_datatype (nsp_dtcon, nsp_class, is_int_tyco) = | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 870 | ml_fun_datatyp (ml_annotators (nsp_dtcon, nsp_class, is_int_tyco)); | 
| 
630b8dd0b31a
exported some interfaces useful for other code generator approaches
 haftmann parents: 
19038diff
changeset | 871 | |
| 18216 | 872 | end; (* local *) | 
| 873 | ||
| 18282 | 874 | local | 
| 875 | ||
| 18963 | 876 | fun hs_from_defs with_typs (from_prim, (class_syntax, tyco_syntax, const_syntax)) | 
| 19038 | 877 | resolver prefix defs = | 
| 18282 | 878 | let | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 879 | val resolv = resolver ""; | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 880 | val resolv_here = resolver prefix; | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 881 | fun hs_from_sctxt vs = | 
| 18282 | 882 | let | 
| 18865 | 883 | fun from_class cls = | 
| 18919 | 884 | class_syntax cls | 
| 885 | |> the_default (resolv cls) | |
| 18702 | 886 | fun from_sctxt [] = str "" | 
| 18282 | 887 | | from_sctxt vs = | 
| 888 | vs | |
| 18919 | 889 | |> map (fn (v, cls) => str (from_class cls ^ " " ^ v)) | 
| 18812 | 890 |               |> Pretty.enum "," "(" ")"
 | 
| 18702 | 891 | |> (fn p => Pretty.block [p, str " => "]) | 
| 18282 | 892 | in | 
| 893 | vs | |
| 894 | |> map (fn (v, sort) => map (pair v) sort) | |
| 19466 | 895 | |> flat | 
| 18282 | 896 | |> from_sctxt | 
| 897 | end; | |
| 18963 | 898 | fun hs_from_tycoexpr fxy (tyco, tys) = | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 899 | brackify fxy (str tyco :: map (hs_from_type BR) tys) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 900 | and hs_from_type fxy (tycoexpr as tyco `%% tys) = | 
| 18865 | 901 | (case tyco_syntax tyco | 
| 18335 | 902 | of NONE => | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 903 | hs_from_tycoexpr fxy (resolv tyco, tys) | 
| 18702 | 904 | | SOME ((i, k), pr) => | 
| 18865 | 905 | if not (i <= length tys andalso length tys <= k) | 
| 18702 | 906 |                 then error ("number of argument mismatch in customary serialization: "
 | 
| 18865 | 907 | ^ (string_of_int o length) tys ^ " given, " | 
| 908 | ^ string_of_int i ^ " to " ^ string_of_int k | |
| 18702 | 909 | ^ " expected") | 
| 18865 | 910 | else pr fxy hs_from_type tys) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 911 | | hs_from_type fxy (t1 `-> t2) = | 
| 18865 | 912 | brackify_infix (1, R) fxy [ | 
| 913 | hs_from_type (INFX (1, X)) t1, | |
| 914 | str "->", | |
| 915 | hs_from_type (INFX (1, R)) t2 | |
| 916 | ] | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 917 | | hs_from_type fxy (ITyVar v) = | 
| 18919 | 918 | str v; | 
| 18963 | 919 | fun hs_from_sctxt_tycoexpr (sctxt, tycoexpr) = | 
| 920 | Pretty.block [hs_from_sctxt sctxt, hs_from_tycoexpr NOBR tycoexpr] | |
| 18865 | 921 | fun hs_from_sctxt_type (sctxt, ty) = | 
| 922 | Pretty.block [hs_from_sctxt sctxt, hs_from_type NOBR ty] | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 923 | fun hs_from_expr fxy (e as IConst x) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 924 | hs_from_app fxy (x, []) | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 925 | | hs_from_expr fxy (e as (e1 `$ e2)) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 926 | (case CodegenThingol.unfold_const_app e | 
| 18865 | 927 | of SOME x => hs_from_app fxy x | 
| 18282 | 928 | | _ => | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 929 | brackify fxy [ | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 930 | hs_from_expr NOBR e1, | 
| 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 931 | hs_from_expr BR e2 | 
| 18282 | 932 | ]) | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 933 | | hs_from_expr fxy (IVar v) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 934 | (str o String.implode o nth_map 0 Char.toLower o String.explode) v | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 935 | | hs_from_expr fxy (e as _ `|-> _) = | 
| 18282 | 936 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 937 | val (es, e) = CodegenThingol.unfold_abs e | 
| 18282 | 938 | in | 
| 19038 | 939 | brackify BR ( | 
| 18702 | 940 | str "\\" | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 941 | :: map (hs_from_expr BR o fst) es @ [ | 
| 18702 | 942 | str "->", | 
| 19038 | 943 | hs_from_expr NOBR e | 
| 18282 | 944 | ]) | 
| 945 | end | |
| 19213 | 946 | | hs_from_expr fxy (INum ((n, ty), _)) = | 
| 947 | brackify BR [ | |
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 948 | (str o (fn s => if nth_string s 0 = "~" | 
| 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 949 |               then enclose "(" ")" ("negate " ^ unprefix "~" s) else s) o IntInf.toString) n,
 | 
| 19213 | 950 | str "::", | 
| 951 | hs_from_type NOBR ty | |
| 952 | ] | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 953 | | hs_from_expr fxy (e as IAbs _) = | 
| 18282 | 954 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 955 | val (es, e) = CodegenThingol.unfold_abs e | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 956 | in | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 957 | brackify BR ( | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 958 | str "\\" | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 959 | :: map (hs_from_expr BR o fst) es @ [ | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 960 | str "->", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 961 | hs_from_expr NOBR e | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 962 | ]) | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 963 | end | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 964 | | hs_from_expr fxy (e as ICase ((_, [_]), _)) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 965 | let | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 966 | val (ps, body) = CodegenThingol.unfold_let e; | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 967 | fun mk_bind ((p, _), e) = (Pretty.block o Pretty.breaks) [ | 
| 18865 | 968 | hs_from_expr BR p, | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 969 | str "=", | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 970 | hs_from_expr NOBR e | 
| 18282 | 971 | ]; | 
| 972 | in Pretty.chunks [ | |
| 18702 | 973 |             [str ("let"), Pretty.fbrk, map mk_bind ps |> Pretty.chunks] |> Pretty.block,
 | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 974 |             [str ("in "), hs_from_expr NOBR body] |> Pretty.block
 | 
| 18282 | 975 | ] end | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 976 | | hs_from_expr fxy (ICase (((de, _), bses), _)) = | 
| 18282 | 977 | let | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 978 | fun mk_clause (se, be) = | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 979 | (Pretty.block o Pretty.breaks) [ | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 980 | hs_from_expr NOBR se, | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 981 | str "->", | 
| 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 982 | hs_from_expr NOBR be | 
| 18282 | 983 | ] | 
| 18850 | 984 | in Pretty.block [ | 
| 985 | str "case", | |
| 986 | Pretty.brk 1, | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 987 | hs_from_expr NOBR de, | 
| 18850 | 988 | Pretty.brk 1, | 
| 989 | str "of", | |
| 990 | Pretty.fbrk, | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 991 | (Pretty.chunks o map mk_clause) bses | 
| 18850 | 992 | ] end | 
| 18865 | 993 | and hs_mk_app c es = | 
| 18919 | 994 | (str o resolv) c :: map (hs_from_expr BR) es | 
| 19202 | 995 | and hs_from_app fxy ((c, (ty, ls)), es) = | 
| 19136 | 996 | from_app hs_mk_app hs_from_expr const_syntax fxy ((c, ty), es); | 
| 19202 | 997 | fun hs_from_funeqs (def as (name, _)) = | 
| 18865 | 998 | let | 
| 19202 | 999 | fun from_eq (args, rhs) = | 
| 18865 | 1000 | Pretty.block [ | 
| 19038 | 1001 | (str o resolv_here) name, | 
| 18865 | 1002 | Pretty.block (map (fn p => Pretty.block [Pretty.brk 1, hs_from_expr BR p]) args), | 
| 1003 | Pretty.brk 1, | |
| 1004 |             str ("="),
 | |
| 1005 | Pretty.brk 1, | |
| 1006 | hs_from_expr NOBR rhs | |
| 1007 | ] | |
| 19202 | 1008 | in Pretty.chunks ((map from_eq o fst o snd o constructive_fun) def) end; | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1009 | fun hs_from_def (name, CodegenThingol.Undef) = | 
| 18702 | 1010 |           error ("empty statement during serialization: " ^ quote name)
 | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1011 | | hs_from_def (name, CodegenThingol.Prim prim) = | 
| 19038 | 1012 | from_prim resolv_here (name, prim) | 
| 19202 | 1013 | | hs_from_def (name, CodegenThingol.Fun (def as (_, (sctxt, ty)))) = | 
| 18963 | 1014 | let | 
| 19202 | 1015 | val body = hs_from_funeqs (name, def); | 
| 18963 | 1016 | in if with_typs then | 
| 1017 | Pretty.chunks [ | |
| 1018 | Pretty.block [ | |
| 19038 | 1019 | (str o suffix " ::" o resolv_here) name, | 
| 18963 | 1020 | Pretty.brk 1, | 
| 1021 | hs_from_sctxt_type (sctxt, ty) | |
| 1022 | ], | |
| 1023 | body | |
| 1024 | ] |> SOME | |
| 1025 | else SOME body end | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1026 | | hs_from_def (name, CodegenThingol.Typesyn (sctxt, ty)) = | 
| 18282 | 1027 | Pretty.block [ | 
| 18702 | 1028 | str "type ", | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1029 | hs_from_sctxt_tycoexpr (sctxt, (resolv_here name, map (ITyVar o fst) sctxt)), | 
| 18702 | 1030 | str " =", | 
| 18282 | 1031 | Pretty.brk 1, | 
| 18865 | 1032 | hs_from_sctxt_type ([], ty) | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1033 | ] |> SOME | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1034 | | hs_from_def (name, CodegenThingol.Datatype (sctxt, constrs)) = | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1035 | let | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1036 | fun mk_cons (co, tys) = | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1037 | (Pretty.block o Pretty.breaks) ( | 
| 19038 | 1038 | (str o resolv_here) co | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 1039 | :: map (hs_from_type NOBR) tys | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1040 | ) | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1041 | in | 
| 18865 | 1042 | Pretty.block (( | 
| 18702 | 1043 | str "data " | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1044 | :: hs_from_sctxt_tycoexpr (sctxt, (resolv_here name, map (ITyVar o fst) sctxt)) | 
| 18702 | 1045 | :: str " =" | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1046 | :: Pretty.brk 1 | 
| 18702 | 1047 | :: separate (Pretty.block [Pretty.brk 1, str "| "]) (map mk_cons constrs) | 
| 18865 | 1048 | ) @ [ | 
| 1049 | Pretty.brk 1, | |
| 1050 | str "deriving Show" | |
| 1051 | ]) | |
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1052 | end |> SOME | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1053 | | hs_from_def (_, CodegenThingol.Datatypecons _) = | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1054 | NONE | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1055 | | hs_from_def (name, CodegenThingol.Class (supclasss, (v, membrs))) = | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1056 | let | 
| 18865 | 1057 | fun mk_member (m, (sctxt, ty)) = | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1058 | Pretty.block [ | 
| 19038 | 1059 | str (resolv_here m ^ " ::"), | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1060 | Pretty.brk 1, | 
| 18865 | 1061 | hs_from_sctxt_type (sctxt, ty) | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1062 | ] | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1063 | in | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1064 | Pretty.block [ | 
| 18702 | 1065 | str "class ", | 
| 19213 | 1066 | hs_from_sctxt [(v, supclasss)], | 
| 19038 | 1067 | str (resolv_here name ^ " " ^ v), | 
| 18702 | 1068 | str " where", | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1069 | Pretty.fbrk, | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1070 | Pretty.chunks (map mk_member membrs) | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1071 | ] |> SOME | 
| 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1072 | end | 
| 19213 | 1073 | | hs_from_def (_, CodegenThingol.Classmember _) = | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1074 | NONE | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1075 | | hs_from_def (_, CodegenThingol.Classinst (((clsname, (tyco, arity)), _), memdefs)) = | 
| 18385 | 1076 | Pretty.block [ | 
| 18702 | 1077 | str "instance ", | 
| 19213 | 1078 | hs_from_sctxt arity, | 
| 1079 | str (resolv clsname ^ " "), | |
| 1080 | hs_from_type BR (tyco `%% map (ITyVar o fst) arity), | |
| 18702 | 1081 | str " where", | 
| 18385 | 1082 | Pretty.fbrk, | 
| 19253 | 1083 | Pretty.chunks (map (fn (m, ((_, (eqs, ty)), _)) => hs_from_funeqs (m, (eqs, ty))) memdefs) | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1084 | ] |> SOME | 
| 19213 | 1085 | | hs_from_def (_, CodegenThingol.Classinstmember) = | 
| 1086 | NONE | |
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1087 | in | 
| 19482 
9f11af8f7ef9
tuned basic list operators (flat, maps, map_filter);
 wenzelm parents: 
19466diff
changeset | 1088 | case map_filter (fn (name, def) => hs_from_def (name, def)) defs | 
| 18380 
9668764224a7
substantial improvements for class code generation
 haftmann parents: 
18361diff
changeset | 1089 | of [] => NONE | 
| 18702 | 1090 | | l => (SOME o Pretty.chunks o separate (str "")) l | 
| 18282 | 1091 | end; | 
| 1092 | ||
| 1093 | in | |
| 1094 | ||
| 18919 | 1095 | fun hs_from_thingol target nsps_upper nspgrp = | 
| 18282 | 1096 | let | 
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 1097 | val reserved_hs = [ | 
| 18702 | 1098 | "hiding", "deriving", "where", "case", "of", "infix", "infixl", "infixr", | 
| 1099 | "import", "default", "forall", "let", "in", "class", "qualified", "data", | |
| 1100 | "newtype", "instance", "if", "then", "else", "type", "as", "do", "module" | |
| 1101 | ] @ [ | |
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1102 | "Bool", "Integer", "Maybe", "True", "False", "Nothing", "Just", "not", "negate" | 
| 18702 | 1103 | ]; | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 1104 | fun hs_from_module resolv imps ((_, name), ps) = | 
| 19038 | 1105 | (Pretty.chunks) ( | 
| 1106 |         str ("module " ^ name ^ " where")
 | |
| 1107 | :: map (str o prefix "import qualified ") imps @ ( | |
| 1108 | str "" | |
| 1109 | :: separate (str "") ps | |
| 1110 | )); | |
| 18919 | 1111 | fun postproc (shallow, n) = | 
| 1112 | let | |
| 1113 | fun ch_first f = String.implode o nth_map 0 f o String.explode; | |
| 1114 | in if member (op =) nsps_upper shallow | |
| 1115 | then ch_first Char.toUpper n | |
| 1116 | else ch_first Char.toLower n | |
| 1117 | end; | |
| 18963 | 1118 | fun serializer with_typs = abstract_serializer (target, nspgrp) | 
| 1119 | "Main" (hs_from_defs with_typs, hs_from_module, abstract_validator reserved_hs, postproc); | |
| 18756 | 1120 | fun eta_expander const_syntax c = | 
| 18702 | 1121 | const_syntax c | 
| 1122 | |> Option.map (fst o fst) | |
| 1123 | |> the_default 0; | |
| 18756 | 1124 | fun preprocess const_syntax module = | 
| 18702 | 1125 | module | 
| 19341 
3414c04fbc39
added definitional code generator module: codegen_theorems.ML
 haftmann parents: 
19280diff
changeset | 1126 | |> debug_msg (fn _ => "eta-expanding...") | 
| 19167 
f237c0cb3882
refined representation of codegen intermediate language
 haftmann parents: 
19150diff
changeset | 1127 | |> CodegenThingol.eta_expand (eta_expander const_syntax) | 
| 18282 | 1128 | in | 
| 18963 | 1129 | (Scan.optional (OuterParse.name >> (fn "no_typs" => false | s => Scan.fail_with (fn _ => "illegal flag: " ^ quote s) true)) true | 
| 1130 | #-> (fn with_typs => parse_multi_file ((K o K) NONE) "hs" (serializer with_typs))) | |
| 1131 | >> (fn (seri) => fn (class_syntax, tyco_syntax, const_syntax) => seri | |
| 18865 | 1132 | (preprocess const_syntax) (class_syntax, tyco_syntax, const_syntax)) | 
| 18282 | 1133 | end; | 
| 1134 | ||
| 1135 | end; (* local *) | |
| 1136 | ||
| 18702 | 1137 | |
| 1138 | (** lookup record **) | |
| 1139 | ||
| 1140 | val serializers = | |
| 1141 | let | |
| 1142 | fun seri s f = (s, f s); | |
| 1143 |   in {
 | |
| 1144 | ml = seri "ml" ml_from_thingol, | |
| 18704 
2c86ced392a8
substantial improvement in serialization handling
 haftmann parents: 
18702diff
changeset | 1145 | haskell = seri "haskell" hs_from_thingol | 
| 18702 | 1146 | } end; | 
| 1147 | ||
| 18216 | 1148 | end; (* struct *) |