let x = 2; y = 3; in (x y) let x: (Int) = let y: (Int) = { x }; in y; y: (Int) = 3; f: (((Int) -> (Int)) -> Int) = [a, b] { ((plus a) b) }; in ((f x) y) --- LetStatement: "let" [Assignment ";"]+ "in" Body Binding: Ident (":" TypeDecl)? Assignment: Binding "=" Statement Statement: LetStatement | Abstraction Computation: Identifier | Application | Abstraction Application: "(" Computation Computation ")" Abstraction: "[" UncurriedArguments "]" "{" Computation "}" LetStatement: "let" Ident (":" TypeDecl)? "=" Computation in BaseType: Identifier Arrow: TypeDecl "->" TypeDecl TypeDecl: "(" BaseType | Arrow ")" Binding: Identifier (":" TypeDecl)? UncurriedArguments: Identifier ["," Identifier]+ Abstraction: UncurriedArguments "{" Binding "=>" Computation "}"