EConst(c:Const)
EIdent(i:String)
EParenthesis(e:Expr)
EField(e:Expr, f:String)
EBinop(op:Binop, e1:Expr, e2:Expr)
EUnop(op:Unop, e1:Expr)
ECall(e:Expr, args:Array<Expr>)
EBlock(el:Array<Expr>)
EVars(v:Array<VarDecl>)
EFunction(f:FunDecl)
EIf(econd:Expr, eif:Expr, eelse:Null<Expr>)
EDiscard
EFor(v:String, loop:Expr, block:Expr)
EReturn(e:Null<Expr>)
EBreak
EContinue
EArray(e:Expr, eindex:Expr)
EArrayDecl(el:Array<Expr>)
ESwitch(e:Expr, cases:Array<{values:Array<Expr>, expr:Expr}>, def:Null<Expr>)
EWhile(cond:Expr, loop:Expr, normalWhile:Bool)
EMeta(name:String, args:Array<Expr>, e:Expr)