2010-12-10 52 views
2

在Python,我可以這樣做:Lisp的:檢查功能決定了其所需的參數

>>> 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

我懷疑這取決於lisp變體/實現。 – 2010-12-10 00:55:01

+0

好點。我編輯澄清。 – Ishpeck 2010-12-10 03:09:09

回答

2

大多數實現提供了這樣做的方法,但沒有一個是標準化的。如果你絕對需要它,斯旺克(的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) 

我不知道,你可以依靠但它在未來仍然可用。

2

通常大多數Lisp在某些包中都有一個叫做ARGLIST的函數。 LispWorks將其稱爲FUNCTION-LAMBDA-LIST。

有關LispWorks中的信息,如果將光標放在函數符號上,則control-shift-a將顯示arglist。在LispWorks中還有一個可以加載的'arglist-on-space'功能。輸入符號和空格後,IDE將顯示參數列表。

還有CL:DESCRIBE函數。它描述了各種對象。在大多數CL實現中,它也應該顯示函數的參數列表。

下面的例子是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 
... 
0

如果你想知道這只是編輯時,泥+ Emacs會照顧你們能這樣:

例如在emacs的口齒不清模式+煤泥,打字

(format

將在底部迷你緩衝區顯示格式的參數。