[Openmcl-devel] Problems with call-next-method in 1.4-dev-r12912M-trunk (WindowsX8632)

Matthew D. Swank akopa.gmane.poster at gmail.com
Mon Oct 5 20:24:41 PDT 2009


If that is a correct interpretation, it seems unnecessarily
restrictive.  Even if previous methods are no longer in the
compute-applicable-methods list, as long as the identity and ordering of
subsequent methods don't change, the call to call-next-method with
the new arguments still follows the same control path.  

Not that spec interpretation is a democracy, but the reason this came
up is at least 3 other implementations do not signal an error in this
case (sbcl clisp abcl).

Matt

On Mon, 5 Oct 2009 22:38:14 -0400
"R. Matthew Emerson" <rme at clozure.com> wrote:

> Hmm.  The spec says:
> 
> "When providing arguments to call-next-method, the following rule
> must be satisfied or an error of type error should be signaled: the
> ordered set of applicable methods for a changed set of arguments for
> call-next- method must be the same as the ordered set of applicable
> methods for the original arguments to the generic function.
> Optimizations of the error checking are possible, but they must not
> change the semantics of call-next-method."
> 
> http://www.lispworks.com/documentation/HyperSpec/Body/f_call_n.htm#call-next-method
> 
> I understand that to mean that the following has to be true:
> 
> (equal (compute-applicable-methods #'foo (list 'bar "baz"))
>         (compute-applicable-methods #'foo (list 'bar 3)))
> 
> CCL> (compute-applicable-methods #'foo (list 'bar "baz"))
> (#<STANDARD-METHOD FOO ((EQL BAR) STRING)>
>   #<STANDARD-METHOD FOO ((EQL BAR) T)>)
> CCL> (compute-applicable-methods #'foo (list 'bar 3))
> (#<STANDARD-METHOD FOO ((EQL BAR) T)>)
> CCL>
> 
> I wouldn't claim to be a language lawyer, but it does appear to me  
> that CCL is correct to signal an error in this case.
> 
> 
> On Oct 5, 2009, at 3:20 PM, Matthew Swank wrote:
> 
> > This looks like it should work ok:
> >
> > CL-USER> (defgeneric foo (bar baz))
> > #<STANDARD-GENERIC-FUNCTION FOO #xA8F3C1E>
> >
> > CL-USER> (defmethod foo ((bar (eql 'bar)) (baz string))
> > 	   (call-next-method bar (length baz)))
> > #<STANDARD-METHOD FOO ((EQL BAR) STRING)>
> >
> > CL-USER> (defmethod foo ((bar (eql 'bar)) baz)
> > 	   (cons baz baz))
> > #<STANDARD-METHOD FOO ((EQL BAR) T)>
> >
> > CL-USER> (foo 'bar "baz")
> >
> > =>
> > Applicable-methods changed in call-next-method.
> > Should be: (#<STANDARD-METHOD FOO ((EQL BAR) STRING)>
> >            #1=#<STANDARD-METHOD FOO (# T)>)


-- 
"You do not really understand something unless you can explain it to
your grandmother." -- Albert Einstein.



More information about the Openmcl-devel mailing list