CLIM mail archive

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

Using DEFINE-COMMAND



    Date: Thu, 21 Feb 91 10:36 EST
    From: Jeff Morrill <jmorrill@bbn.com>

    I am using CLIM 0.9.54 to define a system that is not
    an application per se, but rather a toolbox that gets
    embedded in other applications.  One of the things that
    the applications inherit is of course a command table.

    What is the "canonical" way to define commands that
    are not associated with any single application?  I started
    off doing something like

    (define-command com-print-number
	    ((object 'number))
      (print object))

    (add-command-to-command-table "Print Number"
	      'com-print-number 'my-comtab)

    But one quickly discovers that EXECUTE-COMMAND funcalls
    the command using the application frame as a first, hidden
    argument.  (WHY?)  It would appear that I should be using
    DEFINE-FRAME-COMMAND instead, which adds the hidden frame
    argument invisibly:

    (define-frame-command my-comtab com-print-number
	    ((object 'number))
      (print object))

    I suppose it makes sense to have the frame as a hidden
    argument, since there is no special binding such as
    dw:*program-frame*.  So should user code ever invoke
    DEFINE-COMMAND?

In 0.9, there are three things that D-F-C does over D-C:
 -- D-F-C can provide automatic ways of adding the command to the
    frame's command table.
 -- D-F-C gives the code access to the frame associated with this
    invocation of the command, whereas D-C should not assume anything
    about particular frames.
 -- D-F-C allows the same command to exist on several frames, e.g.,
    COM-EXIT, and to write :before/:after/:around methods for the
    command.
The first is a convenience.  It is the interaction of the last two that
is troubling you.  The third is accomplished by defining the command as
a method on the frame type, so the frame type is a CLOS specializer and
thus must be present.  That makes the second easy: since the frame is an
argument the forms WITH-FRAME and WITH-FRAME-SLOTS simply reference that
argument.  That's the way it exists today.

It is worth reviewing which of those semantic differences between D-F-C
and D-C are desirable.  Since the first is a convenience, it shouldn't
have any implementation impact.  There are other ways of accomplishing
the second, e.g., with a concept similar to dw:*program-frame*.  I don't
know if the third has actually been exploited, and this is where
customer feedback would help.  If it was a "We can do this, let's try
it" and nobody uses it, it might be flushable and we can then let users
intermix usages of D-F-C and D-C.  Until now, I didn't realize the third
semantic difference existed, and for me the bookkeeping overhead to make
sure I wasn't making mistakes would prevent me from trying to.

Unfortunately, this may not be patchable into a world that has already
done DEFINE-FRAME-COMMAND (and DEFINE-/frame-type/-COMMAND) without
finding and redoing all those DEFINE-FRAME-COMMANDs.  I.e., the changes
would be compatable at the user source level, but not the user binary
level.  I'll make a note of this for consideration for CLIM 2.0 in the
event it isn't reorganized for 0.9.  (I don't know what 1.0 does.)

0,,

Follow-Ups: References:

Main Index | Thread Index