2011-12-02 82 views

回答

12

這是爲每個CL執行但斯旺克包不同(提供煤泥,其可以顯示在FE Emacs的迷你緩衝區arglists)在單個功能包此設置:

* (defun testfn (arg1 arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3))) 
TESTFN 
* (swank-backend:arglist #'testfn) 
(ARG1 ARG2 &KEY (ARG3 :A)) 

這也將工作方法:

* (defmethod testmethod ((arg1 t) arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3))) 
STYLE-WARNING: Implicitly creating new generic function TESTMETHOD. 
#<STANDARD-METHOD TESTMETHOD (T T) {1005670231}> 
* (swank-backend:arglist #'testmethod) 
(ARG1 ARG2 &KEY (ARG3 :A)) 

獲得Swank最簡單的方法是使用Quicklisp

+0

Swank作爲兼容性層?有趣 – sabof

6

我不知道標準的方式,但在SBCL中,您可以使用sb-introspect:function-lambda-list

(defun test (a &rest rest &key (b 42)) nil) 
(sb-introspect:function-lambda-list #'test) 
=> (A &REST REST &KEY (B 42)) 
5

ANSI Common Lisp提供函數FUNCTION-LAMBDA-EXPRESSION,如果實現支持它並且表達式已被記錄,則該函數可能會返回一個lambda表達式。在lambda表達式中,第二項是參數列表 - 像往常一樣。

否則返回一個參數列表沒有在ANSI Common Lisp標準中定義,並且是特定Lisp實現的一部分。例如,在某些「交付」Lisp應用程序中,此信息可能不存在。

通常最常見的Lisp實現將在某些內部包中具有導出函數ARGLIST。