Определение списка аргументов функции в Common Lisp
Можно ли найти список аргументов функции, заданной объектом функции (или символом функции) в общем lisp?
3 ответа
Это отличается для каждой реализации CL, но пакет Swank (предоставляет Slime, который может отображать списки в минибуфере, например, в Emacs) заключает это в одну функцию:
* (defun testfn (arg1 arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3)))
TESTFN
* (swank-backend:arglist #'testfn)
(ARG1 ARG2 &KEY (ARG3 :A))
Это также будет работать для методов:
* (defmethod testmethod ((arg1 t) arg2 &key (arg3 :a)) (declare (ignore arg1 arg2 arg3)))
STYLE-WARNING: Implicitly creating new generic function TESTMETHOD.
#<STANDARD-METHOD TESTMETHOD (T T) {1005670231}>
* (swank-backend:arglist #'testmethod)
(ARG1 ARG2 &KEY (ARG3 :A))
Самый простой способ получить Swank - использовать Quicklisp.
ANSI Common Lisp предоставляет функцию FUNCTION-LAMBDA-EXPRESSION, которая может возвращать лямбда-выражение, если реализация его поддерживает и выражение записано. В лямбда-выражении вторым элементом является список аргументов - как обычно.
В противном случае возвращение списка аргументов не определено в стандарте ANSI Common Lisp и является частью конкретной реализации Lisp. Например, в некоторых "доставленных" приложениях на Лиспе эта информация может отсутствовать.
Обычно большинство реализаций Common Lisp имеют экспортированную функцию ARGLIST в каком-то внутреннем пакете.
Я не знаю стандартного способа, но в SBCL вы можете использовать sb-introspect:function-lambda-list
,
(defun test (a &rest rest &key (b 42)) nil)
(sb-introspect:function-lambda-list #'test)
=> (A &REST REST &KEY (B 42))