src/Pure/Tools/codegen_serializer.ML
author haftmann
Fri, 09 Dec 2005 15:25:52 +0100
changeset 18380 9668764224a7
parent 18361 3126d01e9e35
child 18385 d0071d93978e
permissions -rw-r--r--
substantial improvements for class code generation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
     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
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    11
  type primitives;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    12
  val empty_prims: primitives;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    13
  val add_prim: string * (string * string list) -> primitives -> primitives;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    14
  val merge_prims: primitives * primitives -> primitives;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    15
  val has_prim: primitives -> string -> bool;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    16
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    17
  type 'a pretty_syntax = string
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    18
    -> (int * (Pretty.T list -> ('a -> Pretty.T) -> Pretty.T)) option;
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    19
  type serializer = CodegenThingol.itype pretty_syntax -> CodegenThingol.iexpr pretty_syntax
18217
e0b08c9534ff added codegen package
haftmann
parents: 18216
diff changeset
    20
    -> primitives -> string list option -> CodegenThingol.module -> Pretty.T;
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    21
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    22
  val ml_from_thingol: string list list -> string -> serializer;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
    23
  val haskell_from_thingol: string list list -> string -> serializer;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    24
end;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    25
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    26
structure CodegenSerializer: CODEGEN_SERIALIZER =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    27
struct
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    28
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    29
open CodegenThingol;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    30
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    31
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    32
(** target language primitives **)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    33
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    34
type primitives = string Graph.T;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    35
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    36
val empty_prims = Graph.empty;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    37
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    38
fun add_prim (f, (def, deps)) prims =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    39
  prims
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    40
  |> Graph.new_node (f, def)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    41
  |> fold (fn dep => Graph.add_edge (f, dep)) deps;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    42
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    43
val merge_prims = Graph.merge (op =) : primitives * primitives -> primitives;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    44
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    45
val has_prim : primitives -> string -> bool = can o Graph.get_node;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    46
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    47
fun get_prims prims defs =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    48
  defs
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    49
  |> filter (can (Graph.get_node prims))
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    50
  |> `I
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    51
  ||> Graph.all_succs prims
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    52
  ||> (fn gr => Graph.subgraph gr prims)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    53
  ||> Graph.strong_conn
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    54
  ||> rev
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    55
  ||> Library.flat
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    56
  ||> map (Graph.get_node prims)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    57
  ||> separate ""
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    58
  ||> cat_lines
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    59
  ||> suffix "\n";
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    60
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    61
fun mk_prims prims = get_prims prims (Graph.keys prims) |> snd;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    62
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    63
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    64
(** keyword arguments **)
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    65
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    66
type kw = (string * string option) list;
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    67
fun kw_make args =
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    68
  let
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    69
    val parse_keyval = ();
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    70
  in
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    71
    Args.!!! (Scan.repeat (
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    72
      Args.name
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    73
      -- Scan.option (Args.$$$ "=" |-- Args.name)
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    74
    ) #> fst) args
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    75
  end;
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    76
fun kw_get k kw =
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    77
  ((the o AList.lookup (op =) kw) k, AList.delete (op =) k kw);
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    78
fun kw_has kw k =
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    79
  AList.defined (op =) kw k;
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    80
fun kw_done x [] = x
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    81
  | kw_done x kw =
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    82
      error ("uninterpreted keyword arguments: " ^ (commas o map (quote o fst)) kw);
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    83
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    84
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    85
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    86
(** generic serialization **)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    87
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    88
type 'a pretty_syntax = string
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    89
  -> (int * (Pretty.T list -> ('a -> Pretty.T) -> Pretty.T)) option;
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
    90
type serializer = CodegenThingol.itype pretty_syntax -> CodegenThingol.iexpr pretty_syntax
18217
e0b08c9534ff added codegen package
haftmann
parents: 18216
diff changeset
    91
  -> primitives -> string list option -> CodegenThingol.module -> Pretty.T;
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    92
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    93
datatype lrx = L | R | X;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    94
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    95
datatype brack =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    96
    BR
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    97
  | NOBR
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    98
  | INFX of (int * lrx);
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
    99
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   100
fun eval_lrx L L = false
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   101
  | eval_lrx R R = false
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   102
  | eval_lrx _ _ = true;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   103
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   104
fun eval_br BR _ = true
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   105
  | eval_br NOBR _ = false
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   106
  | eval_br (INFX (pr1, lr1)) (INFX (pr2, lr2)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   107
      pr1 > pr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   108
      orelse pr1 = pr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   109
      andalso eval_lrx lr1 lr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   110
  | eval_br (INFX _) _ = false;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   111
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   112
fun eval_br_postfix BR _ = false
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   113
  | eval_br_postfix NOBR _ = false
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   114
  | eval_br_postfix (INFX (pr1, lr1)) (INFX (pr2, lr2)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   115
      pr1 > pr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   116
      orelse pr1 = pr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   117
      andalso eval_lrx lr1 lr2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   118
  | eval_br_postfix (INFX _) _ = false;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   119
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   120
fun brackify _ [p] = p
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   121
  | brackify true (ps as _::_) = Pretty.enclose "(" ")" (Pretty.breaks ps)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   122
  | brackify false (ps as _::_) = Pretty.block (Pretty.breaks ps);
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   123
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   124
fun postify [] f = [f]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   125
  | postify [p] f = [p, Pretty.brk 1, f]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   126
  | postify (ps as _::_) f = [Pretty.list "(" ")" ps, Pretty.brk 1, f];
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   127
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   128
fun upper_first s =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   129
  let
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   130
    val (pr, b) = split_last (NameSpace.unpack s);
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   131
    val (c::cs) = String.explode b;
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   132
  in NameSpace.pack (pr @ [String.implode (Char.toUpper c :: cs)]) end;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   133
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   134
fun lower_first s =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   135
  let
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   136
    val (pr, b) = split_last (NameSpace.unpack s);
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   137
    val (c::cs) = String.explode b;
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   138
  in NameSpace.pack (pr @ [String.implode (Char.toLower c :: cs)]) end;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   139
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   140
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   141
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   142
(** ML serializer **)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   143
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   144
local
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   145
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   146
fun ml_from_defs tyco_syntax const_syntax resolv ds =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   147
  let
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   148
    fun chunk_defs ps =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   149
      let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   150
        val (p_init, p_last) = split_last ps
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   151
      in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   152
        Pretty.chunks (p_init @ [Pretty.block ([p_last, Pretty.str ";"])])
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   153
    end;
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   154
    val ml_label_uniq = translate_string (fn "_" => "__" | "." => "_" | c => c);
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   155
    fun ml_from_type br (IType ("Pair", [t1, t2])) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   156
          brackify (eval_br_postfix br (INFX (2, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   157
            ml_from_type (INFX (2, X)) t1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   158
            Pretty.str "*",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   159
            ml_from_type (INFX (2, X)) t2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   160
          ]
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   161
      | ml_from_type br (IType ("Bool", [])) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   162
          Pretty.str "bool"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   163
      | ml_from_type br (IType ("Integer", [])) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   164
          Pretty.str "IntInf.int"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   165
      | ml_from_type br (IType ("List", [ty])) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   166
          postify ([ml_from_type BR ty]) (Pretty.str "list")
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   167
          |> Pretty.block
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   168
      | ml_from_type br (IType (tyco, typs)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   169
          let
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   170
            val tyargs = (map (ml_from_type BR) typs)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   171
          in
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   172
            case tyco_syntax tyco
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   173
             of NONE =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   174
                  postify tyargs ((Pretty.str o resolv) tyco)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   175
                  |> Pretty.block
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   176
              | SOME (i, pr) =>
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   177
                  if i <> length (typs)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   178
                  then error "can only serialize strictly complete type applications to ML"
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   179
                  else pr tyargs (ml_from_type BR)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   180
          end
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   181
      | ml_from_type br (IFun (t1, t2)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   182
          brackify (eval_br_postfix br (INFX (1, R))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   183
            ml_from_type (INFX (1, X)) t1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   184
            Pretty.str "->",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   185
            ml_from_type (INFX (1, R)) t2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   186
          ]
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   187
      | ml_from_type _ (IVarT (v, [])) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   188
          Pretty.str ("'" ^ v)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   189
      | ml_from_type _ (IVarT (_, sort)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   190
          "cannot serialize sort constrained type variable to ML: " ^ commas sort |> error
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   191
      | ml_from_type _ (IDictT fs) =
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   192
          Pretty.gen_list "," "{" "}" (
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   193
            map (fn (f, ty) =>
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   194
              Pretty.block [Pretty.str (ml_label_uniq f ^ ": "), ml_from_type NOBR ty]) fs
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   195
          );
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   196
    fun ml_from_pat br (ICons (("True", []), _)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   197
          Pretty.str "true"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   198
      | ml_from_pat br (ICons (("False", []), _)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   199
          Pretty.str "false"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   200
      | ml_from_pat br (ICons (("Pair", [p1, p2]), _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   201
          Pretty.list "(" ")" [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   202
            ml_from_pat NOBR p1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   203
            ml_from_pat NOBR p2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   204
          ]
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   205
      | ml_from_pat br (ICons (("Nil", []), _)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   206
          Pretty.str "[]"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   207
      | ml_from_pat br (p as ICons (("Cons", _), _)) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   208
          let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   209
            fun dest_cons (ICons (("Cons", [ICons (("Pair", [p1, p2]), _)]), _)) = SOME (p1, p2)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   210
              | dest_cons p = NONE
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   211
          in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   212
            case unfoldr dest_cons p
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   213
             of (ps, (ICons (("Nil", []), _))) =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   214
                  ps
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   215
                  |> map (ml_from_pat NOBR)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   216
                  |> Pretty.list "[" "]"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   217
              | (ps, p) =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   218
                  (ps @ [p])
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   219
                  |> map (ml_from_pat (INFX (5, X)))
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   220
                  |> separate (Pretty.str "::")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   221
                  |> brackify (eval_br br (INFX (5, R)))
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   222
          end
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   223
      | ml_from_pat br (ICons ((f, ps), ty)) =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   224
          (case const_syntax f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   225
           of NONE =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   226
              ps
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   227
              |> map (ml_from_pat BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   228
              |> cons ((Pretty.str o resolv) f)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   229
              |> brackify (eval_br br BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   230
            | SOME (i, pr) =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   231
              if i = length ps
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   232
              then
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   233
                pr (map (ml_from_pat BR) ps) (ml_from_expr BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   234
              else
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   235
                error "number of argument mismatch in customary serialization")
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   236
      | ml_from_pat br (IVarP (v, IType ("Integer", []))) =
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   237
          brackify (eval_br br BR) [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   238
            Pretty.str v,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   239
            Pretty.str ":",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   240
            Pretty.str "IntInf.int"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   241
          ]
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   242
      | ml_from_pat br (IVarP (v, _)) =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   243
          Pretty.str v
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   244
    and ml_from_expr br (e as (IApp (IConst ("Cons", _), _))) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   245
          let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   246
            fun dest_cons (IApp (IConst ("Cons", _),
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   247
                  IApp (IApp (IConst ("Pair", _), e1), e2))) = SOME (e1, e2)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   248
              | dest_cons p = NONE
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   249
          in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   250
            case unfoldr dest_cons e
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   251
             of (es, (IConst ("Nil", _))) =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   252
                  es
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   253
                  |> map (ml_from_expr NOBR)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   254
                  |> Pretty.list "[" "]"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   255
              | (es, e) =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   256
                  (es @ [e])
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   257
                  |> map (ml_from_expr (INFX (5, X)))
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   258
                  |> separate (Pretty.str "::")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   259
                  |> brackify (eval_br br (INFX (5, R)))
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   260
          end
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   261
      | ml_from_expr br (e as IApp (e1, e2)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   262
          (case (unfold_app e)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   263
           of (e as (IConst (f, _)), es) =>
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   264
                ml_from_app br (f, es)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   265
            | _ =>
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   266
                brackify (eval_br br BR) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   267
                  ml_from_expr NOBR e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   268
                  ml_from_expr BR e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   269
                ])
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   270
      | ml_from_expr br (e as IConst (f, _)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   271
          ml_from_app br (f, [])
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   272
      | ml_from_expr br (IVarE (v, _)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   273
          Pretty.str v
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   274
      | ml_from_expr br (IAbs ((v, _), e)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   275
          brackify (eval_br br BR) [
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   276
            Pretty.str ("fn " ^ v ^ " =>"),
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   277
            ml_from_expr NOBR e
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   278
          ]
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   279
      | ml_from_expr br (e as ICase (_, [_])) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   280
          let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   281
            val (ps, e) = unfold_let e;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   282
            fun mk_val (p, e) = Pretty.block [
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   283
                Pretty.str "val ",
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   284
                ml_from_pat BR p,
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   285
                Pretty.str " =",
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   286
                Pretty.brk 1,
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   287
                ml_from_expr NOBR e,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   288
                Pretty.str ";"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   289
              ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   290
          in Pretty.chunks [
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   291
            [Pretty.str ("let"), Pretty.fbrk, map mk_val ps |> Pretty.chunks] |> Pretty.block,
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   292
            [Pretty.str ("in"), Pretty.fbrk, ml_from_expr NOBR e] |> Pretty.block,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   293
            Pretty.str ("end")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   294
          ] end
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   295
      | ml_from_expr br (ICase (e, c::cs)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   296
          let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   297
            fun mk_clause definer (p, e) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   298
              Pretty.block [
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   299
                Pretty.str definer,
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   300
                ml_from_pat NOBR p,
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   301
                Pretty.str " =>",
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   302
                Pretty.brk 1,
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   303
                ml_from_expr NOBR e
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   304
              ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   305
          in brackify (eval_br br BR) (
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   306
            Pretty.str "case"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   307
            :: ml_from_expr NOBR e
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   308
            :: mk_clause "of " c
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   309
            :: map (mk_clause "| ") cs
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   310
          ) end
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   311
      | ml_from_expr br (IInst _) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   312
          error "cannot serialize poly instant to ML"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   313
      | ml_from_expr br (IDictE fs) =
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   314
          Pretty.gen_list "," "{" "}" (
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   315
            map (fn (f, e) =>
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   316
              Pretty.block [Pretty.str (ml_label_uniq f ^ " = "), ml_from_expr NOBR e]) fs
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   317
          )
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   318
      | ml_from_expr br (ILookup ([], v)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   319
          Pretty.str v
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   320
      | ml_from_expr br (ILookup ([l], v)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   321
          brackify (eval_br br BR) [
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   322
            Pretty.str ("#" ^ (ml_label_uniq l)),
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   323
            Pretty.str v
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   324
          ]
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   325
      | ml_from_expr br (ILookup (ls, v)) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   326
          brackify (eval_br br BR) [
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   327
            Pretty.str ("("
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   328
              ^ (ls |> map ((fn s => "#" ^ s) o ml_label_uniq) |> foldr1 (fn (l, e) => l ^ " o " ^ e))
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   329
              ^ ")"),
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   330
            Pretty.str v
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   331
          ]
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   332
      | ml_from_expr _ e =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   333
          error ("dubious expression: " ^ (Pretty.output o pretty_iexpr) e)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   334
    and mk_app_p br p args =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   335
      brackify (eval_br br BR)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   336
        (p :: map (ml_from_expr BR) args)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   337
    and ml_from_app br ("Nil", []) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   338
          Pretty.str "[]"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   339
      | ml_from_app br ("True", []) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   340
          Pretty.str "true"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   341
      | ml_from_app br ("False", []) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   342
          Pretty.str "false"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   343
      | ml_from_app br ("primeq", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   344
          brackify (eval_br br (INFX (4, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   345
            ml_from_expr (INFX (4, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   346
            Pretty.str "=",
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   347
            ml_from_expr (INFX (4, X)) e2,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   348
            Pretty.str ":",
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   349
            ml_from_type NOBR (itype_of_iexpr e2)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   350
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   351
      | ml_from_app br ("Pair", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   352
          Pretty.list "(" ")" [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   353
            ml_from_expr NOBR e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   354
            ml_from_expr NOBR e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   355
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   356
      | ml_from_app br ("and", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   357
          brackify (eval_br br (INFX (~1, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   358
            ml_from_expr (INFX (~1, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   359
            Pretty.str "andalso",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   360
            ml_from_expr (INFX (~1, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   361
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   362
      | ml_from_app br ("or", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   363
          brackify (eval_br br (INFX (~2, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   364
            ml_from_expr (INFX (~2, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   365
            Pretty.str "orelse",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   366
            ml_from_expr (INFX (~2, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   367
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   368
      | ml_from_app br ("if", [b, e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   369
          brackify (eval_br br BR) [
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   370
            Pretty.str "if",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   371
            ml_from_expr NOBR b,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   372
            Pretty.str "then",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   373
            ml_from_expr NOBR e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   374
            Pretty.str "else",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   375
            ml_from_expr NOBR e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   376
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   377
      | ml_from_app br ("add", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   378
          brackify (eval_br br (INFX (6, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   379
            ml_from_expr (INFX (6, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   380
            Pretty.str "+",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   381
            ml_from_expr (INFX (6, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   382
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   383
      | ml_from_app br ("mult", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   384
          brackify (eval_br br (INFX (7, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   385
            ml_from_expr (INFX (7, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   386
            Pretty.str "+",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   387
            ml_from_expr (INFX (7, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   388
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   389
      | ml_from_app br ("lt", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   390
          brackify (eval_br br (INFX (4, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   391
            ml_from_expr (INFX (4, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   392
            Pretty.str "<",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   393
            ml_from_expr (INFX (4, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   394
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   395
      | ml_from_app br ("le", [e1, e2]) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   396
          brackify (eval_br br (INFX (7, L))) [
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   397
            ml_from_expr (INFX (4, L)) e1,
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   398
            Pretty.str "<=",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   399
            ml_from_expr (INFX (4, X)) e2
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   400
          ]
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   401
      | ml_from_app br ("minus", es) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   402
          mk_app_p br (Pretty.str "~") es
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   403
      | ml_from_app br ("wfrec", es) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   404
          mk_app_p br (Pretty.str "wfrec") es
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   405
      | ml_from_app br (f, es) =
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   406
          case const_syntax f
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   407
           of NONE =>
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   408
                (case es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   409
                 of [] => Pretty.str (resolv f)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   410
                  | es =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   411
                      let
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   412
                        val (es', e) = split_last es;
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   413
                      in mk_app_p br (ml_from_app NOBR (f, es')) [e] end)
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   414
            | SOME (i, pr) =>
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   415
                let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   416
                  val (es1, es2) = splitAt (i, es);
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   417
                in mk_app_p br (pr (map (ml_from_expr BR) es1) (ml_from_expr BR)) es2 end;
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   418
    fun ml_from_funs (ds as d::ds_tl) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   419
      let
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   420
        fun mk_definer [] = "val"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   421
          | mk_definer _ = "fun"
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   422
        fun check_args (_, Fun ((pats, _)::_, _)) NONE =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   423
              SOME (mk_definer pats)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   424
          | check_args (_, Fun ((pats, _)::_, _)) (SOME definer) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   425
              if mk_definer pats = definer
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   426
              then SOME definer
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   427
              else error ("mixing simultaneous vals and funs not implemented")
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   428
          | check_args _ _ =
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   429
              error ("function definition block containing other definitions than functions")
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   430
        val definer = the (fold check_args ds NONE);
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   431
        fun mk_eq definer f ty (pats, expr) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   432
          let
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   433
            val lhs = [Pretty.str (definer ^ " " ^ f)]
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   434
                       @ (if null pats
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   435
                          then [Pretty.str ":", ml_from_type NOBR ty]
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   436
                          else map (ml_from_pat BR) pats)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   437
            val rhs = [Pretty.str "=", ml_from_expr NOBR expr]
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   438
          in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   439
            Pretty.block (separate (Pretty.brk 1) (lhs @ rhs))
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   440
          end
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   441
        fun mk_fun definer (f, Fun (eqs as eq::eq_tl, (_, ty))) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   442
          let
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   443
            val (pats_hd::pats_tl) = (fst o split_list) eqs;
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   444
            val shift = if null eq_tl then I else map (Pretty.block o single);
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   445
          in (Pretty.block o Pretty.fbreaks o shift) (
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   446
               mk_eq definer f ty eq
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   447
               :: map (mk_eq "|" f ty) eq_tl
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   448
             )
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   449
          end;
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   450
      in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   451
        chunk_defs (
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   452
          mk_fun definer d
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   453
          :: map (mk_fun "and") ds_tl
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   454
        ) |> SOME
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   455
      end;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   456
    fun ml_from_datatypes defs =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   457
      let
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   458
        val defs' = List.mapPartial
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   459
          (fn (name, Datatype info) => SOME (name, info)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   460
            | (name, Datatypecons _) => NONE
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   461
            | (name, def) => error ("datatype block containing illegal def: " ^ (Pretty.output o pretty_def) def)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   462
          ) ds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   463
        fun praetify [] f = [f]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   464
          | praetify [p] f = [f, Pretty.str " of ", p]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   465
        fun mk_cons (co, typs) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   466
          (Pretty.block oo praetify)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   467
            (map (ml_from_type NOBR) typs)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   468
            (Pretty.str (resolv co))
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   469
        fun mk_datatype definer (t, (vs, cs, _)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   470
          Pretty.block (
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   471
            [Pretty.str definer]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   472
            @ postify (map (ml_from_type BR o IVarT) vs)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   473
                (Pretty.str (resolv t))
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   474
            @ [Pretty.str " =",
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   475
              Pretty.brk 1]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   476
            @ separate (Pretty.block [Pretty.brk 1, Pretty.str "| "]) (map mk_cons cs)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   477
          )
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   478
      in
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   479
        case defs'
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   480
         of d::ds_tl =>
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   481
            chunk_defs (
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   482
              mk_datatype "datatype " d
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   483
              :: map (mk_datatype "and ") ds_tl
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   484
            ) |> SOME
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   485
          | _ => NONE
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   486
      end;
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   487
    fun ml_from_def (name, Nop) =
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   488
          if exists (fn query => query name)
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   489
            [(fn name => (is_some o tyco_syntax) name),
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   490
             (fn name => (is_some o const_syntax) name)]
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   491
          then NONE
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   492
          else error ("empty statement during serialization: " ^ quote name)
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   493
      | ml_from_def (name, Typesyn (vs, ty)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   494
        (map (fn (vname, []) => () | _ => error "can't serialize sort constrained type declaration to ML") vs;
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   495
          Pretty.block (
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   496
            Pretty.str "type "
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   497
            :: postify (map (ml_from_type BR o IVarT) vs) (Pretty.str name)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   498
            @ [Pretty.str " =",
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   499
            Pretty.brk 1,
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   500
            ml_from_type NOBR ty,
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   501
            Pretty.str ";"
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   502
            ]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   503
          )) |> SOME
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   504
      | ml_from_def (name, Class _) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   505
          error ("can't serialize class declaration " ^ quote name ^ " to ML")
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   506
      | ml_from_def (_, Classmember _) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   507
          NONE
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   508
      | ml_from_def (name, Classinst _) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   509
          error ("can't serialize instance declaration " ^ quote name ^ " to ML")
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   510
  in (debug 10 (fn _ => "*** defs " ^ commas (map fst ds)) ();
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   511
  case ds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   512
   of (_, Fun _)::_ => ml_from_funs ds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   513
    | (_, Datatypecons _)::_ => ml_from_datatypes ds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   514
    | (_, Datatype _)::_ => ml_from_datatypes ds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   515
    | [d] => ml_from_def d)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   516
  end;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   517
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   518
in
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   519
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   520
fun ml_from_thingol nspgrp name_root tyco_syntax const_syntax prims select module =
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   521
  let
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   522
    fun ml_validator name =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   523
      let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   524
        fun replace_invalid c =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   525
          if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   526
          andalso not (NameSpace.separator = c)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   527
          then c
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   528
          else "_"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   529
        fun suffix_it name =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   530
          name
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   531
          |> member (op =) ThmDatabase.ml_reserved ? suffix "'"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   532
          |> member (op =) CodegenThingol.prims ? suffix "'"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   533
          |> has_prim prims ? suffix "'"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   534
          |> (fn name' => if name = name' then name else suffix_it name')
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   535
      in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   536
        name
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   537
        |> translate_string replace_invalid
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   538
        |> suffix_it
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   539
        |> (fn name' => if name = name' then NONE else SOME name')
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   540
      end;
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   541
    fun ml_from_module (name, ps) =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   542
      Pretty.chunks ([
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   543
        Pretty.str ("structure " ^ name ^ " = "),
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   544
        Pretty.str "struct",
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   545
        Pretty.str ""
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   546
      ] @ separate (Pretty.str "") ps @ [
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   547
        Pretty.str "",
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   548
        Pretty.str ("end; (* struct " ^ name ^ " *)")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   549
      ]);
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   550
    fun eta_expander "Pair" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   551
      | eta_expander "Cons" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   552
      | eta_expander "primeq" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   553
      | eta_expander "and" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   554
      | eta_expander "or" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   555
      | eta_expander "if" = 3
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   556
      | eta_expander "add" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   557
      | eta_expander "mult" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   558
      | eta_expander "lt" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   559
      | eta_expander "le" = 2
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   560
      | eta_expander s =
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   561
          if NameSpace.is_qualified s
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   562
          then case get_def module s
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   563
            of Datatypecons dtname =>
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   564
                (case get_def module dtname
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   565
                  of Datatype (_, cs, _) =>
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   566
                    let val l = AList.lookup (op =) cs s |> the |> length
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   567
                    in if l >= 2 then l else 0 end)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   568
             | _ =>
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   569
                const_syntax s
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   570
                |> Option.map fst
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   571
                |> the_default 0
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   572
          else 0
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   573
  in
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   574
    module
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   575
    |> debug 12 (Pretty.output o pretty_module)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   576
    |> debug 3 (fn _ => "selecting submodule...")
18217
e0b08c9534ff added codegen package
haftmann
parents: 18216
diff changeset
   577
    |> (if is_some select then (partof o the) select else I)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   578
    |> debug 3 (fn _ => "eta-expanding...")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   579
    |> eta_expand eta_expander
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   580
    |> debug 3 (fn _ => "eta-expanding polydefs...")
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   581
    |> eta_expand_poly
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   582
    |> debug 3 (fn _ => "tupelizing datatypes...")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   583
    |> tupelize_cons
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   584
    |> debug 3 (fn _ => "eliminating classes...")
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   585
    |> eliminate_classes
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   586
    |> debug 12 (Pretty.output o pretty_module)
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   587
    |> debug 3 (fn _ => "generating...")
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   588
    |> serialize (ml_from_defs tyco_syntax const_syntax) ml_from_module ml_validator nspgrp name_root
18361
3126d01e9e35 improved serialization of classes to haskell
haftmann
parents: 18360
diff changeset
   589
    |> (fn p => Pretty.chunks [setmp print_mode [] (Pretty.str o mk_prims) prims, p])
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   590
  end;
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   591
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   592
fun ml_from_thingol' nspgrp name_root =
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   593
  Scan.optional (
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   594
    OuterParse.$$$ "(" |-- OuterParse.list1 OuterParse.text --| OuterParse.$$$ ")"
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   595
  ) []
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   596
    >> (fn _ => ml_from_thingol nspgrp name_root);
2eea98bbf650 improved failure tracking
haftmann
parents: 18217
diff changeset
   597
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   598
(* ML infix precedence
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   599
   7 / * div mod
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   600
   6 + - ^
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   601
   5 :: @
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   602
   4 = <> < > <= >=
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   603
   3 := o *)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   604
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   605
end; (* local *)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
   606
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   607
local
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   608
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   609
fun haskell_from_defs tyco_syntax const_syntax is_cons resolv defs =
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   610
  let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   611
    val resolv = fn s =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   612
      let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   613
        val (prfix, base) = (split_last o NameSpace.unpack o resolv) s
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   614
      in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   615
        NameSpace.pack (map upper_first prfix @ [base])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   616
      end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   617
    fun resolv_const f =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   618
      if NameSpace.is_qualified f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   619
      then
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   620
        if is_cons f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   621
        then (upper_first o resolv) f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   622
        else (lower_first o resolv) f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   623
      else
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   624
        f;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   625
    fun haskell_from_sctxt vs =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   626
      let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   627
        fun from_sctxt [] = Pretty.str ""
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   628
          | from_sctxt vs =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   629
              vs
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   630
              |> map (fn (v, cls) => Pretty.str ((upper_first o resolv) cls ^ " " ^ lower_first v))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   631
              |> Pretty.gen_list "," "(" ")"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   632
              |> (fn p => Pretty.block [p, Pretty.str " => "])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   633
      in 
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   634
        vs
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   635
        |> map (fn (v, sort) => map (pair v) sort)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   636
        |> Library.flat
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   637
        |> from_sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   638
      end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   639
    fun haskell_from_type br ty =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   640
      let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   641
        fun from_itype br (IType ("Pair", [t1, t2])) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   642
              sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   643
              |> from_itype NOBR t1
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   644
              ||>> from_itype NOBR t2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   645
              |-> (fn (p1, p2) => pair (Pretty.gen_list "," "(" ")" [p1, p2]))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   646
          | from_itype br (IType ("List", [ty])) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   647
              sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   648
              |> from_itype NOBR ty
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   649
              |-> (fn p => pair (Pretty.enclose "[" "]" [p]))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   650
          | from_itype br (IType (tyco, tys)) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   651
              let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   652
                fun mk_itype NONE tyargs sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   653
                      sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   654
                      |> pair (brackify (eval_br br BR) ((Pretty.str o upper_first o resolv) tyco :: tyargs))
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   655
                  | mk_itype (SOME (i, pr)) tyargs sctxt =
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   656
                      if i <> length (tys)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   657
                      then error "can only serialize strictly complete type applications to haskell"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   658
                      else
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   659
                        sctxt
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   660
                        |> pair (pr tyargs (haskell_from_type BR))
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   661
              in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   662
                sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   663
                |> fold_map (from_itype BR) tys
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   664
                |-> mk_itype (tyco_syntax tyco)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   665
              end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   666
          | from_itype br (IFun (t1, t2)) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   667
              sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   668
              |> from_itype (INFX (1, X)) t1
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   669
              ||>> from_itype (INFX (1, R)) t2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   670
              |-> (fn (p1, p2) => pair (
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   671
                    brackify (eval_br br (INFX (1, R))) [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   672
                      p1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   673
                      Pretty.str "->",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   674
                      p2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   675
                    ]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   676
                  ))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   677
          | from_itype br (IVarT (v, [])) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   678
              sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   679
              |> pair ((Pretty.str o lower_first) v)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   680
          | from_itype br (IVarT (v, sort)) sctxt =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   681
              sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   682
              |> AList.default (op =) (v, [])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   683
              |> AList.map_entry (op =) v (fold (insert (op =)) sort)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   684
              |> pair ((Pretty.str o lower_first) v)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   685
          | from_itype br (IDictT _) _ =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   686
              error "cannot serialize dictionary type to haskell"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   687
      in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   688
        []
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   689
        |> from_itype br ty
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   690
        ||> haskell_from_sctxt
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   691
        |> (fn (pty, pctxt) => Pretty.block [pctxt, pty])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   692
      end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   693
    fun haskell_from_pat br (ICons (("Pair", [p1, p2]), _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   694
          Pretty.list "(" ")" [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   695
            haskell_from_pat NOBR p1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   696
            haskell_from_pat NOBR p2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   697
          ]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   698
      | haskell_from_pat br (ICons (("Nil", []), _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   699
          Pretty.str "[]"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   700
      | haskell_from_pat br (p as ICons (("Cons", _), _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   701
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   702
            fun dest_cons (ICons (("Cons", [p1, p2]), ty)) = SOME (p1, p2)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   703
              | dest_cons p = NONE
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   704
          in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   705
            case unfoldr dest_cons p
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   706
             of (ps, (ICons (("Nil", []), _))) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   707
                  ps
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   708
                  |> map (haskell_from_pat NOBR)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   709
                  |> Pretty.list "[" "]"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   710
              | (ps, p) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   711
                  (ps @ [p])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   712
                  |> map (haskell_from_pat (INFX (5, X)))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   713
                  |> separate (Pretty.str ":")
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   714
                  |> brackify (eval_br br (INFX (5, R)))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   715
          end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   716
      | haskell_from_pat br (ICons ((f, ps), _)) =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   717
          (case const_syntax f
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   718
           of NONE =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   719
              ps
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   720
              |> map (haskell_from_pat BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   721
              |> cons ((Pretty.str o resolv_const) f)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   722
              |> brackify (eval_br br BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   723
            | SOME (i, pr) =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   724
              if i = length ps
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   725
              then
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   726
                pr (map (haskell_from_pat BR) ps) (haskell_from_expr BR)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   727
              else
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   728
                error "number of argument mismatch in customary serialization")
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   729
      | haskell_from_pat br (IVarP (v, _)) =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   730
          (Pretty.str o lower_first) v
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   731
    and haskell_from_expr br (e as (IApp (IApp (IConst ("Cons", _), _), _))) =
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   732
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   733
            fun dest_cons (IApp (IApp (IConst ("Cons", _), e1), e2)) = SOME (e1, e2)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   734
              | dest_cons p = NONE
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   735
          in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   736
            case unfoldr dest_cons e
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   737
             of (es, (IConst ("Nil", _))) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   738
                  es
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   739
                  |> map (haskell_from_expr NOBR)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   740
                  |> Pretty.list "[" "]"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   741
              | (es, e) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   742
                  (es @ [e])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   743
                  |> map (haskell_from_expr (INFX (5, X)))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   744
                  |> separate (Pretty.str ":")
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   745
                  |> brackify (eval_br br (INFX (5, R)))
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   746
          end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   747
      | haskell_from_expr br (e as IApp (e1, e2)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   748
          (case (unfold_app e)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   749
           of (e as (IConst (f, _)), es) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   750
                haskell_from_app br (f, es)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   751
            | _ =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   752
                brackify (eval_br br BR) [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   753
                  haskell_from_expr NOBR e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   754
                  haskell_from_expr BR e2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   755
                ])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   756
      | haskell_from_expr br (e as IConst (f, _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   757
          haskell_from_app br (f, [])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   758
      | haskell_from_expr br (IVarE (v, _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   759
          (Pretty.str o lower_first) v
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   760
      | haskell_from_expr br (e as IAbs _) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   761
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   762
            val (vs, body) = unfold_abs e
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   763
          in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   764
            brackify (eval_br br BR) (
18361
3126d01e9e35 improved serialization of classes to haskell
haftmann
parents: 18360
diff changeset
   765
              Pretty.str "\\"
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   766
              :: map (Pretty.str o lower_first o fst) vs @ [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   767
              Pretty.str "->",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   768
              haskell_from_expr NOBR body
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   769
            ])
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   770
          end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   771
      | haskell_from_expr br (e as ICase (_, [_])) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   772
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   773
            val (ps, body) = unfold_let e;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   774
            fun mk_bind (p, e) = Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   775
                haskell_from_pat BR p,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   776
                Pretty.str " =",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   777
                Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   778
                haskell_from_expr NOBR e
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   779
              ];
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   780
          in Pretty.chunks [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   781
            [Pretty.str ("let"), Pretty.fbrk, map mk_bind ps |> Pretty.chunks] |> Pretty.block,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   782
            [Pretty.str ("in "), haskell_from_expr NOBR body] |> Pretty.block
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   783
          ] end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   784
      | haskell_from_expr br (ICase (e, c::cs)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   785
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   786
            fun mk_clause (p, e) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   787
              Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   788
                haskell_from_pat NOBR p,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   789
                Pretty.str " ->",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   790
                Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   791
                haskell_from_expr NOBR e
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   792
              ]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   793
          in (Pretty.block o Pretty.fbreaks) (
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   794
            Pretty.block [Pretty.str "case ", haskell_from_expr NOBR e, Pretty.str " of"]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   795
            :: map (mk_clause) cs
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   796
          )end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   797
      | haskell_from_expr br (IInst (e, _)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   798
          haskell_from_expr br e
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   799
      | haskell_from_expr br (IDictE _) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   800
          error "cannot serialize dictionary expression to haskell"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   801
      | haskell_from_expr br (ILookup _) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   802
          error "cannot serialize lookup expression to haskell"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   803
    and mk_app_p br p args =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   804
      brackify (eval_br br BR)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   805
        (p :: map (haskell_from_expr BR) args)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   806
    and haskell_from_app br ("Nil", []) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   807
          Pretty.str "[]"
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   808
      | haskell_from_app br ("Cons", es) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   809
          mk_app_p br (Pretty.str "(:)") es
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   810
      | haskell_from_app br ("primeq", [e1, e2]) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   811
          brackify (eval_br br (INFX (4, L))) [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   812
            haskell_from_expr (INFX (4, L)) e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   813
            Pretty.str "==",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   814
            haskell_from_expr (INFX (4, X)) e2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   815
          ]
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   816
      | haskell_from_app br ("eq", [e1, e2]) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   817
          brackify (eval_br br (INFX (4, L))) [
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   818
            haskell_from_expr (INFX (4, L)) e1,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   819
            Pretty.str "==",
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   820
            haskell_from_expr (INFX (4, X)) e2
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   821
          ]
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   822
      | haskell_from_app br ("Pair", [e1, e2]) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   823
          Pretty.list "(" ")" [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   824
            haskell_from_expr NOBR e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   825
            haskell_from_expr NOBR e2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   826
          ]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   827
      | haskell_from_app br ("if", [b, e1, e2]) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   828
          brackify (eval_br br BR) [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   829
            Pretty.str "if",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   830
            haskell_from_expr NOBR b,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   831
            Pretty.str "then",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   832
            haskell_from_expr NOBR e1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   833
            Pretty.str "else",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   834
            haskell_from_expr NOBR e2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   835
          ]
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   836
      | haskell_from_app br ("and", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   837
          haskell_from_binop br 3 R "&&" es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   838
      | haskell_from_app br ("or", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   839
          haskell_from_binop br 2 R "||" es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   840
      | haskell_from_app br ("add", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   841
          haskell_from_binop br 6 L "+" es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   842
      | haskell_from_app br ("mult", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   843
          haskell_from_binop br 7 L "*" es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   844
      | haskell_from_app br ("lt", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   845
          haskell_from_binop br 4 L "<" es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   846
      | haskell_from_app br ("le", es) =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   847
          haskell_from_binop br 4 L "<=" es
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   848
      | haskell_from_app br ("minus", es) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   849
          mk_app_p br (Pretty.str "negate") es
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   850
      | haskell_from_app br ("wfrec", es) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   851
          mk_app_p br (Pretty.str "wfrec") es
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   852
      | haskell_from_app br (f, es) =
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   853
          case const_syntax f
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   854
           of NONE =>
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   855
                (case es
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   856
                 of [] => Pretty.str (resolv_const f)
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   857
                  | es =>
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   858
                      let
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   859
                        val (es', e) = split_last es;
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   860
                      in mk_app_p br (haskell_from_app NOBR (f, es')) [e] end)
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   861
            | SOME (i, pr) =>
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   862
                let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   863
                  val (es1, es2) = splitAt (i, es);
18335
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   864
                in mk_app_p br (pr (map (haskell_from_expr BR) es1) (haskell_from_expr BR)) es2 end
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   865
    and haskell_from_binop br pr L f [e1, e2] =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   866
          brackify (eval_br br (INFX (pr, L))) [
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   867
            haskell_from_expr (INFX (pr, L)) e1,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   868
            Pretty.str f,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   869
            haskell_from_expr (INFX (pr, X)) e2
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   870
          ]
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   871
      | haskell_from_binop br pr R f [e1, e2] =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   872
          brackify (eval_br br (INFX (pr, R))) [
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   873
            haskell_from_expr (INFX (pr, X)) e1,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   874
            Pretty.str f,
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   875
            haskell_from_expr (INFX (pr, R)) e2
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   876
          ]
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   877
      | haskell_from_binop br pr ass f args =
99baddf6b0d0 various improvements
haftmann
parents: 18304
diff changeset
   878
          mk_app_p br (Pretty.str ("(" ^ f ^ ")")) args
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   879
    fun haskell_from_def (name, Nop) =
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   880
          if exists (fn query => query name)
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   881
            [(fn name => (is_some o tyco_syntax) name),
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   882
             (fn name => (is_some o const_syntax) name)]
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   883
          then NONE
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   884
          else error ("empty statement during serialization: " ^ quote name)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   885
      | haskell_from_def (name, Fun (eqs, (_, ty))) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   886
          let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   887
            fun from_eq name (args, rhs) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   888
              Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   889
                Pretty.str (lower_first name),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   890
                Pretty.block (map (fn p => Pretty.block [Pretty.brk 1, haskell_from_pat BR p]) args),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   891
                Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   892
                Pretty.str ("="),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   893
                Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   894
                haskell_from_expr NOBR rhs
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   895
              ]
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   896
          in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   897
            Pretty.chunks [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   898
              Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   899
                Pretty.str (name ^ " ::"),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   900
                Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   901
                haskell_from_type NOBR ty
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   902
              ],
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   903
              Pretty.chunks (map (from_eq name) eqs)
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   904
            ] |> SOME
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   905
          end
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   906
      | haskell_from_def (name, Typesyn (vs, ty)) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   907
          Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   908
            Pretty.str "type ",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   909
            haskell_from_sctxt vs,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   910
            Pretty.str (upper_first name),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   911
            Pretty.block (map (fn (v, _) => Pretty.str (" " ^ (lower_first) v)) vs),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   912
            Pretty.str " =",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   913
            Pretty.brk 1,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   914
            haskell_from_type NOBR ty
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   915
          ] |> SOME
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   916
      | haskell_from_def (name, Datatype (vars, constrs, _)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   917
          let
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   918
            fun mk_cons (co, tys) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   919
              (Pretty.block o Pretty.breaks) (
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   920
                Pretty.str ((upper_first o resolv) co)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   921
                :: map (haskell_from_type NOBR) tys
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   922
              )
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   923
          in
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   924
            Pretty.block (
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   925
              Pretty.str "data "
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   926
              :: haskell_from_sctxt vars
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   927
              :: Pretty.str (upper_first name)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   928
              :: Pretty.block (map (fn (v, _) => Pretty.str (" " ^ (lower_first) v)) vars)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   929
              :: Pretty.str " ="
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   930
              :: Pretty.brk 1
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   931
              :: separate (Pretty.block [Pretty.brk 1, Pretty.str "| "]) (map mk_cons constrs)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   932
            )
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   933
          end |> SOME
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   934
      | haskell_from_def (_, Datatypecons _) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   935
          NONE
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   936
      | haskell_from_def (name, Class (supclasss, v, membrs, _)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   937
          let
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   938
            fun mk_member (m, (_, ty)) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   939
              Pretty.block [
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   940
                Pretty.str (resolv m ^ " ::"),
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   941
                Pretty.brk 1,
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   942
                haskell_from_type NOBR ty
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   943
              ]
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   944
          in
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   945
            Pretty.block [
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   946
              Pretty.str "class ",
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   947
              haskell_from_sctxt (map (fn class => (v, [class])) supclasss),
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   948
              Pretty.str ((upper_first name) ^ " " ^ v),
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   949
              Pretty.str " where",
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   950
              Pretty.fbrk,
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   951
              Pretty.chunks (map mk_member membrs)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   952
            ] |> SOME
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   953
          end
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   954
      | haskell_from_def (name, Classmember _) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   955
          NONE
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   956
      | haskell_from_def (_, Classinst (clsname, (tyco, arity), instmems)) = 
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   957
          Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   958
            Pretty.str "instance ",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   959
            haskell_from_sctxt arity,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   960
            Pretty.str ((upper_first o resolv) clsname),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   961
            Pretty.str " ",
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   962
            haskell_from_type NOBR (IType (tyco, (map (IVarT o rpair [] o fst)) arity)),
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   963
            Pretty.str " where",
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   964
            Pretty.fbrk,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   965
            Pretty.chunks (map (fn (member, const) =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   966
              Pretty.str ((lower_first o resolv) member ^ " = " ^ (lower_first o resolv) const)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   967
            ) instmems)
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   968
          ] |> SOME
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   969
  in
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   970
    case List.mapPartial (fn (name, def) => haskell_from_def (name, def)) defs
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   971
     of [] => NONE
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   972
      | l => (SOME o Pretty.block) l
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   973
  end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   974
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   975
in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   976
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   977
fun haskell_from_thingol nspgrp name_root tyco_syntax const_syntax prims select module =
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   978
  let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   979
    fun haskell_from_module (name, ps) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   980
      Pretty.block [
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   981
          Pretty.str ("module " ^ (upper_first name) ^ " where"),
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   982
          Pretty.fbrk,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   983
          Pretty.fbrk,
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   984
          Pretty.chunks (separate (Pretty.str "") ps)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   985
        ];
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   986
    fun haskell_validator name =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   987
      let
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   988
        fun replace_invalid c =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   989
          if (Char.isAlphaNum o the o Char.fromString) c orelse c = "'"
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   990
          andalso not (NameSpace.separator = c)
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   991
          then c
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   992
          else "_"
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   993
        fun suffix_it name =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   994
          name
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   995
          |> member (op =) CodegenThingol.prims ? suffix "'"
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   996
          |> has_prim prims ? suffix "'"
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   997
          |> (fn name' => if name = name' then name else suffix_it name')
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   998
      in
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   999
        name
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
  1000
        |> translate_string replace_invalid
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
  1001
        |> suffix_it
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
  1002
        |> (fn name' => if name = name' then NONE else SOME name')
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
  1003
      end;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1004
    fun eta_expander "Pair" = 2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1005
      | eta_expander "if" = 3
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1006
      | eta_expander s =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1007
          if NameSpace.is_qualified s
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1008
          then case get_def module s
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
  1009
            of Datatypecons dtname =>
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
  1010
                (case get_def module dtname
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
  1011
                  of Datatype (_, cs, _) =>
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
  1012
                    let val l = AList.lookup (op =) cs s |> the |> length
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
  1013
                    in if l >= 2 then l else 0 end)
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1014
             | _ =>
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
  1015
                const_syntax s
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
  1016
                |> Option.map fst
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1017
                |> the_default 0
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1018
          else 0;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1019
    fun is_cons f =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1020
      NameSpace.is_qualified f
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1021
      andalso case get_def module f
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1022
       of Datatypecons _ => true
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1023
        | _ => false;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1024
  in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1025
    module
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1026
    |> debug 12 (Pretty.output o pretty_module)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1027
    |> debug 3 (fn _ => "selecting submodule...")
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1028
    |> (if is_some select then (partof o the) select else I)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1029
    |> debug 3 (fn _ => "eta-expanding...")
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1030
    |> eta_expand eta_expander
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1031
    |> debug 3 (fn _ => "generating...")
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1032
    |> serialize (haskell_from_defs tyco_syntax const_syntax is_cons) haskell_from_module haskell_validator nspgrp name_root
18361
3126d01e9e35 improved serialization of classes to haskell
haftmann
parents: 18360
diff changeset
  1033
    |> (fn p => Pretty.chunks [setmp print_mode [] (Pretty.str o mk_prims) prims, p])
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1034
  end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1035
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1036
end; (* local *)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1037
18216
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
  1038
end; (* struct *)
db7d43b25c99 added serializer
haftmann
parents: 18169
diff changeset
  1039