Module Lambda_lib.Ast

type name = string
type unop =
  1. | Neg
    (*

    -e

    *)
type binop =
  1. | Add
    (*

    e1 + e2

    *)
  2. | Sub
    (*

    e1 - e2

    *)
  3. | Mul
    (*

    e1 * e2

    *)
  4. | Div
    (*

    e1 / e2

    *)
type cmpop =
  1. | Eq
    (*

    e1 = e2

    *)
  2. | Neq
    (*

    e1 <> e2

    *)
  3. | Lt
    (*

    e1 < e2

    *)
  4. | Le
    (*

    e1 <= e2

    *)
  5. | Gt
    (*

    e1 > e2

    *)
  6. | Ge
    (*

    e1 >= e2

    *)
type expr =
  1. | Var of name
    (*

    Variable, like x

    *)
  2. | Int of int
    (*

    Integer literal

    *)
  3. | Abs of name * expr
    (*

    Function: fun x -> e

    *)
  4. | App of expr * expr
    (*

    Function application: e1 e2

    *)
  5. | Let of name * expr * expr
    (*

    Non-recursive let: let x = e1 in e2

    *)
  6. | Let_rec of name * expr * expr
    (*

    Recursive let: let rec f = e1 in e2

    *)
  7. | If of expr * expr * expr
    (*

    If expression

    *)
  8. | Unop of unop * expr
    (*

    Unary operation

    *)
  9. | Binop of binop * expr * expr
    (*

    Arithmetic operation

    *)
  10. | Cmp of cmpop * expr * expr
    (*

    Comparison

    *)
type program = expr