( defmacro defmacro* ( name-&-method-qualifiers ( &rest args ) &body body ) ( destructuring-bind ( name &rest method-qualifiers ) ( if ( consp name-&-method-qualifiers ) name-&-method-qualifiers ( list name-&-method-qualifiers ) ) ( let ( ( form ( gensym "form-" ) ) ( env ( gensym "env-" ) ) ( xn ( or ( get name :expander ) ( setf ( get name :expander ) ( make-symbol ( string name ) ) ) ) ) ) ` ( eval-when ( :compile-toplevel :load-toplevel :execute ) ( defmethod ,xn ,@method-qualifiers ( ,form ,env ) ( macrolet ( ( call-next-expander ( &rest args ) ` ( call-next-method ,@args ) ) ) ( destructuring-bind ( ,name ,@args ) ,form ( declare ( ignore ,name ) ) ,@body ) ) ) ( setf ( macro-function ',name ) #',xn ) ) ) ) )