For the final project in CS 51: Abstraction and Design in Computation, I implemented three interpreters in OCaml, varying in semantic models: a substitution model, a dynamically scoped environment model, and a lexically scoped environment model with atomic types, unary operators, and binary operators.