separating Expr/Val interface from implementation