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] |
My first reaction is that it seems extremely intrusive on the whole Scheme system. A plain old dynamic dispatch set! may be new to Scheme, but at least it a) has a precedent in Scheme. Tons of Scheme is dynamic dispatch already like (write) (display) (+) (equal?) b) avoids all this crud with adding slots to closures and other intrusive stuff. But I'll think more about it. Maybe there is some beauty there that I'm too thick to see :-) 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)) (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))) 8. He can add new methods to the setter with (add-method! (setter G) M) 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. 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. No pre-created <getter-with-setter>:s exist until we have added code for automatic inlining to the interpreter. Opinions? /mdj