///|
pub(all) struct Parameter {
  name : String
  default : Expr? // None means no default
} derive(Show, Eq, ToJson)

///|
pub(all) enum Stmt {
  Def(
    name~ : String,
    params~ : Array[Parameter],
    body~ : Array[Stmt],
    span~ : Span
  )
  If(
    clauses~ : Array[(Expr, Array[Stmt])],
    else_body~ : Array[Stmt]?,
    span~ : Span
  )
  For(vars~ : Expr, iterable~ : Expr, body~ : Array[Stmt], span~ : Span)
  Return(value~ : Expr?, span~ : Span)
  Assign(target~ : Expr, op~ : AssignOp?, value~ : Expr, span~ : Span)
  Expr(expr~ : Expr, span~ : Span)
  Load(mod~ : String, bindings~ : Array[(String, String)], span~ : Span)
  Pass(Span)
  Break(Span)
  Continue(Span)
} derive(Show, Eq, ToJson)