2011-12-02 15 views

Respuesta

12

Esto es diferente para cada aplicación CL pero el paquete Swank (proporciona limo que puede mostrar arglists en minibuffer Fe Emacs) envuelve esto en una sola función:

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

Esto también funciona para los métodos:

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

La forma más fácil de llegar Swank es utilizar Quicklisp.

+0

Swank como capa de compatibilidad? Interesante – sabof

6

No sé de una manera estándar, pero en SBCL puede usar 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 proporciona la función FUNCTION-LAMBDA-EXPRESSION, que puede devolver una expresión lambda si la implementación lo admite y la expresión ha sido grabada. En la expresión lambda, el segundo elemento es la lista de argumentos, como de costumbre.

De lo contrario, para devolver una lista de argumentos no está definida en el estándar ANSI Common Lisp y es parte de la implementación específica de Lisp. Por ejemplo, en algunas aplicaciones Lisp 'entregadas' esta información puede no estar presente.

Normalmente, la mayoría de las implementaciones de Common Lisp tendrán una función exportada ARGLIST en algún paquete interno.

Cuestiones relacionadas