(defmacro defmethod (class-name &rest params&body) (let ((method-names (mapcar #'car params&body)) (params (mapcar #'cadr params&body)) (bodies (mapcar #'cddr params&body))) `(progn (mapcar #'(lambda (method-name params body) (define-method ',class-name method-name params body)) ',method-names ',params ',bodies) ',class-name))) ;;; (defun define-method (class-name method-name params body) (let ((fun `(lambda ,(cons 'self params) ,@body))) (store-method method-name class-name fun))) (defun store-method (method-name class-name fun) (if *verbose* (format t "; method ~a defined for ~a.~%" method-name class-name)) (setf (gethash method-name (class-functions (get-class class-name))) fun))