1 (** Abstract syntax tree *)
3 (** name := namespace * symbol *)
4 type name = string * string
6 (** A type of expression. Expression does not have side-effect. *)
13 | Lambda of string list * expr
15 | If of expr * expr * expr
16 | Let of (string*expr) list * expr
17 | LetRec of (string*expr) list * expr
19 | New of name * expr list
20 | Invoke of expr * string * expr list (** (. obj (f <arg1> <arg2> ..)) *)
21 | SlotRef of expr * string (** (slot-ref <obj> <name>) *)
22 | SlotSet of expr * string * expr (** (slot-set! <obj> <name> <value>) *)
24 (** A type of statement. Statement has side-effect *)
26 | Define of string * expr
28 | Class of string * name * attr list * method_ list
30 and method_ = string * string list * expr
32 (** A tyye of program. *)
33 type program = stmt list
35 (** [map f e] applys f to all-sub expression of [e]. *)
36 val map : (expr -> expr) -> expr -> expr
38 val to_string : expr -> string
39 val to_string_stmt : stmt -> string
43 val lift_stmt : (expr->expr) -> stmt -> stmt
44 val lift_program : (expr->expr) -> program -> program