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