I've been thinking a lot about the whole linear update issue, and I agree
that having a way to advise the system about object use without forcing a
particular paradigm (destructive or not) is a good thing. However, the
simple fact is that the pre-existing meaning of "!" in Scheme is *not*
linear update--it is destructive modification--as most obviously
demonstrated by these procedures:
set!
set-car!
set-cdr!
What would each of these mean if they were linear update anyway? They all
return unspecified values, for one thing, so if they were recast in a
linear update light, that would have to change. But let's say that you did
that, then there are still problems. For example, set-cdr! is often used to
create circular lists, but if it were defined to be nondestructive in a
particular implementation, there would be no way to do this.
set! as linear update is even trickier. In terms of setting globals, you
would have to think about it in terms of being an operation on the entire
global environment (e.g., replacing the environment with an identical one
except for a new binding for the variable in question). In terms of setting
locals, you would have to think about it in terms of being an operation on
the continuation, similarly replacing the continuation with an identical
one modulo the specified variable binding. What does it mean in these cases
to be nondestructive? And in the local variable case, what are the
implications with respect to multiple calls to the same continuation in a
system that defined these procedures nondestructively?
Let me reiterate that I like the concept of linear update. (I am pre-sold
on the overall benefits to keeping data, to the extent possible, immutable,
and this is one way to make that possible without simultaneously losing
efficiency.) However, I think it's a bad idea to usurp "!" in Scheme for
that meaning, since it will only lead to confusion--some but not all "!"
procedures one encounters would be linear-update, and some would be
required-destructive. I can already hear the screams of millions of unhappy
programmers shooting themselves in the feet. I expect I'm too late to
really influence anything, but I felt that, even at the 11th hour, it was
worth it to try.
-dan