src/Pure/Tools/codegen_thingol.ML
author haftmann
Fri, 03 Feb 2006 08:48:33 +0100
changeset 18916 fda5b8dbbef6
parent 18912 dd168daf172d
child 18918 5590770e1b09
permissions -rw-r--r--
no toplevel 'thy' anymore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
     1
(*  Title:      Pure/Tools/codegen_thingol.ML
18169
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
Intermediate language ("Thin-gol") for code extraction.
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
     6
*)
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
signature CODEGEN_THINGOL =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
     9
sig
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    10
  type vname = string;
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    11
  datatype classlookup = Instance of string * classlookup list list
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    12
                       | Lookup of class list * (string * int);
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    13
  datatype itype =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    14
      IType of string * itype list
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    15
    | IFun of itype * itype
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    16
    | IVarT of vname * sort;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    17
  datatype iexpr =
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    18
      IConst of (string * itype) * classlookup list list
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    19
    | IVarE of vname * itype
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    20
    | IApp of iexpr * iexpr
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    21
    | IAbs of (vname * itype) * iexpr
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    22
    | ICase of iexpr * (iexpr * iexpr) list;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    23
  val mk_funs: itype list * itype -> itype;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    24
  val mk_apps: iexpr * iexpr list -> iexpr;
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
    25
  val mk_abss: (vname * itype) list * iexpr -> iexpr;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    26
  val pretty_itype: itype -> Pretty.T;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    27
  val pretty_iexpr: iexpr -> Pretty.T;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    28
  val unfoldl: ('a -> ('a * 'b) option) -> 'a -> 'a * 'b list;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    29
  val unfoldr: ('a -> ('b * 'a) option) -> 'a -> 'b list * 'a;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    30
  val unfold_fun: itype -> itype list * itype;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    31
  val unfold_app: iexpr -> iexpr * iexpr list;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
    32
  val unfold_abs: iexpr -> (vname * itype) list * iexpr;
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
    33
  val unfold_let: iexpr -> (iexpr * iexpr) list * iexpr;
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
    34
  val unfold_const_app: iexpr ->
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    35
    (((string * itype) * classlookup list list) * iexpr list) option;
18912
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
    36
  val ensure_pat: iexpr -> iexpr;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    37
  val itype_of_iexpr: iexpr -> itype;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    38
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    39
  val `%% : string * itype list -> itype;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    40
  val `-> : itype * itype -> itype;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    41
  val `--> : itype list * itype -> itype;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    42
  val `$ : iexpr * iexpr -> iexpr;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    43
  val `$$ : iexpr * iexpr list -> iexpr;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    44
  val `|-> : (vname * itype) * iexpr -> iexpr;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    45
  val `|--> : (vname * itype) list * iexpr -> iexpr;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    46
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
    47
  type funn = (iexpr list * iexpr) list * (ClassPackage.sortcontext * itype);
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    48
  datatype prim =
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    49
      Pretty of Pretty.T
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    50
    | Name of string;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    51
  datatype def =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    52
      Undef
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    53
    | Prim of (string * Pretty.T option) list
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    54
    | Fun of funn
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
    55
    | Typesyn of (vname * string list) list * itype
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    56
    | Datatype of ((vname * string list) list * (string * itype list) list)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    57
        * string list
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
    58
    | Datatypecons of string
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    59
    | Class of (class list * (vname * (string * (ClassPackage.sortcontext * itype)) list))
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    60
        * string list
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
    61
    | Classmember of class
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
    62
    | Classinst of ((class * (string * (vname * sort) list))
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    63
          * (class * classlookup list list) list)
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
    64
        * (string * funn) list;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    65
  type module;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    66
  type transact;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    67
  type 'dst transact_fin;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    68
  type gen_defgen = string -> transact -> def transact_fin;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    69
  val pretty_def: def -> Pretty.T;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
    70
  val pretty_module: module -> Pretty.T; 
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
    71
  val pretty_deps: module -> Pretty.T;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    72
  val empty_module: module;
18517
788fa99aba33 slight improvements
haftmann
parents: 18516
diff changeset
    73
  val add_prim: string -> string list -> (string * Pretty.T) -> module -> module;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    74
  val ensure_prim: string -> string -> module -> module;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    75
  val get_def: module -> string -> def;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    76
  val merge_module: module * module -> module;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    77
  val partof: string list -> module -> module;
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
    78
  val has_nsp: string -> string -> bool;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    79
  val succeed: 'a -> transact -> 'a transact_fin;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    80
  val fail: string -> transact -> 'a transact_fin;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    81
  val gen_ensure_def: (string * gen_defgen) list -> string
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
    82
    -> string -> transact -> transact;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    83
  val start_transact: (transact -> 'a * transact) -> module -> 'a * module;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    84
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
    85
  val eta_expand: (string -> int) -> module -> module;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    86
  val eta_expand_poly: module -> module;
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
    87
  val unclash_vars: module -> module;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
    88
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    89
  val debug_level: int ref;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    90
  val debug: int -> ('a -> string) -> 'a -> 'a;
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
    91
  val soft_exc: bool ref;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    92
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    93
  val serialize:
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
    94
    ((string -> string) -> (string * def) list -> 'a option)
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    95
    -> (string list -> (string * string) * 'a list -> 'a option)
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
    96
    -> (string -> string option)
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
    97
    -> string list list -> string -> module -> 'a option;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    98
end;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
    99
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   100
structure CodegenThingol: CODEGEN_THINGOL =
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   101
struct
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   102
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   103
(** auxiliary **)
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   104
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   105
val debug_level = ref 0;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   106
fun debug d f x = (if d <= !debug_level then Output.debug (f x) else (); x);
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   107
val soft_exc = ref true;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   108
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   109
fun unfoldl dest x =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   110
  case dest x
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   111
   of NONE => (x, [])
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   112
    | SOME (x1, x2) =>
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   113
        let val (x', xs') = unfoldl dest x1 in (x', xs' @ [x2]) end;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   114
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   115
fun unfoldr dest x =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   116
  case dest x
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   117
   of NONE => ([], x)
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   118
    | SOME (x1, x2) =>
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   119
        let val (xs', x') = unfoldr dest x2 in (x1::xs', x') end;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   120
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   121
fun map_yield f [] = ([], [])
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   122
  | map_yield f (x::xs) =
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   123
      let
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   124
        val (y, x') = f x
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   125
        val (ys, xs') = map_yield f xs
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   126
      in (y::ys, x'::xs') end;
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   127
18454
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   128
fun get_prefix eq ([], ys) = ([], ([], ys))
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   129
  | get_prefix eq (xs, []) = ([], (xs, []))
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   130
  | get_prefix eq (xs as x::xs', ys as y::ys') =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   131
      if eq (x, y) then
18454
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   132
        let val (ps', xys'') = get_prefix eq (xs', ys')
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   133
        in (x::ps', xys'') end
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   134
      else ([], (xs, ys));
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   135
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   136
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   137
(** language core - types, pattern, expressions **)
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   138
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   139
(* language representation *)
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   140
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   141
infix 8 `%%;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   142
infixr 6 `->;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   143
infixr 6 `-->;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   144
infix 4 `$;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   145
infix 4 `$$;
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   146
infixr 3 `|->;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   147
infixr 3 `|-->;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   148
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   149
type vname = string;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   150
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   151
datatype classlookup = Instance of string * classlookup list list
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   152
                     | Lookup of class list * (string * int);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   153
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   154
datatype itype =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   155
    IType of string * itype list
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   156
  | IFun of itype * itype
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   157
  | IVarT of vname * sort;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   158
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   159
datatype iexpr =
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   160
    IConst of (string * itype) * classlookup list list
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   161
  | IVarE of vname * itype
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   162
  | IApp of iexpr * iexpr
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   163
  | IAbs of (vname * itype) * iexpr
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   164
  | ICase of iexpr * (iexpr * iexpr) list;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   165
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   166
(*
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   167
  variable naming conventions
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   168
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   169
  bare names:
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   170
    variable names          v
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   171
    class names             cls
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   172
    type constructor names  tyco
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   173
    datatype names          dtco
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   174
    const names (general)   c
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   175
    constructor names       co
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   176
    class member names      m
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   177
    arbitrary name          s
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   178
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   179
  constructs:
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   180
    sort                    sort
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   181
    type                    ty
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   182
    expression              e
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   183
    pattern                 p, pat
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   184
    instance (cls, tyco)    inst
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   185
    variable (v, ty)        var
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   186
    class member (m, ty)    membr
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   187
    constructors (co, tys)  constr
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   188
 *)
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   189
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   190
val mk_funs = Library.foldr IFun;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   191
val mk_apps = Library.foldl IApp;
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   192
val mk_abss = Library.foldr IAbs;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   193
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   194
val op `%% = IType;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   195
val op `-> = IFun;
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   196
val op `$ = IApp;
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   197
val op `|-> = IAbs;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   198
val op `--> = mk_funs;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   199
val op `$$ = mk_apps;
18247
b17724cae935 code generator: case expressions, improved name resolving
haftmann
parents: 18231
diff changeset
   200
val op `|--> = mk_abss;
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   201
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   202
fun pretty_itype (IType (tyco, tys)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   203
      Pretty.enum "" "(" ")" (Pretty.str tyco :: map pretty_itype tys)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   204
  | pretty_itype (IFun (ty1, ty2)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   205
      Pretty.enum "" "(" ")" [pretty_itype ty1, Pretty.str "->", pretty_itype ty2]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   206
  | pretty_itype (IVarT (v, sort)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   207
      Pretty.str (v ^ enclose "|" "|" (space_implode "|" sort));
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   208
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   209
fun pretty_iexpr (IConst ((c, ty), _)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   210
      Pretty.block [Pretty.str (c ^ "::"), pretty_itype ty]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   211
  | pretty_iexpr (IVarE (v, ty)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   212
      Pretty.block [Pretty.str ("?" ^ v ^ "::"), pretty_itype ty]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   213
  | pretty_iexpr (IApp (e1, e2)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   214
      Pretty.enclose "(" ")" [pretty_iexpr e1, Pretty.brk 1, pretty_iexpr e2]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   215
  | pretty_iexpr (IAbs ((v, ty), e)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   216
      Pretty.enclose "(" ")" [Pretty.str ("?" ^ v ^ " |->"), Pretty.brk 1, pretty_iexpr e]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   217
  | pretty_iexpr (ICase (e, cs)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   218
      Pretty.enclose "(" ")" [
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   219
        Pretty.str "case ",
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   220
        pretty_iexpr e,
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   221
        Pretty.enclose "(" ")" (map (fn (p, e) =>
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   222
          Pretty.block [
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   223
            pretty_iexpr p,
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   224
            Pretty.str " => ",
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   225
            pretty_iexpr e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   226
          ]
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   227
        ) cs)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   228
      ];
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   229
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   230
val unfold_fun = unfoldr
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   231
  (fn IFun t => SOME t
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   232
    | _ => NONE);
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   233
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   234
val unfold_app = unfoldl
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   235
  (fn IApp e => SOME e
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   236
    | _ => NONE);
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   237
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   238
val unfold_abs = unfoldr
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   239
  (fn IAbs b => SOME b
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   240
    | _ => NONE)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   241
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   242
val unfold_let = unfoldr
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   243
  (fn ICase (e, [(p, e')]) => SOME ((p, e), e')
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   244
    | _ => NONE);
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   245
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   246
fun unfold_const_app e = 
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   247
 case unfold_app e
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   248
  of (IConst x, es) => SOME (x, es)
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   249
   | _ => NONE;
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   250
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   251
fun map_itype f_itype (IType (tyco, tys)) =
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   252
      tyco `%% map f_itype tys
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   253
  | map_itype f_itype (IFun (t1, t2)) =
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   254
      f_itype t1 `-> f_itype t2
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   255
  | map_itype _ (ty as IVarT _) =
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   256
      ty;
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   257
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   258
fun map_iexpr f (IApp (e1, e2)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   259
      f e1 `$ f e2
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   260
  | map_iexpr f (IAbs (v, e)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   261
      v `|-> f e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   262
  | map_iexpr f (ICase (e, ps)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   263
      ICase (f e, map (fn (p, e) => (f p, f e)) ps)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   264
  | map_iexpr _ (e as IConst _) =
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   265
      e
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   266
  | map_iexpr _ (e as IVarE _) =
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   267
      e;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   268
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   269
fun map_atype f (ty as IVarT _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   270
      f ty
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   271
  | map_atype f ty =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   272
      map_itype (map_atype f) ty;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   273
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   274
fun map_aexpr f (e as IConst _) = 
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   275
      f e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   276
  | map_aexpr f (e as IVarE _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   277
      f e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   278
  | map_aexpr f e =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   279
      map_iexpr (map_aexpr f) e;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   280
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   281
fun map_iexpr_itype f =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   282
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   283
    fun mapp (IConst ((c, ty), ctxt)) = IConst ((c, f ty), ctxt)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   284
      | mapp (IVarE (v, ty)) = IVarE (v, f ty)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   285
  in map_aexpr mapp end;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   286
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   287
fun fold_atype f (IFun (ty1, ty2)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   288
      fold_atype f ty1 #> fold_atype f ty2
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   289
  | fold_atype f (ty as IType _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   290
      f ty
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   291
  | fold_atype f (ty as IVarT _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   292
      f ty;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   293
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   294
fun fold_aexpr f (IApp (e1, e2)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   295
      fold_aexpr f e1 #> fold_aexpr f e2
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   296
  | fold_aexpr f (IAbs (v, e)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   297
      fold_aexpr f e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   298
  | fold_aexpr f (ICase (e, ps)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   299
      fold_aexpr f e #> fold (fn (p, e) => fold_aexpr f p #> fold_aexpr f e) ps
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   300
  | fold_aexpr f (e as IConst _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   301
      f e
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   302
  | fold_aexpr f (e as IVarE _) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   303
      f e;
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   304
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   305
fun eq_itype (ty1, ty2) =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   306
  let
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   307
    exception NO_MATCH;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   308
    fun eq (IVarT (v1, sort1)) (IVarT (v2, sort2)) subs =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   309
          if sort1 <> sort2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   310
          then raise NO_MATCH
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   311
          else
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   312
            (case AList.lookup (op =) subs v1
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   313
             of NONE => subs |> AList.update (op =) (v1, v2)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   314
              | (SOME v1') =>
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   315
                  if v1' <> v2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   316
                  then raise NO_MATCH
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   317
                  else subs)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   318
      | eq (IType (tyco1, tys1)) (IType (tyco2, tys2)) subs =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   319
          if tyco1 <> tyco2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   320
          then raise NO_MATCH
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   321
          else subs |> fold2 eq tys1 tys2
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   322
      | eq (IFun (ty11, ty12)) (IFun (ty21, ty22)) subs =
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   323
          subs |> eq ty11 ty21 |> eq ty12 ty22
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   324
      | eq _ _ _ = raise NO_MATCH;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   325
  in
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   326
    (eq ty1 ty2 []; true)
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   327
    handle NO_MATCH => false
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   328
  end;
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   329
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   330
fun instant_itype f =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   331
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   332
    fun instant (IVarT x) = f x
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   333
      | instant y = map_itype instant y;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   334
  in map_itype instant end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   335
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   336
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   337
(* simple diagnosis *)
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   338
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   339
fun pretty_itype (IType (tyco, tys)) =
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   340
      Pretty.enum "" "(" ")" (Pretty.str tyco :: map pretty_itype tys)
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   341
  | pretty_itype (IFun (ty1, ty2)) =
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   342
      Pretty.enum "" "(" ")" [pretty_itype ty1, Pretty.str "->", pretty_itype ty2]
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   343
  | pretty_itype (IVarT (v, sort)) =
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   344
      Pretty.str (v ^ enclose "|" "|" (space_implode "|" sort));
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   345
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   346
fun pretty_iexpr (IConst ((c, ty), _)) =
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   347
      Pretty.block [Pretty.str (c ^ "::"), pretty_itype ty]
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   348
  | pretty_iexpr (IVarE (v, ty)) =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   349
      Pretty.block [Pretty.str ("?" ^ v ^ "::"), pretty_itype ty]
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   350
  | pretty_iexpr (IApp (e1, e2)) =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   351
      Pretty.enclose "(" ")" [pretty_iexpr e1, Pretty.brk 1, pretty_iexpr e2]
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   352
  | pretty_iexpr (IAbs ((v, ty), e)) =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   353
      Pretty.enclose "(" ")" [Pretty.str ("?" ^ v ^ " |->"), Pretty.brk 1, pretty_iexpr e]
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   354
  | pretty_iexpr (ICase (e, cs)) =
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   355
      Pretty.enclose "(" ")" [
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   356
        Pretty.str "case ",
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   357
        pretty_iexpr e,
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   358
        Pretty.enclose "(" ")" (map (fn (p, e) =>
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   359
          Pretty.block [
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   360
            pretty_iexpr p,
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   361
            Pretty.str " => ",
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   362
            pretty_iexpr e
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   363
          ]
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   364
        ) cs)
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   365
      ];
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   366
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   367
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   368
(* language auxiliary *)
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   369
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   370
fun itype_of_iexpr (IConst ((_, ty), s)) = ty
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   371
  | itype_of_iexpr (IVarE (_, ty)) = ty
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   372
  | itype_of_iexpr (e as IApp (e1, e2)) = (case itype_of_iexpr e1
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   373
      of (IFun (ty2, ty')) =>
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   374
            if ty2 = itype_of_iexpr e2
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   375
            then ty'
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   376
            else error ("inconsistent application: in " ^ Pretty.output (pretty_iexpr e)
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   377
              ^ ", " ^ (Pretty.output o pretty_itype) ty2
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   378
              ^ " vs. " ^ (Pretty.output o pretty_itype o itype_of_iexpr) e2)
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   379
       | _ => error ("expression is not a function: " ^ Pretty.output (pretty_iexpr e1)))
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   380
  | itype_of_iexpr (IAbs ((_, ty1), e2)) = ty1 `-> itype_of_iexpr e2
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   381
  | itype_of_iexpr (ICase ((_, [(_, e)]))) = itype_of_iexpr e;
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   382
18912
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   383
fun ensure_pat (e as IConst (_, [])) = e
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   384
  | ensure_pat (e as IVarE _) = e
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   385
  | ensure_pat (e as IApp (e1, e2)) =
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   386
      (ensure_pat e1 `$ ensure_pat e2; e)
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   387
  | ensure_pat e =
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   388
      error ("illegal expression for pattern: " ^ (Pretty.output o pretty_iexpr) e);
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
   389
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   390
fun type_vnames ty = 
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   391
  let
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   392
    fun extr (IVarT (v, _)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   393
      insert (op =) v
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   394
  in fold_atype extr ty end;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   395
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   396
fun expr_names e =
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
   397
  let
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   398
    fun extr (IConst ((c, _), _)) =
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   399
          insert (op =) c
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   400
      | extr (IVarE (v, _)) =
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   401
          insert (op =) v
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   402
  in fold_aexpr extr e end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   403
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   404
fun invent seed used =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   405
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   406
    val x = Term.variant used seed
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   407
  in (x, x :: used) end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   408
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   409
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   410
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   411
(** language module system - definitions, modules, transactions **)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   412
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   413
(* type definitions *)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   414
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   415
type funn = (iexpr list * iexpr) list * (ClassPackage.sortcontext * itype);
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   416
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   417
datatype prim =
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   418
    Pretty of Pretty.T
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   419
  | Name of string;
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   420
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   421
datatype def =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   422
    Undef
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   423
  | Prim of (string * Pretty.T option) list
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   424
  | Fun of funn
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   425
  | Typesyn of (vname * string list) list * itype
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   426
  | Datatype of ((vname * string list) list * (string * itype list) list)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   427
      * string list
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   428
  | Datatypecons of string
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   429
  | Class of (class list * (vname * (string * (ClassPackage.sortcontext * itype)) list))
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   430
      * string list
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   431
  | Classmember of class
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   432
  | Classinst of ((class * (string * (vname * sort) list))
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   433
        * (class * classlookup list list) list)
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   434
      * (string * funn) list;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   435
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   436
datatype node = Def of def | Module of node Graph.T;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   437
type module = node Graph.T;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   438
type transact = Graph.key option * module;
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   439
datatype 'dst transact_res = Succeed of 'dst | Fail of string list * exn option;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   440
type 'dst transact_fin = 'dst transact_res * module;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   441
type gen_defgen = string -> transact -> def transact_fin;
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   442
exception FAIL of string list * exn option;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   443
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   444
val eq_def = (op =);
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   445
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   446
(* simple diagnosis *)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   447
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   448
fun pretty_def Undef =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   449
      Pretty.str "<UNDEF>"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   450
  | pretty_def (Prim prims) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   451
      Pretty.str ("<PRIM " ^ (commas o map fst) prims ^ ">")
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   452
  | pretty_def (Fun (eqs, (_, ty))) =
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   453
      Pretty.enum " |" "" "" (
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   454
        map (fn (ps, body) =>
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   455
          Pretty.block [
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   456
            Pretty.enum "," "[" "]" (map pretty_iexpr ps),
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   457
            Pretty.str " |->",
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   458
            Pretty.brk 1,
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   459
            pretty_iexpr body,
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   460
            Pretty.str "::",
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   461
            pretty_itype ty
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   462
          ]) eqs
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   463
        )
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   464
  | pretty_def (Typesyn (vs, ty)) =
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   465
      Pretty.block [
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   466
        Pretty.list "(" ")" (map (pretty_itype o IVarT) vs),
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   467
        Pretty.str " |=> ",
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   468
        pretty_itype ty
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   469
      ]
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   470
  | pretty_def (Datatype ((vs, cs), insts)) =
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   471
      Pretty.block [
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   472
        Pretty.list "(" ")" (map (pretty_itype o IVarT) vs),
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   473
        Pretty.str " |=> ",
18852
f1e2602ca7ba replaced gen_list by enum
haftmann
parents: 18850
diff changeset
   474
        Pretty.enum " |" "" ""
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   475
          (map (fn (c, tys) => (Pretty.block o Pretty.breaks)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   476
            (Pretty.str c :: map pretty_itype tys)) cs),
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   477
        Pretty.str ", instances ",
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   478
        Pretty.enum "," "[" "]" (map Pretty.str insts)
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   479
      ]
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   480
  | pretty_def (Datatypecons dtname) =
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   481
      Pretty.str ("cons " ^ dtname)
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   482
  | pretty_def (Class ((supcls, (v, mems)), insts)) =
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   483
      Pretty.block [
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   484
        Pretty.str ("class var " ^ v ^ "extending "),
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   485
        Pretty.enum "," "[" "]" (map Pretty.str supcls),
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   486
        Pretty.str " with ",
18852
f1e2602ca7ba replaced gen_list by enum
haftmann
parents: 18850
diff changeset
   487
        Pretty.enum "," "[" "]"
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   488
          (map (fn (m, (_, ty)) => Pretty.block
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   489
            [Pretty.str (m ^ "::"), pretty_itype ty]) mems),
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   490
        Pretty.str " instances ",
18812
a4554848b59e renamed Pretty.gen_list to Pretty.enum;
wenzelm
parents: 18756
diff changeset
   491
        Pretty.enum "," "[" "]" (map Pretty.str insts)
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   492
      ]
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   493
  | pretty_def (Classmember clsname) =
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   494
      Pretty.block [
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   495
        Pretty.str "class member belonging to ",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   496
        Pretty.str clsname
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   497
      ]
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   498
  | pretty_def (Classinst (((clsname, (tyco, arity)), _), _)) =
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   499
      Pretty.block [
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   500
        Pretty.str "class instance (",
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
   501
        Pretty.str clsname,
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   502
        Pretty.str ", (",
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   503
        Pretty.str tyco,
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   504
        Pretty.str ", ",
18852
f1e2602ca7ba replaced gen_list by enum
haftmann
parents: 18850
diff changeset
   505
        Pretty.enum "," "[" "]" (map (Pretty.enum "," "{" "}" o
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   506
          map Pretty.str o snd) arity),
18515
1cad5c2b2a0b substantial improvements in code generating
haftmann
parents: 18454
diff changeset
   507
        Pretty.str "))"
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   508
      ];
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   509
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   510
fun pretty_module modl =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   511
  let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   512
    fun pretty (name, Module modl) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   513
          Pretty.block (
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   514
            Pretty.str ("module " ^ name ^ " {")
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   515
            :: Pretty.brk 1
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   516
            :: Pretty.chunks (map pretty (AList.make (Graph.get_node modl)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   517
                 (Graph.strong_conn modl |> List.concat |> rev)))
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   518
            :: Pretty.str "}" :: nil
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   519
          )
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   520
      | pretty (name, Def def) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   521
          Pretty.block [Pretty.str name, Pretty.str " :=", Pretty.brk 1, pretty_def def]
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   522
  in pretty ("//", Module modl) end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   523
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   524
fun pretty_deps modl =
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   525
  let
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   526
    fun one_node key =
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   527
      let
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   528
        val preds_ = Graph.imm_preds modl key;
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   529
        val succs_ = Graph.imm_succs modl key;
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   530
        val mutbs = gen_inter (op =) (preds_, succs_);
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   531
        val preds = fold (remove (op =)) mutbs preds_;
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   532
        val succs = fold (remove (op =)) mutbs succs_;
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   533
      in
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   534
        (Pretty.block o Pretty.fbreaks) (
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   535
          Pretty.str key
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   536
          :: map (fn s => Pretty.str ("<-> " ^ s)) mutbs
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   537
          @ map (fn s => Pretty.str ("<-- " ^ s)) preds
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   538
          @ map (fn s => Pretty.str ("--> " ^ s)) succs
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   539
          @ (the_list oo Option.mapPartial)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   540
            ((fn Module modl' => SOME (pretty_deps modl')
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   541
               | _ => NONE) o Graph.get_node modl) (SOME key)
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   542
        )
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   543
      end
18360
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   544
  in
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   545
    modl
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   546
    |> Graph.strong_conn
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   547
    |> List.concat
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   548
    |> rev
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   549
    |> map one_node
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   550
    |> Pretty.chunks
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   551
  end;
a2c9506b62a7 improved class handling
haftmann
parents: 18335
diff changeset
   552
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   553
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   554
(* name handling *)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   555
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   556
fun dest_name name =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   557
  let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   558
    val name' = NameSpace.unpack name
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   559
    val (name'', name_base) = split_last name'
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   560
    val (modl, shallow) = split_last name''
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   561
  in (modl, NameSpace.pack [shallow, name_base]) end
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   562
  handle Empty => error ("not a qualified name: " ^ quote name);
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   563
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   564
fun has_nsp name shallow =
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   565
  NameSpace.is_qualified name
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   566
  andalso let
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   567
    val name' = NameSpace.unpack name
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   568
    val (name'', _) = split_last name'
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   569
    val (_, shallow') = split_last name''
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   570
  in shallow' = shallow end;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   571
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   572
fun dest_modl (Module m) = m;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   573
fun dest_def (Def d) = d;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   574
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   575
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   576
(* modules *)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   577
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   578
val empty_module = Graph.empty; (*read: "depends on"*)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   579
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   580
fun get_def modl name =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   581
  case dest_name name
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   582
   of (modlname, base) =>
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   583
        let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   584
          fun get (Module node) [] =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   585
                (dest_def o Graph.get_node node) base
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   586
            | get (Module node) (m::ms) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   587
                get (Graph.get_node node m) ms
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   588
        in get (Module modl) modlname end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   589
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   590
fun add_def (name, def) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   591
  let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   592
    val (modl, base) = dest_name name;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   593
    fun add [] =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   594
          Graph.new_node (base, Def def)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   595
      | add (m::ms) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   596
          Graph.default_node (m, Module empty_module)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   597
          #> Graph.map_node m (Module o add ms o dest_modl)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   598
  in add modl end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   599
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   600
fun add_dep (name1, name2) modl =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   601
  if name1 = name2 then modl
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   602
  else
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   603
    let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   604
      val m1 = dest_name name1 |> apsnd single |> (op @);
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   605
      val m2 = dest_name name2 |> apsnd single |> (op @);
18454
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   606
      val (ms, (r1, r2)) = get_prefix (op =) (m1, m2);
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
   607
      val (ms, (s1::r1, s2::r2)) = get_prefix (op =) (m1, m2);
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   608
      val add_edge =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   609
        if null r1 andalso null r2
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   610
        then Graph.add_edge
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   611
        else Graph.add_edge_acyclic
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   612
      fun add [] node =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   613
            node
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   614
            |> add_edge (s1, s2)
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   615
        | add (m::ms) node =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   616
            node
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   617
            |> Graph.map_node m (Module o add ms o dest_modl);
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   618
    in add ms modl end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   619
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   620
fun map_def name f =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   621
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   622
    val (modl, base) = dest_name name;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   623
    fun mapp [] =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   624
          Graph.map_node base (Def o f o dest_def)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   625
      | mapp (m::ms) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   626
          Graph.map_node m (Module o mapp ms o dest_modl)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   627
  in mapp modl end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   628
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   629
fun map_defs f =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   630
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   631
    fun mapp (Def def) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   632
          (Def o f) def
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   633
      | mapp (Module modl) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   634
          (Module o Graph.map_nodes mapp) modl
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   635
  in dest_modl o mapp o Module end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   636
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   637
fun fold_defs f =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   638
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   639
    fun fol prfix (name, Def def) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   640
          f (NameSpace.pack (prfix @ [name]), def)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   641
      | fol prfix (name, Module modl) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   642
          Graph.fold_nodes (fol (prfix @ [name])) modl
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   643
  in Graph.fold_nodes (fol []) end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   644
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   645
fun add_deps f modl =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   646
  modl
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   647
  |> fold add_dep ([] |> fold_defs (append o f) modl);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   648
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   649
fun ensure_def (name, Undef) module =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   650
      (case try (get_def module) name
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   651
       of NONE => (error "attempted to add Undef to module")
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   652
        | SOME Undef => (error "attempted to add Undef to module")
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   653
        | SOME def' => map_def name (K def') module)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   654
  | ensure_def (name, def) module =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   655
      (case try (get_def module) name
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   656
       of NONE => add_def (name, def) module
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   657
        | SOME Undef => map_def name (K def) module
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   658
        | SOME def' => if eq_def (def, def')
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   659
            then module
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   660
            else error ("tried to overwrite definition " ^ name));
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   661
18517
788fa99aba33 slight improvements
haftmann
parents: 18516
diff changeset
   662
fun add_prim name deps (target, primdef) =
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   663
  let
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   664
    val (modl, base) = dest_name name;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   665
    fun add [] module =
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   666
          (case try (Graph.get_node module) base
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   667
           of NONE =>
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   668
                module
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   669
                |> Graph.new_node (base, (Def o Prim) [(target, SOME primdef)])
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   670
            | SOME (Def (Prim prim)) =>
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   671
                if AList.defined (op =) prim target
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   672
                then error ("already primitive definition (" ^ target
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   673
                  ^ ") present for " ^ name)
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   674
                else
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   675
                  module
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   676
                  |> Graph.map_node base ((K o Def o Prim) (AList.update (op =)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   677
                       (target, SOME primdef) prim))
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   678
            | _ => error ("already non-primitive definition present for " ^ name))
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   679
      | add (m::ms) module =
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   680
          module
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   681
          |> Graph.default_node (m, Module empty_module)
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   682
          |> Graph.map_node m (Module o add ms o dest_modl)
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   683
  in
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   684
    add modl
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   685
    #> fold (curry add_dep name) deps
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   686
  end;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   687
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   688
fun ensure_prim name target =
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   689
  let
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   690
    val (modl, base) = dest_name name;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   691
    fun ensure [] module =
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   692
          (case try (Graph.get_node module) base
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   693
           of NONE =>
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   694
                module
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   695
                |> Graph.new_node (base, (Def o Prim) [(target, NONE)])
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   696
            | SOME (Def (Prim prim)) =>
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   697
                module
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   698
                |> Graph.map_node base ((K o Def o Prim) (AList.default (op =)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   699
                     (target, NONE) prim))
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   700
            | _ => module)
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   701
      | ensure (m::ms) module =
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   702
          module
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   703
          |> Graph.default_node (m, Module empty_module)
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   704
          |> Graph.map_node m (Module o ensure ms o dest_modl)
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   705
  in ensure modl end;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   706
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   707
fun merge_module modl12 =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   708
  let
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   709
    fun join_module (Module m1, Module m2) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   710
          (SOME o Module) (merge_module (m1, m2))
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   711
      | join_module (Def d1, Def d2) =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   712
          if eq_def (d1, d2) then (SOME o Def) d1 else NONE
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   713
      | join_module _ =
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   714
          NONE
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   715
  in Graph.join (K join_module) modl12 end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   716
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   717
fun partof names modl =
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   718
  let
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   719
    datatype pathnode = PN of (string list * (string * pathnode) list);
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   720
    fun mk_ipath ([], base) (PN (defs, modls)) =
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   721
          PN (base :: defs, modls)
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   722
      | mk_ipath (n::ns, base) (PN (defs, modls)) =
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   723
          modls
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   724
          |> AList.default (op =) (n, PN ([], []))
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   725
          |> AList.map_entry (op =) n (mk_ipath (ns, base))
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   726
          |> (pair defs #> PN);
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   727
    fun select (PN (defs, modls)) (Module module) =
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   728
      module
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   729
      |> Graph.subgraph (Graph.all_succs module (defs @ map fst modls))
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   730
      |> fold (fn (name, modls) => Graph.map_node name (select modls)) modls
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   731
      |> Module;
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   732
  in
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   733
    Module modl
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   734
    |> select (fold (mk_ipath o dest_name)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   735
         (filter NameSpace.is_qualified names) (PN ([], [])))
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   736
    |> dest_modl
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   737
  end;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   738
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   739
fun imports_of modl name =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   740
  let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   741
    fun imports prfx [] modl =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   742
          []
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   743
      | imports prfx (m::ms) modl =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   744
          map (cons m) (imports (prfx @ [m]) ms ((dest_modl oo Graph.get_node) modl m))
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   745
          @ map single (Graph.imm_succs modl m);
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   746
  in
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   747
    modl
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   748
    |> imports [] name 
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   749
    |> map NameSpace.pack
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   750
  end;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   751
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   752
fun check_samemodule names =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   753
  fold (fn name =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   754
    let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   755
      val modn = (fst o dest_name) name
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   756
    in
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   757
     fn NONE => SOME modn
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   758
      | SOME mod' => if modn = mod' then SOME modn
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   759
          else error "inconsistent name prefix for simultanous names"
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   760
    end
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   761
  ) names NONE;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   762
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   763
fun check_funeqs eqs =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   764
  (fold (fn (pats, _) =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   765
    let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   766
      val l = length pats
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   767
    in
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   768
     fn NONE => SOME l
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   769
      | SOME l' => if l = l' then SOME l
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   770
          else error "function definition with different number of arguments"
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   771
    end
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   772
  ) eqs NONE; eqs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   773
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   774
fun check_prep_def modl Undef =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   775
      Undef
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   776
  | check_prep_def modl (d as Prim _) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   777
      d
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   778
  | check_prep_def modl (Fun (eqs, d)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   779
      Fun (check_funeqs eqs, d)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   780
  | check_prep_def modl (d as Typesyn _) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   781
      d
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   782
  | check_prep_def modl (d as Datatype (_, insts)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   783
      if null insts
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   784
      then d
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   785
      else error "attempted to add datatype with bare instances"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   786
  | check_prep_def modl (Datatypecons dtco) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   787
      error "attempted to add bare datatype constructor"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   788
  | check_prep_def modl (d as Class ((_, (v, membrs)), insts)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   789
      if null insts
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   790
      then
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   791
        if member (op =) (map fst (Library.flat (map (fst o snd) membrs))) v
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   792
        then error "incorrectly abstracted class type variable"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   793
        else d
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   794
      else error "attempted to add class with bare instances"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   795
  | check_prep_def modl (Classmember _) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   796
      error "attempted to add bare class member"
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   797
  | check_prep_def modl (Classinst ((d as ((class, (tyco, arity)), _), memdefs))) =
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   798
      let
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   799
        val Class ((_, (v, membrs)), _) = get_def modl class;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   800
        val _ = if length memdefs > length memdefs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   801
          then error "too many member definitions given"
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   802
          else ();
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   803
        fun instant (w, ty) (var as (v, _)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   804
          if v = w then ty else IVarT var;
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   805
        fun mk_memdef (m, (ctxt, ty)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   806
          case AList.lookup (op =) memdefs m
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   807
           of NONE => error ("missing definition for member " ^ quote m)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   808
            | SOME (eqs, (ctxt', ty')) =>
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   809
                if eq_itype (instant_itype (instant (v, tyco `%% map IVarT arity)) ty, ty')
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   810
                then (m, (check_funeqs eqs, (ctxt', ty')))
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   811
                else error ("inconsistent type for member definition " ^ quote m)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   812
      in Classinst (d, map mk_memdef membrs) end;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   813
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   814
fun postprocess_def (name, Datatype ((_, constrs), _)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   815
      (check_samemodule (name :: map fst constrs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   816
      fold (fn (co, _) =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   817
        ensure_def (co, Datatypecons name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   818
        #> add_dep (co, name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   819
        #> add_dep (name, co)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   820
      ) constrs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   821
      )
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   822
  | postprocess_def (name, Class ((_, (_, membrs)), _)) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   823
      (check_samemodule (name :: map fst membrs);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   824
      fold (fn (m, _) =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   825
        ensure_def (m, Classmember name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   826
        #> add_dep (m, name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   827
        #> add_dep (name, m)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   828
      ) membrs
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   829
      )
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   830
  | postprocess_def (name, Classinst (((class, (tyco, _)), _), _)) =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   831
      map_def class (fn Datatype (d, insts) => Datatype (d, name::insts)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   832
                      | d => d)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   833
      #> map_def class (fn Class (d, insts) => Class (d, name::insts))
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   834
  | postprocess_def _ =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   835
      I;
18380
9668764224a7 substantial improvements for class code generation
haftmann
parents: 18361
diff changeset
   836
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   837
fun succeed some (_, modl) = (Succeed some, modl);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   838
fun fail msg (_, modl) = (Fail ([msg], NONE), modl);
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   839
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   840
fun check_fail _ (Succeed dst, trns) = (dst, trns)
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   841
  | check_fail msg (Fail (msgs, e), _) = raise FAIL (msg::msgs, e);
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   842
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   843
fun select_generator _ src [] modl =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   844
      (SOME src, modl) |> fail ("no code generator available")
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   845
  | select_generator mk_msg src gens modl =
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   846
      let
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   847
        fun handle_fail msgs f =
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   848
          let
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   849
            in
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   850
              if ! soft_exc
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   851
              then
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   852
                (SOME src, modl) |> f
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   853
                handle FAIL exc => (Fail exc, modl)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   854
                     | e => (Fail (msgs, SOME e), modl)
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   855
              else
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   856
                (SOME src, modl) |> f
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   857
                handle FAIL exc => (Fail exc, modl)
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   858
            end;
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   859
        fun select msgs [(gname, gen)] =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   860
              handle_fail (msgs @ [mk_msg gname]) (gen src)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   861
          | select msgs ((gname, gen)::gens) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   862
              let
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   863
                val msgs' = msgs @ [mk_msg gname]
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   864
              in case handle_fail msgs' (gen src)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   865
               of (Fail (_, NONE), _) =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   866
                   select msgs' gens
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   867
               | result => result
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   868
          end;
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   869
      in select [] gens end;
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   870
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   871
fun gen_ensure_def defgens msg name (dep, modl) =
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   872
  let
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   873
    val msg' = case dep
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   874
     of NONE => msg
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   875
      | SOME dep => msg ^ ", with dependency " ^ quote dep;
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   876
    fun add_dp NONE = I
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   877
      | add_dp (SOME dep) =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   878
          debug 9 (fn _ => "adding dependency " ^ quote dep ^ " -> " ^ quote name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   879
          #> add_dep (dep, name);
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   880
    fun prep_def def modl =
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   881
      (check_prep_def modl def, modl);
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   882
  in
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   883
    modl
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   884
    |> (if can (get_def modl) name
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   885
        then
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   886
          debug 9 (fn _ => "asserting node " ^ quote name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   887
          #> add_dp dep
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   888
        else
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   889
          debug 9 (fn _ => "allocating node " ^ quote name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   890
          #> add_def (name, Undef)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   891
          #> add_dp dep
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   892
          #> debug 9 (fn _ => "creating node " ^ quote name)
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   893
          #> select_generator (fn gname => "trying code generator "
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
   894
               ^ gname ^ " for definition of " ^ quote name) name defgens
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   895
          #> debug 9 (fn _ => "checking creation of node " ^ quote name)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   896
          #> check_fail msg'
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   897
          #-> (fn def => prep_def def)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   898
          #-> (fn def =>
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   899
             debug 10 (fn _ => "addition of " ^ name
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   900
               ^ " := " ^ (Pretty.output o pretty_def) def)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   901
          #> debug 10 (fn _ => "adding")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   902
          #> ensure_def (name, def)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   903
          #> debug 10 (fn _ => "postprocessing")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   904
          #> postprocess_def (name, def)
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   905
          #> debug 10 (fn _ => "adding done")
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   906
       ))
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   907
    |> pair dep
18170
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   908
  end;
73ce773f12de added module system
haftmann
parents: 18169
diff changeset
   909
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   910
fun start_transact f modl =
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   911
  let
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   912
    fun handle_fail f modl =
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
   913
      (((NONE, modl) |> f)
18231
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   914
      handle FAIL (msgs, NONE) =>
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   915
        (error o cat_lines) ("code generation failed, while:" :: msgs))
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   916
      handle FAIL (msgs, SOME e) =>
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   917
        ((writeln o cat_lines) ("code generation failed, while:" :: msgs); raise e);
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   918
  in
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   919
    modl
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   920
    |> handle_fail f
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   921
    |-> (fn x => fn (_, module) => (x, module))
2eea98bbf650 improved failure tracking
haftmann
parents: 18216
diff changeset
   922
  end;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   923
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   924
18335
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   925
99baddf6b0d0 various improvements
haftmann
parents: 18330
diff changeset
   926
(** generic transformation **)
18304
684832c9fa62 minor improvements
haftmann
parents: 18282
diff changeset
   927
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   928
fun map_def_fun f (Fun funn) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   929
      Fun (f funn)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   930
  | map_def_fun _ def = def;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   931
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   932
fun map_def_fun_expr f (eqs, cty) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   933
  (map (fn (ps, rhs) => (map f ps, f rhs)) eqs, cty);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   934
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   935
fun eta_expand query =
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   936
  let
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   937
    fun eta e =
18865
31aed965135c minor cleanups
haftmann
parents: 18852
diff changeset
   938
     case unfold_const_app e
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   939
      of SOME (((f, ty), ls), es) =>
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   940
          let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   941
            val delta = query f - length es;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   942
            val add_n = if delta < 0 then 0 else delta;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   943
            val tys =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   944
              (fst o unfold_fun) ty
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   945
              |> curry Library.drop (length es)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   946
              |> curry Library.take add_n
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   947
            val add_vars =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   948
              Term.invent_names (fold expr_names es []) "x" add_n ~~ tys;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   949
          in
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   950
            add_vars `|--> IConst ((f, ty), ls) `$$ es `$$ map IVarE add_vars
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   951
          end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   952
       | NONE => map_iexpr eta e;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   953
  in (map_defs o map_def_fun o map_def_fun_expr) eta end;
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   954
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   955
val eta_expand_poly =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   956
  let
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   957
    fun eta (funn as ([([], e)], cty as (sortctxt, (ty as IFun (ty1, ty2))))) =
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   958
          if (not o null) sortctxt
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   959
            orelse null (type_vnames ty [])
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   960
          then funn
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   961
          else
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   962
            let
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   963
              val add_var = (hd (Term.invent_names (expr_names e []) "x" 1), ty1)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   964
            in (([([IVarE add_var], add_var `|-> e)], cty)) end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   965
      | eta funn = funn;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   966
  in (map_defs o map_def_fun) eta end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   967
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   968
val unclash_vars = 
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   969
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   970
    fun unclash (eqs, (sortctxt, ty)) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   971
      let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   972
        val used_expr =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   973
          fold (fn (pats, rhs) => fold expr_names pats #> expr_names rhs) eqs [];
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   974
        val used_type = map fst sortctxt;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   975
        val clash = gen_union (op =) (used_expr, used_type);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   976
        val rename_map = fold_map (fn c => invent c #-> (fn c' => pair (c, c'))) clash [] |> fst;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   977
        fun rename (v, sort) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   978
          (perhaps (AList.lookup (op =) rename_map) v, sort);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   979
        val rename_typ = instant_itype (IVarT o rename);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   980
        val rename_expr = map_iexpr_itype rename_typ;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   981
        fun rename_eq (args, rhs) = (map rename_expr args, rename_expr rhs)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   982
      in
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   983
        (map rename_eq eqs, (map rename sortctxt, rename_typ ty))
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   984
      end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   985
  in (map_defs o map_def_fun) unclash end;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   986
18172
8ff5bcfae27a added generic transformators
haftmann
parents: 18170
diff changeset
   987
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   988
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   989
(** generic serialization **)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   990
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   991
(* resolving *)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
   992
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   993
structure NameMangler = NameManglerFun (
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   994
  type ctxt = (string * string -> string) * (string -> string option);
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   995
  type src = string * string;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   996
  val ord = prod_ord string_ord string_ord;
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   997
  fun mk (preprocess, validate) ((shallow, name), 0) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
   998
        (case validate (preprocess (shallow, name))
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
   999
         of NONE => name
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1000
          | _ => mk (preprocess, validate) ((shallow, name), 1))
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1001
    | mk (preprocess, validate) (("", name), i) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1002
        preprocess ("", name ^ "_" ^ string_of_int (i+1))
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1003
        |> perhaps validate
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1004
    | mk (preprocess, validate) ((shallow, name), i) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1005
        preprocess (shallow, shallow ^ "_" ^ name ^ "_" ^ string_of_int (i+1))
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1006
        |> perhaps validate;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1007
  fun is_valid _ _ = true;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1008
  fun maybe_unique _ _ = NONE;
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1009
  fun re_mangle _ dst = error ("no such definition name: " ^ quote dst);
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1010
);
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1011
18885
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1012
fun mk_deresolver module nsp_conn preprocess validate =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1013
  let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1014
    datatype tabnode = N of string * tabnode Symtab.table option;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1015
    fun mk module manglers tab =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1016
      let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1017
        fun mk_name name =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1018
          case NameSpace.unpack name
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1019
           of [n] => ("", n)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1020
            | [s, n] => (s, n);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1021
        fun in_conn (shallow, conn) =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1022
          member (op = : string * string -> bool) conn shallow;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1023
        fun add_name name =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1024
          let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1025
            val n as (shallow, _) = mk_name name;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1026
            fun diag (nm as (name, n')) = (writeln ("resolving " ^ quote name ^ " to " ^ quote n'); nm);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1027
          in
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1028
            AList.map_entry_yield in_conn shallow (
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1029
              NameMangler.declare (preprocess, validate) n
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1030
              #-> (fn n' => pair (name, n'))
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1031
            ) #> apfst the #> apfst diag
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1032
          end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1033
        val (renamings, manglers') =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1034
          fold_map add_name (Graph.keys module) manglers;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1035
        fun extend_tab (n, n') =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1036
          if (length o NameSpace.unpack) n = 1
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1037
          then
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1038
            Symtab.update_new
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1039
              (n, N (n', SOME (mk ((dest_modl o Graph.get_node module) n) manglers' Symtab.empty)))
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1040
          else
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1041
            Symtab.update_new (n, N (n', NONE));
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1042
      in fold extend_tab renamings tab end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1043
    fun get_path_name [] tab =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1044
          ([], SOME tab)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1045
      | get_path_name [p] tab =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1046
          let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1047
            val _ = writeln ("(1) " ^ p);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1048
            val SOME (N (p', tab')) = Symtab.lookup tab p
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1049
          in ([p'], tab') end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1050
      | get_path_name [p1, p2] tab =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1051
          let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1052
            val _ = (writeln o prefix "(2) " o NameSpace.pack) [p1, p2];
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1053
          in case Symtab.lookup tab p1
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1054
           of SOME (N (p', SOME tab')) => 
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1055
                let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1056
                  val _ = writeln ("(2) 'twas a module");
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1057
                  val (ps', tab'') = get_path_name [p2] tab'
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1058
                in (p' :: ps', tab'') end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1059
            | NONE =>
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1060
                let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1061
                  val _ = writeln ("(2) 'twas a definition");
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1062
                  val SOME (N (p', NONE)) = Symtab.lookup tab (NameSpace.pack [p1, p2])
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1063
                in ([p'], NONE) end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1064
          end
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1065
      | get_path_name (p::ps) tab =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1066
          let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1067
            val _ = (writeln o prefix "(3) " o commas) (p::ps);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1068
            val SOME (N (p', SOME tab')) = Symtab.lookup tab p
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1069
            val (ps', tab'') = get_path_name ps tab'
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1070
          in (p' :: ps', tab'') end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1071
    fun deresolv tab prefix name =
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1072
      if (is_some o Int.fromString) name
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1073
      then name
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1074
      else let
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1075
        val _ = writeln ("(0) prefix: " ^ commas prefix);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1076
        val _ = writeln ("(0) name: " ^ name)
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1077
        val (common, (_, rem)) = get_prefix (op =) (prefix, NameSpace.unpack name);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1078
        val _ = writeln ("(0) common: " ^ commas common);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1079
        val _ = writeln ("(0) rem: " ^ commas rem);
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1080
        val (_, SOME tab') = get_path_name common tab;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1081
        val (name', _) = get_path_name rem tab';
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1082
      in NameSpace.pack name' end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1083
  in deresolv (mk module (AList.make (K NameMangler.empty) nsp_conn) Symtab.empty) end;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1084
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1085
val _ : module -> string list list -> (string * string -> string) -> (string -> string option) -> string list -> string -> string = mk_deresolver;
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1086
ee8b5c36ba2b substantial cleanup and simplifications
haftmann
parents: 18865
diff changeset
  1087
fun mk_resolvtab' nsp_conn validate module =
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1088
  let
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
  1089
    fun validate' n = perhaps validate n;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1090
    fun ensure_unique prfix prfix' name name' (locals, tab) =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1091
      let
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1092
        fun uniquify name n =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1093
          let
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1094
            val name' = if n = 0 then name else name ^ "_" ^ string_of_int n
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1095
          in
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1096
            if member (op =) locals name'
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1097
            then uniquify name (n+1)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1098
            else case validate name
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1099
              of NONE => name'
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1100
               | SOME name' => uniquify name' n
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1101
          end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1102
        val name'' = uniquify name' 0;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1103
      in
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1104
        (locals, tab)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1105
        |> apsnd (Symtab.update_new
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1106
             (NameSpace.pack (prfix @ [name]), NameSpace.pack (prfix' @ [name''])))
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1107
        |> apfst (cons name'')
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1108
        |> pair name''
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1109
      end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1110
    fun fill_in prfix prfix' node tab =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1111
      let
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1112
        val keys = Graph.keys node;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1113
        val nodes = AList.make (Graph.get_node node) keys;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1114
        val (mods, defs) =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1115
          nodes
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1116
          |> List.partition (fn (_, Module _) => true | _ => false)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1117
          |> apfst (map (fn (name, Module m) => (name, m)))
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1118
          |> apsnd (map fst)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1119
        fun modl_validate (name, modl) (locals, tab) =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1120
          (locals, tab)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1121
          |> ensure_unique prfix prfix' name name
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1122
          |-> (fn name' => apsnd (fill_in (prfix @ [name]) (prfix @ [name']) modl))
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1123
        fun ensure_unique_sidf sidf =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1124
          let
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1125
            val [shallow, name] = NameSpace.unpack sidf;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1126
          in
18516
4424e2bce9af slightly improved serialization
haftmann
parents: 18515
diff changeset
  1127
            nsp_conn
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1128
            |> get_first
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1129
                (fn grp => if member (op =) grp shallow
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1130
                  then grp |> remove (op =) shallow |> SOME else NONE)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1131
            |> these
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1132
            |> map (fn s => NameSpace.pack [s, name])
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1133
            |> exists (member (op =) defs)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1134
            |> (fn b => if b then sidf else name)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1135
          end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1136
        fun def_validate sidf (locals, tab) =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1137
          (locals, tab)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1138
          |> ensure_unique prfix prfix' sidf (ensure_unique_sidf sidf)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1139
          |> snd
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1140
      in
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1141
        ([], tab)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1142
        |> fold modl_validate mods
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1143
        |> fold def_validate defs
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1144
        |> snd
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1145
      end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1146
  in
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1147
    Symtab.empty
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1148
    |> fill_in [] [] module
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1149
  end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1150
18282
98431741bda3 added haskell serializer
haftmann
parents: 18247
diff changeset
  1151
fun mk_resolv tab =
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1152
  let
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1153
    fun resolver modl name =
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1154
      if NameSpace.is_qualified name then
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1155
        let
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1156
          val _ = debug 12 (fn name' => "resolving " ^ quote name ^ " in "
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1157
               ^ (quote o NameSpace.pack) modl) ();
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1158
          val modl' = if null modl then [] else
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1159
            (NameSpace.unpack o the o Symtab.lookup tab o NameSpace.pack) modl;
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1160
          val name' = (NameSpace.unpack o the o Symtab.lookup tab) name
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1161
        in
18454
6720b5010a57 slight improvements in name handling
haftmann
parents: 18441
diff changeset
  1162
          (NameSpace.pack o snd o snd o get_prefix (op =)) (modl', name')
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1163
          |> debug 12 (fn name' => "resolving " ^ quote name ^ " to "
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1164
               ^ quote name' ^ " in " ^ (quote o NameSpace.pack) modl)
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1165
        end
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1166
      else name
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1167
  in resolver end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1168
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1169
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1170
(* serialization *)
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1171
18756
5eb3df798405 more general serializer
haftmann
parents: 18702
diff changeset
  1172
fun serialize seri_defs seri_module validate nsp_conn name_root module =
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1173
  let
18912
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
  1174
    val resolver = mk_deresolver module nsp_conn snd validate;
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
  1175
(*     val resolver = mk_resolv (mk_resolvtab' nsp_conn validate module);  *)
18702
7dc7dcd63224 substantial improvements in code generator
haftmann
parents: 18517
diff changeset
  1176
    fun mk_name prfx name =
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1177
      let
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1178
        val name_qual = NameSpace.pack (prfx @ [name])
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1179
      in (name_qual, resolver prfx name_qual) end;
18756
5eb3df798405 more general serializer
haftmann
parents: 18702
diff changeset
  1180
    fun mk_contents prfx module =
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1181
      List.mapPartial (seri prfx)
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1182
        ((map (AList.make (Graph.get_node module)) o rev o Graph.strong_conn) module)
18756
5eb3df798405 more general serializer
haftmann
parents: 18702
diff changeset
  1183
    and seri prfx ([(name, Module modl)]) =
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1184
          seri_module (map (resolver []) (imports_of module (prfx @ [name])))
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1185
            (mk_name prfx name, mk_contents (prfx @ [name]) modl)
18756
5eb3df798405 more general serializer
haftmann
parents: 18702
diff changeset
  1186
      | seri prfx ds =
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1187
          seri_defs (resolver prfx)
18912
dd168daf172d improvement in devarifications
haftmann
parents: 18885
diff changeset
  1188
            (map (fn (name, Def def) => (fst (mk_name prfx name), def)) ds)
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1189
  in
18850
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1190
    seri_module (map (resolver []) (Graph.strong_conn module |> List.concat |> rev))
92ef83e5eaea various improvements
haftmann
parents: 18812
diff changeset
  1191
      (("", name_root), (mk_contents [] module))
18216
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1192
  end;
db7d43b25c99 added serializer
haftmann
parents: 18172
diff changeset
  1193
18169
45def66f86cb added modules for code generator generation two, not operational yet
haftmann
parents:
diff changeset
  1194
end; (* struct *)