On 2 Dec 2012, at 22:48, Juan Jose Garcia-Ripoll <juanjose.garciaripoll@gmail.com> wrote:

On Sun, Dec 2, 2012 at 9:11 PM, Pascal Costanza <pc@p-cos.net> wrote:
4) DEFMETHOD doesn't call MAKE-METHOD-LAMBDA to determine the method function body. [My guess is that this is not easy to change due to the deviation from the MOP specification in how method functions are called.]

I will look into the other issues, but this is definitely not true. In ecl/src/clos/method.lsp, line 82, 
...
 (multiple-value-bind (fn-form options)
     (make-method-lambda generic-function method lambda-form env)
   (when documentation
     (setf options (list* :documentation documentation options)))
   (multiple-value-bind (wrapped-lambda wrapped-p)
(simplify-lambda name fn-form)
...

ECL calls make-method lambda and then looks at the output to see whether it can be transformed into the C-optimized dispatch that we use.

It would be important to have a test case that shows when make-method-lambda is not working. What in particular made you think so?



Here is a test case:

> (use-package :clos)

T
> (defclass my-generic-function (standard-generic-function) () (:metaclass funcallable-standard-class))

#<The CLOS:FUNCALLABLE-STANDARD-CLASS COMMON-LISP-USER::MY-GENERIC-FUNCTION>
> (defgeneric f (x) (:generic-function-class my-generic-function))

#<my-generic-function F>
> (defmethod make-method-lambda :after ((gf my-generic-function) (method standard-method) (lambda-expression t) (enviroment t)) (print :foo))

#<standard-method MAKE-METHOD-LAMBDA (#<The CLOS:FUNCALLABLE-STANDARD-CLASS COMMON-LISP-USER::MY-GENERIC-FUNCTION>
                                      #<The STANDARD-CLASS STANDARD-METHOD>
                                      #<The BUILT-IN-CLASS T>
                                      #<The BUILT-IN-CLASS T>)>
> (defmethod f ((x integer)) (+ x x))

#<standard-method F (#<The BUILT-IN-CLASS INTEGER>)>



Pascal


--
Pascal Costanza