【发布时间】:2011-12-02 08:34:51
【问题描述】:
给定一个普通lisp中的函数对象(或函数的符号),是否可以找出函数的参数列表?
【问题讨论】:
标签: lisp common-lisp
给定一个普通lisp中的函数对象(或函数的符号),是否可以找出函数的参数列表?
【问题讨论】:
标签: lisp common-lisp
这对于每个 CL 实现都是不同的,但是 Swank 包(提供可以在 f.e. Emacs 的 minibuffer 中显示 arglists 的 Slime)将其包装在一个函数中:
* (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。
【讨论】:
ANSI Common Lisp 提供了函数FUNCTION-LAMBDA-EXPRESSION,如果实现支持并且已经记录了表达式,它可能会返回一个lambda 表达式。在 lambda 表达式中,第二项是参数列表 - 和往常一样。
否则返回参数列表在 ANSI Common Lisp 标准中没有定义,并且是特定 Lisp 实现的一部分。例如,在某些“交付”的 Lisp 应用程序中,此信息可能不存在。
通常,大多数 Common Lisp 实现都会在某些内部包中具有导出函数 ARGLIST。
【讨论】:
我不知道标准方式,但在 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))
【讨论】: