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