Apply a function on all sub-expressions of this expression and returns a new expression of the same type.
This function should return a value that is of the same class as the object that was given to it.
Should be implemented by all subclasses, but not used directly. Use subexpressions() instead, which is a cached version of this.
Returns a collection that contains all sub-expressions of this expression.
It should not be modified. In practice, it should actually be unmutable or a copy.