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]

"Current" solution for generalized set!


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