Bug: reinitialization of generic functions
Hi,
Here is a bug report wrt reinitialization of generic functions. The
CLOS MOP specification states that if the lambda list of a generic
function is reinitialized, but no argument precedence order is given,
then the argument precedence order has to be initialized with the
list of required arguments in the lambda list. However, the following
code doesn't work correctly in LispWorks (4.4.6 on Mac OS X):
(let ((gf (make-instance 'standard-generic-function
:lambda-list '(a b c)
:argument-precedence-order '(c b a))))
(assert (equal (clos:generic-function-argument-precedence-order gf)
'(c b a)))
(reinitialize-instance gf :lambda-list '(a b c))
(assert (equal (clos:generic-function-argument-precedence-order gf)
'(a b c))))
A slight change makes this code succeed:
(let ((gf (make-instance 'standard-generic-function
:lambda-list '(a b c &optional o)
:argument-precedence-order '(c b a))))
(assert (equal (clos:generic-function-argument-precedence-order gf)
'(c b a)))
(reinitialize-instance gf :lambda-list '(a b c &rest r))
(assert (equal (clos:generic-function-argument-precedence-order gf)
'(a b c))))
So my guess is that LispWorks checks whether the lambda list is
changed compared to its previous value and skips reinitialization if
that's the case. However, it should check for the argument precedence
order as well.
Cheers,
Pascal
--
Pascal Costanza, mailto:pc@p-cos.net, http://p-cos.net
Vrije Universiteit Brussel, Programming Technology Lab
Pleinlaan 2, B-1050 Brussel, Belgium