Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Catching no generic method in EIEIO

6 views
Skip to first unread message

Phillip Lord

unread,
May 25, 2016, 12:03:18 PM5/25/16
to help-gn...@gnu.org


Using EIEIO I can define a `slot-missing' method to catch "No Such Slot"
errors for objects which do not have this slot.

I've looked but as far as I can see, there is no ability to catch a
missing implementation for a method.

So:

(defclass One()())

(defclass Two()())

(defmethod met((o One))
'hello)

(met (One))
(met (Two))

The last form crashes -- I could, of course, implement this using
defmethod on Two, but I want to this for any method.

Phil

Dmitry Gutov

unread,
May 25, 2016, 12:06:30 PM5/25/16
to Phillip Lord, help-gn...@gnu.org
On 05/25/2016 07:03 PM, Phillip Lord wrote:

> I've looked but as far as I can see, there is no ability to catch a
> missing implementation for a method.

Why not use defgeneric, and provide a default implementation for the method?

Stefan Monnier

unread,
May 25, 2016, 2:19:47 PM5/25/16
to help-gn...@gnu.org
> The last form crashes -- I could, of course, implement this using
> defmethod on Two, but I want to this for any method.

(defmethod ((o t))
...)

should do the trick.


Stefan


PS: Of course, I also recommend you switch to cl-generic
(i.e. use (cl-defmethod ...)). It's more featureful and much faster.


Phillip Lord

unread,
May 26, 2016, 11:08:28 AM5/26/16
to Stefan Monnier, help-gn...@gnu.org
Stefan Monnier <mon...@iro.umontreal.ca> writes:

>> The last form crashes -- I could, of course, implement this using
>> defmethod on Two, but I want to this for any method.
>
> (defmethod ((o t))
> ...)
>
> should do the trick.

Didn't know you could do that, but it's not what I wanted. It implements
the method for all objects. Where was what I wanted was to implement all
methods on one object (or class).

Not that it matters now, as I have realised I was doing the wrong thing
anyway, that inheritance will do what I need.

> PS: Of course, I also recommend you switch to cl-generic
> (i.e. use (cl-defmethod ...)). It's more featureful and much faster.

I'm going to fix all that when I port everything to emacs-25. I'm just
waiting till that hits the shelf.

Phil

Stefan Monnier

unread,
May 28, 2016, 2:29:49 PM5/28/16
to help-gn...@gnu.org
>>> The last form crashes -- I could, of course, implement this using
>>> defmethod on Two, but I want to this for any method.
>> (defmethod ((o t))
>> ...)
>> should do the trick.
> Didn't know you could do that, but it's not what I wanted. It implements
> the method for all objects. Where was what I wanted was to implement all
> methods on one object (or class).

FWIW, I think you can might be able to do that (at least for those
methods which don't have a default case like the one I provided above)
with something like

(cl-defmethod cl-no-applicable-method (generic (x <myclass>) &rest args)
aka
(defmethod no-applicable-method ((x <myclass>) generic &rest args)

but this will only catch those methods where the dispatch on <myclass>
was done on the first argument.

>> PS: Of course, I also recommend you switch to cl-generic
>> (i.e. use (cl-defmethod ...)). It's more featureful and much faster.
> I'm going to fix all that when I port everything to emacs-25. I'm just
> waiting till that hits the shelf.

There's a forward compatibility cl-generic package in GNU ELPA, so you
should be able to start using it without dropping
backward compatibility.


Stefan


0 new messages