Lisp:检查函数确定其所需的参数

发布于 2024-10-07 09:15:47 字数 251 浏览 5 评论 0原文

在 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 中做到这一点?

In Python, I can do this:

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

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

And from it, know how many parameters I must have in order to call foo(). How can I do this in Common Lisp?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

剩余の解释 2024-10-14 09:15:47

大多数实现都提供了执行此操作的方法,但没有一个是标准化的。如果你确实需要它,Swank(SLIME 的 Common Lisp 部分)有一个名为 < code>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)

不过,我不确定您是否可以依赖它在将来仍然可用。

Most implementations provide a way of doing this, but none is standardized. If you absolutely need it, Swank (the Common Lisp part of SLIME) has a function called swank-backend:arglist that, as far as I can see, does what you want:

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)

I'm not sure you can rely on it remaining available in the future, though.

岁月流歌 2024-10-14 09:15:47

通常大多数 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
...

Usually most Lisps have a function called ARGLIST in some package. LispWorks calls it FUNCTION-LAMBDA-LIST.

For information purposes in LispWorks, if one has the cursor on a function symbol, then control-shift-a displays the arglist. In LispWorks there is also an 'arglist-on-space' functionality that can be loaded. After typing a symbol and a space, the IDE displays the arglist.

There is also the CL:DESCRIBE function. It describes various objects. In most CL implementations it also should display the arglist of a function.

The following example is for 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
...
两相知 2024-10-14 09:15:47

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

例如,在 emacs lisp-mode + slime 中,输入

(format

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

If you want to know this just when editing, SLIME+emacs will take care of that for you.

e.g. In emacs lisp-mode + slime, typing

(format

will display the arguments of format in the minibuffer on the bottom.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文