Article View: comp.lang.clos
Article #234Re: Is CLOS Object-Oriented ???
From: Joe Konstan
Date: Sat, 17 Nov 1990 00:36
Date: Sat, 17 Nov 1990 00:36
45 lines
2331 bytes
2331 bytes
In article <PAB.90Nov16151057@3-mile-island.lucid.com>, pab@lucid.com (Peter Benson)
writes:
|>
|> In article <27443D49.2BE8@wilbur.coyote.trw.com> scott@wiley.uucp (Scott Simpson)
writes:
|> I thought they were the same too until someone at work came up with
|> this problem in Flavors:
|>
|> (setf (send self (send button :slot-to-change)) value)
|>
|> What is happening is that (send button :slot-to-change) returns the
|> name of a slot to change and that slot is changed to VALUE on the
|> object SELF. How do you do this is CLOS?
|>
|> It's not a generic function doing it, but the designers of CLOS provided
|> slot-value for occasions like this.
|>
|> (setf (slot-value self (slot-to-change button)) value)
Unfortunately, this is not an acceptable substitute in many situations. Since
the setf method can have customized features (indeed, there does not even need
to be a slot defined to have a setf method) this hack won't work.
I agree that slot-value is a useful (if dangerous) feature, but it doesn't
take the place of the above case. One bad (but functional) solution is:
(eval `(setf (,(slot-to-change button) self) value))
Which forces run-time evaluation, but is semantically correct. A simple macro
can hide this detail as follows:
(defmacro setf-indirect (indirect object new-value)
`(setf (,(eval indirect) ,object) ,new-value))
And this could be called as:
(setf-indirect (slot-to-change button) self value)
I'm sure people could write this into nicer syntax, but this seems to be
the best approach to solving that problem for occasional use. If
high-performance were an issue, I'd suggest storing a pointer to the
setf-method instead of the name of the slot.
Joe Konstan
Technical Details
Message-ID:
<39639@ucbvax.BERKELEY.EDU>Path:
arc1-ca.pugleaf.net!utzoo!attcan!uunet!nih-csl!lhc!mimsy!dftsrv!ames!pasteur!ucbvax!elmer-fudd.berkeley.edu!konstanReferences:
<1990Nov15.101847.26285@diku.dk> <3904@s3.ireq.hydro.qc.ca> <PAB.90Nov16151057@3-mile-island.lucid.com>Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!attcan!uunet!nih-csl!lhc!mimsy!dftsrv!ames!pasteur!ucbvax!elmer-fudd.berkeley.edu!konstan From: konstan@elmer-fudd.berkeley.edu (Joe Konstan) Newsgroups: comp.lang.clos Subject: Re: Is CLOS Object-Oriented ??? Message-ID: <39639@ucbvax.BERKELEY.EDU> Date: 17 Nov 90 00:36:18 GMT References: <1990Nov15.101847.26285@diku.dk> <3904@s3.ireq.hydro.qc.ca> <PAB.90Nov16151057@3-mile-island.lucid.com> Sender: usenet@ucbvax.BERKELEY.EDU Reply-To: konstan@elmer-fudd.berkeley.edu (Joe Konstan) Distribution: comp Lines: 45