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