This is the mail archive of the guile@cygnus.com mailing list for the guile project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
mdj@nada.kth.se writes:
> Here's a summary of the properties of generalized dynamic set! as they
> look now:
>
> 1. <getter-with-setter> is a subclass of <procedure>
>
> 2. Instances of <getter-with-setter> are created with the constructor
> (make-getter-with-setter GETTER SETTER), and the selectors `getter'
> and `setter' are procedures.
>
> 3. Just as with other primitive types, like <procedure>, it is not
> possible to create a <getter-with-setter> with `make'.
>
> 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 ...)
>
> 5. The properties in 4 hold independently of Goops. The classes in 1
> are "pasted on" afterwards by Goops, just as for the other
> primitive types (<symbol> etc).
>
> 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?
>
> (This assumes that add-method is a generic. Does anyone know if
> there is a special reason why add-method isn't a generic in
> tiny-clos?)
>
> 7. If the user wants to have a generic function with setters, he:
>
> (define g (make-getter-with-setter (make-generic) (make-generic)))
>
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)))))
The the user can freely
(define (my-getter blah1 blah2)
(some code))
(define (my-setter blah1 blah2 value)
(some other code))
(define-setter my-getter my-setter)
without adversely affecting compliability of the code. 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.
> 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.
> 9. In order not to compromise the properties of the define-like
> syntactic form `define-method', we introduce the new syntactic form
> `define-setter-method' which does the right thing.
>
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'.
> 10. An implementation in the *current* Guile interpreter could be:
>
> i) Add new setter slot to all closures. (Put a pair where the
> current procedure properties live. Let the car be the setter
> slot and the cdr the property list.)
> ii) A <getter-with-setter> is a closure with a non-#f setter slot.
>
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....
> No pre-created <getter-with-setter>:s exist until we have added
> code for automatic inlining to the interpreter.
>
> Opinions?
>
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.
- Maciej