0
(defun magit-max-args-internal (function)
    "Return the maximum number of arguments accepted by FUNCTION."
    (if (symbolp function)
        (setq function (symbol-function function)))
    (if (subrp function)
        (let ((max (cdr (subr-arity function))))
          (if (eq 'many max)
              most-positive-fixnum
            max))
      (if (eq 'macro (car-safe function))
          (setq function (cdr function)))
      (let ((arglist (if (byte-code-function-p function)
                         (aref function 0) ; <--------- format changed
                       (cadr function))))
        (if (memq '&rest arglist)
            most-positive-fixnum
          (length (remq '&optional arglist))))))

我不得不重新编译magit.el并在他们的代码中发现了这个问题。如果我正确地遵循了代码,那么他们在这里所追求的是函数的数量,但他们却得到了一些“奇怪”的数字。任何想法发生了什么?


另外,这篇博文:Elisp get function arity? 提供了一个更好的解决方案(它可以很好地完成工作,Andreas Röhler 的回答。所以我可能会尝试向magit维护者推荐它。

4

1 回答 1

1

事实上,这个“(aref 字节码 0)中的数字”是为lexical-binding. 更好的解决方法是扔掉magit-max-args-internal(condition-case nil (delete-directory <args>) (wrong-number-of-arguments (delete-directory <fewerargs>))改用。

于 2013-10-02T01:18:18.813 回答