2011-12-02 9 views

risposta

12

Questo è diverso per ogni implementazione CL ma il pacchetto Swank (fornisce Slime che può mostrare arglists in minibuffer fe Emacs') avvolge questo in una singola funzione:

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

Questo funzionerà anche per i metodi:

* (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)) 

Il modo più semplice per arrivare Swank è quello di utilizzare Quicklisp.

+0

Swank come livello di compatibilità? Interessante – sabof

6

Non so di un modo standard ma in SBCL è possibile utilizzare 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 fornisce la funzione FUNCTION-LAMBDA-EXPRESSION, che può restituire un'espressione lambda se l'implementazione la supporta e l'espressione è stata registrata. Nell'espressione lambda, il secondo elemento è l'elenco degli argomenti, come al solito.

In caso contrario, la restituzione di un elenco di argomenti non è definita nello standard ANSI Common Lisp e fa parte dell'implementazione specifica di Lisp. Ad esempio, in alcune applicazioni Lisp "consegnate" queste informazioni potrebbero non essere presenti.

In genere la maggior parte delle implementazioni comuni di Lisp avrà una funzione esportata ARGLIST in alcuni pacchetti interni.