シンボルが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)...