在公共Lisp中确定函数参数列表

在公共Lisp中确定函数参数列表,lisp,common-lisp,Lisp,Common Lisp,在common lisp中给定函数对象(或函数的符号),是否可以找到函数的参数列表?我不知道有什么标准方法,但在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)) 这对于每个CL实现是

在common lisp中给定函数对象(或函数的符号),是否可以找到函数的参数列表?

我不知道有什么标准方法,但在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))

这对于每个CL实现是不同的,但Swank包(提供SLIM,可以在f.e.Emacs的minibuffer中显示arglist)将其封装在一个函数中:

* (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))
*(defmethod testmethod((arg1 t)arg2&key(arg3:a))(声明(忽略arg1 arg2 arg3)))
STYLE-WARNING:隐式创建新的泛型函数TESTMETHOD。
#
*(swank后端:arglist#'testmethod)
(ARG1 ARG2和键(ARG3:A))

获得Swank的最简单方法是使用。

ANSI Common Lisp提供了该函数,如果实现支持lambda表达式并且该表达式已被记录,则该函数可能会返回lambda表达式。在lambda表达式中,第二项是参数列表-与往常一样

否则,返回参数列表在ANSI通用Lisp标准中没有定义,并且是特定Lisp实现的一部分。例如,在某些“已交付”的Lisp应用程序中,此信息可能不存在


通常,大多数常见的Lisp实现都会在一些内部包中包含导出的函数ARGLIST。

Swank作为兼容层?有趣的