[Openmcl-devel] How to send a message to the objc super-class ?

Gary Byers gb at clozure.com
Sun Feb 3 17:59:15 PST 2008

In the case where you want to invoke the superclass's version of
the containing method, you can use CALL-NEXT-METHOD:

(objc:defmethod (#/drawWithFrame:inView: :void)
     ((self outline-cell) frame view)
   (call-next-method frame view))

As in CL:DEFMETHOD, CALL-NEXT-METHOD is locally defined withing

That provides convenient syntax for the common case; ObjC does
allow you to invoke the superclass's version of any method.
That happens a few times in the IDE sources, and it's not
pretty ... see #/updateSelection:length:affinity: on hemlock-text-storage
in ccl/cocoa-ide/cocoa-editor.lisp.  (Aside from being ugly, the
code looks up type information at runtime.)

For that case (calling the superclass's version of some other method),
something like:

(call-superclass-method #'#/setSeletedRange:affinity:stillSelecting:
   range affinity nil)

would both look a bit less ugly and be able to do a bit more at
compile-time, but it doesn't exist.  (If it existed as a local
function of macro, CALL-NEXT-METHOD could be implement in terms
of it.)

To try to be less confusing: in the common case where you want
to invoke the superclass version of the method being defined
inside an OBJC:DEFMETHOD, CALL-NEXT-METHOD is the simplest way
to do that.

On Sun, 3 Feb 2008, Didier Verna wrote:

>       Hello,
> I would like to implement the equivalent of this in Lisp:
> - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView
> {
>  [super drawWithFrame:cellFrame inView:controlView];
> }
> However, this doesn't work:
> (objc:defmethod (#/drawWithFrame:inView: :void)
>    ((self outline-cell) frame view)
>  (ccl::send-super self :draw-with-frame frame :in-view view))
> I get the following message:
> 2008-02-03 18:10:39.925 iOwn[78010:10b] Lisp exception: Undefined
> function OBJC:SEND-SUPER called with arguments (#<OUTLINE-CELL
> <OutlineCell: 0x17707f20> (#x17707F20)> :DRAW-WITH-FRAME
> #<NS-OUTLINE-VIEW <NSOutlineView: 0x9b8800> (#x9B8800)> :IN-VIEW #<A
> Foreign Pointer #x4>) .
> What am I doing wrong ?
> Thanks !
> -- 
> Resistance is futile. You will be jazzimilated.
> Didier Verna, didier at lrde.epita.fr, http://www.lrde.epita.fr/~didier
> EPITA / LRDE, 14-16 rue Voltaire   Tel.+33 (0)1 44 08 01 85
> 94276 Le Kremlin-Bicêtre, France   Fax.+33 (0)1 53 14 59 22  didier at xemacs.org
> _______________________________________________
> Openmcl-devel mailing list
> Openmcl-devel at clozure.com
> http://clozure.com/mailman/listinfo/openmcl-devel

More information about the Openmcl-devel mailing list