Tôi có mã kiểm tra tính chất của một hàm. Tôi sử dụng nó để xác định xem các đối số tùy chọn được thêm vào trong các phiên bản gần đây của gói có hiện diện hay không. Nó gọi subr-arity
các hàm dựng sẵn và phân tích cú pháp đối số của các đối tượng mã byte và lambdas.
(defun function-argspec (func)
(if (symbolp func) (setq func (indirect-function func)))
(cond
((byte-code-function-p func)
(aref func 0))
((and (consp func)
(eq (car func) 'lambda)
(consp (cdr func)))
(car (cdr func)))
))
Điều này đã hoạt động tốt cho đến Emacs 23. Trong Emacs 24.3 trên Ubuntu 14.04, nó hoạt động tốt đối với một số chức năng, nhưng không phải cho các chức năng khác.
(function-argspec 'revert-buffer)
(&optional ignore-auto noconfirm preserve-modes)
(require 'vc)
vc
(function-argspec 'vc-print-log-internal)
1283
Rõ ràng là định dạng mã byte đã thay đổi theo cách không được phản ánh trong hướng dẫn .
(symbol-function 'vc-print-log-internal)
#[1283 \301\211\302\301\211\203\211@\303!\203\304\262A\266\202\202\210\203'\305>\202*\306>??\262\2036\307\2027\310\262\311
\312\313\314\315\316
$\317"\320\321%\312\322\323\315\316#\324"\325\326%\312\327\330\315\316!\331"\332\333%\312\334\335\315\316%\336"\325\337%&\262\207 [vc-log-short-style nil *vc-change-log* file-directory-p t directory file short long vc-log-internal-common make-byte-code 1028 \304\305\303\301\205\300\302&\207 vconcat vector [vc-call-backend print-log] 12
(fn BK BUF TYPE-ARG FILES-ARG) 771 \303\300\301\302$\207 [vc-print-log-setup-buttons] 8
(fn BK FILES-ARG RET) 257 \301\302\300#\207 [vc-call-backend show-log-entry] 5
(fn BK) 514 \305\300\301\302\303\304%\207 [vc-print-log-internal]
(fn IGNORE-AUTO NOCONFIRM)] 28
(fn BACKEND FILES WORKING-REVISION &optional IS-START-REVISION LIMIT)]
Làm thế nào tôi có thể truy cập một cách đáng tin cậy danh sách đối số của một đối tượng mã byte? Chỉ cần biết arity sẽ làm gì, tôi không quan tâm đến tên đối số. Chính xác hơn, tôi muốn biết có bao nhiêu đối số là bắt buộc và có bao nhiêu đối số là tùy chọn, hoặc trong các điều khoản khác, tôi muốn cùng một thông tin mà tôi nhận được từ đó subr-arity
. Tất nhiên mã của tôi phải đối phó với cả mã byte kiểu cũ và kiểu mới, vì vậy tôi cần biết không chỉ đào ở đâu mà còn khi nào đào ở đâu.
function-argspec
chức năng của bạn ở đâu đó, bao gồm các hàm bytecode và các bao đóng không?
function-argspec
.