Guile Mailing List Archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: "Current" solution for generalized set!
Maciej Stachowiak <mstachow@MIT.EDU> writes:
> mdj@nada.kth.se writes:
[...]
> > 4. Assume that G is an instance of <getter-with-setter>.
> > Then G has the following properties:
> > a) G has no slots
> > b) There exists no mutator which can alter G.
> > c) G =/= (getter G)
> > d) (G A1 ...) <=> ((getter G) A1 ...)
> > e) (set! (G A1 ...) V) <=> ((setter G) V A1 ...)
[...]
> > 6. (define-metod (add-method! ((g <getter-with-setter>) (m <method>)))
> > (add-method! (getter g) m))
> ^^^^^^
>
> Why is this necessary? WOuldn't applying a getter-with-setter apply
> the getter anyway and therefore have the correct semantics?
It's because the default `add-method!' needs a <generic> as its first
argument. While `g' above is a <getter-with-setter>, (getter g) is a
<generic> (hopefully!).
[...]
> That's the solution I was going to suggest, allong with the following
> convenience macro (which would be useful more generally):
>
> (defmacro define-setter (name setter)
> (let ((old-name (gensym)))
> `(let ((,old-name ,name))
> (set! ,name (make-getter-with-setter
> (if (getter-with-setter? ,name)
> (getter ,name)
> ,name)
> ,setter)))))
Good idea.
[...]
> A smarter
> `define-setter' could work more like define [allowing, e.g.
>
> (define-setter (getter-name arg1 arg2 arg3 value)
> (some code))
>
> ] but this may be confusing.
Why?
> > 8. He can add new methods to the setter with
> >
> > (add-method! (setter G) M)
> >
>
> I am pretty sure this would work without the need for point 6, and
> while making use of my above suggestion.
I don't understand. Could you explain it a bit further?
> Noting my above suggestion, it would even be possibly to have
> `define-setter-method' automatically create a setter generic for the
> generic by doing a trick like `define-setter' if it is not already a
> `setter-with-getter'.
Yes.
> So you'd copy the innards of the closure when you call
> `make-getter-with-setter'? For correct semantics they would have to
> share code and environments....
Why? The semantics will also be correct if the <getter-with-setter>
closure calls the getter.
(As an optimization, though, the code and environment pointers will be
copied from the getter if the getter is a closure.)
> I still think it should be called a <procedure-with-setter> (`getter'
> could be interpreted as possibly referring to a macro) but I don't
> care too much.
I think I like the name <procedure-with-setter> as well, but you still
haven't given me any arguments! :)
/mdj
Guile Home |
Main Index |
Thread Index