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

Re: run-time method definition



   > Date: Tue, 11 Oct 88 08:29 CDT
   > From: William D. Gooch <ai.gooch@MCC.COM>
   > Subject: LISP X based toolkits 
   > 
   >     Date: Tue, 11 Oct 88 17:25:07 JST
   >     From: Haruyuki Kawabe <kawabe@etl.jp>
   > 
   >     But it seems to me that it is too heavy in most implementations to add
   >     or remove methods at run time because of re-hashing of a method table
   >     or similar things in order to speed up of generic-function callings,....
   > 
   > It seems
   > to me that it's absolutely essential to have this kind of flexibility as
   > a CLUE user...

William, can you elaborate on why you see this approach as more flexible and why
this is essential? This is a hot topic in CLUE-land, and we're trying to get to
the bottom of it.

For CLUE, defining callbacks as (eql instance)-specialized methods (instead of
functions looked up in an a-list instance variable) has been seen mainly as an
issue of packaging and of efficiency.  Each technique gets the same job done.
Here's how the pro's and con's stack up so far.

        Alternatives:
            a.  A-list: add-callback: add (name function . args) to callbacks
                a-list. apply-callback looks up and calls function associated
                with name.

            b.  eql method: (make-instance 'standard-method ... :function
                function :lambda-list `((eql ,contact) ...)) creates a callback
                associated with a contact instance. (add-method generic-callback
                method) adds this method to a generic function. Callback is
                invoked by calling generic-callback with contact as specializer
                arg.
                        
                Pro:    Eliminates apply-callback and a-list lookup. Exploits CLOS
                        method dispatch. Contact programmer can define qualified
                        methods of callbacks.
                        
                Con:    Extra complexity: closure required to "package"
                        application-supplied callback args. Deleting a callback
                        is harder. Prevents contact and callbacks from being
                        garbage-collected. 


The concern about deleting a callback is that it would involve remove-method,
but there's no find-generic-function, and find-method requires you to recall a
callback's full lambda list.

Another efficiency concern is method dispatch vs. small a-list lookup: which is
likely to be faster?