Mark H Weaver wrote: >I'm sorry that you've written code that assumes that this is allowed, >but in Scheme all literals are immutable.
It's not a literal: the object was not constructed by the action of the reader. It was constructed by non-literal means, and merely *passed through* the reader. That's not to say your not-a-bug opinion is wrong, though. Scheme as defined by RnRS certainly doesn't support this kind of thing. It treats the print form of an expression as primary, and so doesn't like having anything unprintable in the object form. >It worked by accident in Guile 1.8, This is the bit that's really news to me. *Scheme* doesn't support it, but *Guile* is more than just Scheme, and I presumed that it was intentional that it took a more enlightened view of what constitutes an expression. If that was just an accident, then what you actually support ought to be documented. In principle it would also be a good idea to enforce this restriction in the interpreter, to avoid having this incompatibility between interpreter and compiler of the `same' implementation. > but there's simply no way to support >this robustly in an ahead-of-time compiler, which must serialize all >literals to an object file. Sure there is. The object in question is eminently serialisable: it contains only references to other serialisable data. All that needs to change is to distinguish between actual literal pairs (that can be merged) and non-literals whose distinct identity needs to be preserved. This might well be painful to add to your existing code, given the way you represent pairs. But that's a difficulty with the specific implementation, not an inherent limitation of compilation. -zefram