on Sun Jun 05 2016, Tim Vermeulen <[email protected]> wrote:
> Most standard library functions that take a closure allow that closure > to throw (and those functions are subsequently marked with > rethrows). sort and sorted are exceptions to this. I couldn’t find > this documented anywhere, but I assume this is because sorting can > happen in-place and it would be impossible to restore the array to its > original state without giving up performance. Correct me if I’m wrong. The guarantee that a function completes successfully or has no effect is called the “strong guarantee.” There's nothing wrong, however, with operations that only give the “basic guarantee”—that invariants are preserved—which would leave the collection in an indeterminate state. > I’d like to propose that we let sort rethrow anyways, and leave the > array in an intermediate state (where the elements are in an arbitrary > order) when an error is thrown. As long as this is properly > documented, this shouldn’t lead to any confusion. I have only one concern with this, which is that a completely indeterminate state may not give us sufficient permission to detect and prevent nonsense. Should the compiler be allowed to refuse to compile code that can be statically shown to use partially-modified state, and the library allowed to mark any such state as unusable at runtime? A cheap approximation of this kind of marking for Array might be to call `clear(keepingCapacity: true)`, in debug builds only, when an error is thrown through a mutating method. That would (almost) ensure you had to assign into or clear the array before doing anything with it. When we first designed exception-safety for C++, details of the standardization schedule made it important to reduce the model's complexity to an absolute minimum, so we kept the idea of unusable-until-reassigned state out of the picture. But a simple model that makes nonsense code legal is not really in keeping with Swift, especially when we can detect the nonsense. > Best of all, it would allow sorted to rethrow as well in which there > is no room for confusion at all because it doesn’t mutate any of the > user’s variables. Yes, about sorted there is no question whatsoever because there is no mutation. -- -Dave _______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
