code: func (v *ValuerEval) Eval(expr Expr) interface{} {
  	if expr == nil {
  		return nil
  	}
  
  	switch expr := expr.(type) {
  	case *BinaryExpr:
  		return v.evalBinaryExpr(expr)
  	case *BooleanLiteral:
  		return expr.Val
  	case *IntegerLiteral:
  		return expr.Val
  	case *NumberLiteral:
  		return expr.Val
  	case *UnsignedLiteral:
  		return expr.Val
  	case *ParenExpr:
  		return v.Eval(expr.Expr)
  	case *RegexLiteral:
  		return expr.Val
  	case *StringLiteral:
  		return expr.Val
  	case *Call:
  		if valuer, ok := v.Valuer.(CallValuer); ok {
  			var args []interface{}
  			if len(expr.Args) > 0 {
  				args = make([]interface{}, len(expr.Args))
  				for i := range expr.Args {
  					args[i] = v.Eval(expr.Args[i])
  				}
  			}
  			val, _ := valuer.Call(expr.Name, args)
  			return val
  		}
  		return nil
  	case *VarRef:
  		val, _ := v.Valuer.Value(expr.Val)
  		return val
  	default:
  		return nil
  	}
  }
docs: // Eval evaluates an expression and returns a value.