シンボルがmacroかどうかを判定するmacrop関数の実装
edebugパッケージで提供されるedebug-macrop関数を参考にしました。
prefixとしてmy-をつけてあります。
確実に判定できるかどうかは未検証です。
(defalias 'my-func1 'my-func2) (defalias 'my-func2 'my-func1)
↑のような関数の場合に無限ループにならないようにループの上限を10回にしてあります。
(defun my-lookup-function (object) (loop with count = 0 while (and (symbolp object) (fboundp object)) if (= count 10) do (return nil) else do (progn (setq object (symbol-function object)) (incf count)) finally return object)) (defun my-macrop (object) (let ((sym-func (my-lookup-function object))) (if (and (listp sym-func) (eq 'macro (car sym-func)) (functionp (cdr sym-func))) sym-func))) (my-macrop 'with-current-buffer) ;=> non-nil: (macro . #[(buffer &rest body)... (my-macrop 're-search-forward) ;=> nil (defalias 'my-with-current-buffer 'with-current-buffer) (my-macrop 'my-with-current-buffer) ;=> non-nil: (macro . #[(buffer &rest body)...