[Openmcl-devel] How to send a message to the objc super-class ?
gb at clozure.com
Mon Feb 4 01:59:15 UTC 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),
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
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:
> 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
More information about the Openmcl-devel