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