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

EIEIO defmethod broken if symbol already bound?

2 views
Skip to first unread message

Wilfred Hughes

unread,
May 18, 2013, 11:10:36 AM5/18/13
to help-gn...@gnu.org
Hi folks

I think this might be an Emacs bug, but I'm not familiar enough with EIEIO
to be certain. Suppose I want to assign a method foo to a class some-class:

(require 'eieio)

(defclass some-class ()
((bar :initform 42)))

(defmethod foo ((s some-class))
1)

This works fine. However, if the function definition of foo is already
bound to t, it doesn't work:

(require 'eieio)

(defclass some-class ()
((bar :initform 42)))

(defalias 'foo 't)

(defmethod foo ((s some-class))
1) ;; Debugger entered--Lisp error: (void-function foo)

I'm forced to set foo to a function (e.g. (defalias 'foo 'method)) before I
can use (defmethod foo ...). In fact, calling M-x describe-function <RET>
foo <RET> says 'file a bug report'.

Now, I know that (defalias 'foo 't) is silly thing to do. However, I
accidentally ended up in this state when hacking on some code.

Is this a legitimate bug? Emacs 24.2.1.

Thanks :)

Pierre Lorenzon

unread,
May 19, 2013, 5:45:37 AM5/19/13
to m...@wilfred.me.uk, help-gn...@gnu.org

Hi,

In fact it is a question for cedet mailing lists. But I don't
really understand what you want to do.

I claim that it is not possible to define a method whose name
is the name of an existing emacs method :

(defun foo () ...)
(defmethod foo () ...) Is not allowed. This is eieio policy.

I suspect that (defalias foo ...) (defmethod foo ...) is not
permitied as well. In fact I suspect that the defmethod macro
or more certianly the defgeneric function will check the
function field of the symbol 'foo and if that one is not empty
or not set to something inheritable redefinition will be
prohibited. If I don't make a mistake defalias will also set
the function field of the symbol. The true mechanism is maybe a
little bit more sophisticated by usage of obarrays and hash
table but it works more or less as I said.

Surely (defmethod foo ((s class_1)) (defmethod foo ((s
class_2)) is allowed for inheritance (see usage of
call-next-method for this purpose.)

Regards

Pierre
0 new messages