(defmacro defmethod* (method-name param-list &rest body) (let* ((cls-name (cadr (car param-list))) (params (cons (caar param-list) (cdr param-list)))) `(define-method ',cls-name ',method-name ',params ',body))) (defun define-method (cls-name method-name params body) (let ((fun `(lambda ,params ,@body))) (store-method method-name cls-name fun)) (create-generic-function method-name)) (defun store-method (method-name cls-name fun) (if *verbose* (format t "; method ~a defined for ~a.~%" method-name cls-name)) (setf (gethash method-name (cls-functions (get-class cls-name))) fun) ) (defun create-generic-function (method-name) (setf (symbol-function method-name) (eval `(function (lambda (self &rest params) (apply (find-method* ',method-name (send self 'class)) (cons self params)))))))