I was finding it a bit cumbersome to remove methods that I'd defined, which I wanted to remove because I wanted to change the argument count. I wanted something simple (even better would be introspection and removing everything, but I couldn't find a portable way to do that -- if anyone knows of any, please let me know!), and was happy to do a bit of legwork to get something that would then be simple to use. So, I came up with the following macro:
(defmacro easy-remove-method (name &rest args)
  `(let* ((modified-args (mapcar (lambda (x)
                                   (if (symbolp x)
                                       (find-class x)
                                       `(eql ,x)))
                                 ',args))
          (method (find-method ,name '() modified-args nil)))
     (if method
         (remove-method ,name method)
         (format t "Failed to find method (~a () ~a)" ,name modified-args))))
One could then call something like:
(easy-remove-method #'foo 1 'baz)
which would be equivalent to:
(remove-method #'foo (find-method #'foo '() '(eql 1) (find-class 'baz)))
Since I was working on methods which had integer-based
eql specifiers, this made things much handier.  In principal, I think you could just as easily place any other arbitrary object there and, as long as you didn't quote it and thus make it a symbol, you'd get an eql specifier for it.  With the quote, you get find-class on that symbol. Which is just what I wanted, so yay.
 

No comments:
Post a Comment