Lisp:Inspect函数确定其所需的参数

时间:2010-12-10 00:52:01

标签: lisp inspection

在Python中,我可以这样做:

>>> def foo(x,y,z=1):
    return x+y*z

>>> foo.func_code.co_varnames
('x', 'y', 'z')
>>> foo.func_defaults
(1,)

从中,知道我必须拥有多少参数才能调用foo()。我怎么能在Common Lisp中做到这一点?

3 个答案:

答案 0 :(得分:2)

大多数实现提供了一种方法,但没有一种是标准化的。如果你绝对需要它,Swank(SLIME的Common Lisp部分)有一个名为swank-backend:arglist的函数,据我所知,它可以做你想要的:

CCL> (swank-backend:arglist 'if)
(TEST TRUE &OPTIONAL FALSE)
CCL> (swank-backend:arglist 'cons)
(X Y)
CCL> (swank-backend:arglist (lambda (a b c &rest args)))
(A B C &REST ARGS)

我不确定你将来可以继续使用它。

答案 1 :(得分:2)

通常大多数Lisps在某个包中都有一个名为ARGLIST的函数。 LispWorks称之为FUNCTION-LAMBDA-LIST。

为了在LispWorks中提供信息,如果将光标放在函数符号上,则control-shift-a显示arglist。在LispWorks中,还有一个可以加载的“arglist-on-space”功能。键入符号和空格后,IDE将显示arglist。

还有CL:DESCRIBE功能。它描述了各种对象。在大多数CL实现中,它还应该显示函数的arglist。

以下示例适用于Clozure Common Lisp:

Welcome to Clozure Common Lisp Version 1.6-r14468M  (DarwinX8664)!
? (defun foo (x y &optional (z 1)) (+ x (* y z)))
FOO

? (arglist #'foo)
(X Y &OPTIONAL Z)
:ANALYSIS

? (describe #'foo)
#<Compiled-function FOO #x302000550F8F>
Name: FOO
Arglist (analysis): (X Y &OPTIONAL Z)
Bits: 8405508
...

答案 2 :(得分:0)

如果您想在编辑时知道这一点,SLIME + emacs将为您解决这个问题。

e.g。在emacs lisp-mode + slime中,输入

(format

将在底部的迷你缓冲区中显示格式的参数。