在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中做到这一点?
答案 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
将在底部的迷你缓冲区中显示格式的参数。