net@TUB.BITNET (Oliver Laumann) (03/09/90)
I still don't quite understand which objects are considered immutable in Scheme. The standard says "The constants and the strings returned by symbol->string are then the immutable objects, while all objects created by the other procedures in this Standard are mutable". Does this mean that objects returned by, say, "read" are mutable? Is the expression (string-set! (read) 0 #\a)) legal, when the call to (read) returns a non-empty string? And what about the elements of a vector constant? Is (set-car! (vector-ref '#((a b) c) 0) 'd) legal? By the way, why must vector constants be quoted? Does the evaluation of a vector constant ever return a result? Thanks, -- Oliver Laumann net@TUB.BITNET net@tub.cs.tu-berlin.de net@tub.UUCP
cph@ZURICH.AI.MIT.EDU (Chris Hanson) (03/09/90)
Date: Thu, 8 Mar 90 17:35:30 +0100 From: Oliver Laumann <net%TUB.BITNET@mitvma.mit.edu> I still don't quite understand which objects are considered immutable in Scheme. The standard says "The constants and the strings returned by symbol->string are then the immutable objects, while all objects created by the other procedures in this Standard are mutable". The basic rule is that any object that appears in your program is immutable. Thus quoted lists, quoted vectors, and any strings that appear in the text of your program are immutable. In addition, the strings returned by symbol->string are also immutable. The standard does not define any other immutable objects. Does this mean that objects returned by, say, "read" are mutable? Yes. Is the expression (string-set! (read) 0 #\a)) legal, when the call to (read) returns a non-empty string? Yes. And what about the elements of a vector constant? Is (set-car! (vector-ref '#((a b) c) 0) 'd) legal? This is not legal. Both the vector, and its elements (just like the elements of a quoted list) are objects that textually appear in your program, and thus are immutable. By the way, why must vector constants be quoted? Does the evaluation of a vector constant ever return a result? Unquoted vectors are not defined as expressions; a program containing an unquoted vector in its text is what the standard calls a "non-conforming program". I don't know any good reason why these are illegal.