3

emacs 23.1 と 24.1 の間のどこかで、 のインターフェースがurl-retrieve変更されました。emacs 23.1 では、次のようになります。

(url-retrieve URL CALLBACK &optional CBARGS)

バージョン 24.1 では、次のようになります。

(url-retrieve URL CALLBACK &optional CBARGS SILENT INHIBIT-COOKIES)

この関数を使用する emacs パッケージがあります。SILENT引数をサポートしていない古いバージョンの emacs との下位互換性を維持しながら、emacs 24.1 で新しいSILENT引数を利用したいと考えています。

これを管理する最善の方法は何ですか? 実行時に引数の最大数を取得できますか?

4

4 に答える 4

5

この関数を使用して、引数リストを取得できます。

(defun my-get-arglist (obj)
  ;; code taken from disassemble-internal
  (let ((macro 'nil)
        (name 'nil)
        (doc 'nil)
        args)
    (while (symbolp obj)
      (setq name obj
            obj (symbol-function obj)))
    (if (subrp obj)
        (error "Can't disassemble #<subr %s>" name))
    (if (and (listp obj) (eq (car obj) 'autoload))
        (progn
          (load (nth 1 obj))
          (setq obj (symbol-function name))))
    (if (eq (car-safe obj) 'macro)  ;handle macros
        (setq macro t
              obj (cdr obj)))
    (if (and (listp obj) (eq (car obj) 'byte-code))
        (setq obj (list 'lambda nil obj)))
    (if (and (listp obj) (not (eq (car obj) 'lambda)))
        (error "not a function"))
    (if (consp obj)
        (if (assq 'byte-code obj)
            nil
          (setq obj (byte-compile obj))))
    (cond ((consp obj)
           (setq obj (cdr obj))     ;throw lambda away
           (setq args (car obj))    ;save arg list
           (setq obj (cdr obj)))
          ((byte-code-function-p obj)
           (setq args (aref obj 0)))
          (t (error "Compilation failed")))
    args))
于 2012-06-20T16:58:35.653 に答える
3

emacs-major-version>= 24 であることを確認できます。

于 2012-06-20T21:51:27.923 に答える
2
(defun try-call-with-more-args (function a b c d)
  (condition-case var
      (progn
        (funcall function a b c d)
        (message "there was no error"))
    (wrong-number-of-arguments (funcall function a b c))))

(try-call-with-more-args #'message "b = %d, c = %d" 1 2 3)

Trey Jackson によって投稿されたものははるかにスマートですが、これはより単純であり、ネイティブ C 関数をターゲットにしている場合でも、実際に機能する可能性が高くなります :)

于 2012-06-21T00:21:43.137 に答える
1

古いバージョンの emacs の場合は、古い関数のラッパーを記述します。

(let ((orig-fun #'symbol-name-of-orig-fun))
  (defun symbol-name-of-orig-fun (arglist of new function interface)
    (declare (ignore new function interface))
    (funcall orig-fun arglist of)))

これにより、古い関数の参照を新しい関数内に格納するレキシカル クロージャが生成されます。私は emacs の方言を知りませんが、このパターンは emacs で使用できるに違いありません。私はコモンリスプで時々それを使用します。

于 2012-06-22T01:20:09.950 に答える