#lang shplait

type Expr
| eNum(value :: Int)
| eAdd(lhs :: Expr, r :: Expr)
| eMul(lhs :: Expr, r :: Expr)

fun calc(e :: Expr) :: Int:
  match e
  | eNum(v): v
  | eAdd(l, r): calc(l) + calc(r)
  | eMul(l, r): calc(l) * calc(r)

check:
  calc(eMul(eNum(2), eAdd(eNum(2), eNum(3))))
  ~is 10
