Lisp: функция проверки определяет необходимые параметры - PullRequest
2 голосов
/ 10 декабря 2010

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

2 голосов
/ 10 декабря 2010

Обычно в большинстве пакетов есть функция с именем ARGLIST.LispWorks называет его FUNCTION-LAMBDA-LIST.

Для информационных целей в LispWorks, если на курсор указывается символ функции, тогда control-shift-a отображает список аргументов.В LispWorks также есть функция 'arglist-on-space', которую можно загрузить.После ввода символа и пробела в среде IDE отобразится список аргументов.

Существует также функция 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 голосов
/ 10 декабря 2010

Большинство реализаций предоставляют способ сделать это, но ни одна не стандартизирована.Если вам это абсолютно необходимо, Swank (часть Common Lisp в SLIME ) имеет функцию под названием 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)

Я не уверен, что вы можете рассчитывать на то, что он останется доступным в будущем.

0 голосов
/ 10 декабря 2010

Если вы хотите знать это только при редактировании, SLIME + emacs позаботится об этом за вас.

например. В emacs lisp-mode + slime, набрав

(format

отобразит аргументы формата в минибуфере внизу.

...