guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GOOPS:Can I just overload "slot-set!" under #:virtual and let alone


From: Neil Jerram
Subject: Re: GOOPS:Can I just overload "slot-set!" under #:virtual and let alone "slot-ref" ?
Date: Fri, 3 Dec 2010 01:42:19 +0000

On 3 December 2010 00:52, Nala Ginrut <address@hidden> wrote:
thanks, but my question is something like this:
...
(cache ... #:slot-ref (lambda (o) (slot-ref o 'cache)) ...) ;; ERROR
...
(sunday ... #:slot-ref (lambda (o) (slot-ref o 'cache)) ...) ;; That's OK

I could call "(slot-ref o 'cache)" in other slot except "cache", but what should I do if I need to use "(slot-ref o 'cache)" in the "cache" definition?
I used it directly and got "stack overflow". I think it may cause infinite recursive.
Actually my question can be described more explicitly: "Can I just re-define "slot-ref" or "slot-set!" any one of them but NOT both?"
Sometimes I may need a re-defined "slot-set!" but I expect to let alone "slot-ref".
Anybody catch my mind?

Yes, I think so.

The thing about #:allocation #:virtual is that there then isn't any storage for that slot name, at all, in instances of the relevant class.  So clearly a normal slot-ref can't work.

But I think I understand what you want: you don't actually want #:allocation #:virtual, but you do want some kind of customised processing when setting a slot's value; and you don't need to do anything special when reading the value.  Is that right?

If so, the simplest solution is to define your slot-setting call as something other than plain slot-set!, but which uses slot-set! internally after it has done the custom processing.

You could also define a new kind of #:allocation to implement the behaviour you're looking for, and a metaclass for classes that can contain that kind of slots, and write a compute-get-n-set method for that metaclass ... but that's quite a bit more complex.

Regards,
        Neil


reply via email to

[Prev in Thread] Current Thread [Next in Thread]