docs: public Expression2 substitute(Expression2 value, Expression2 replacement) {
      if (this.equals(value)) {
        return replacement;
      } else if (this.isConstant()) {
        return this;
      } else {
        List<Expression2> newSubexpressions = Lists.newArrayList();
        for (Expression2 sub : subexpressions) {
          newSubexpressions.add(sub.substitute(value, replacement));
        }
        return Expression2.nested(newSubexpressions);
      }
    }