, например, я хочу, чтобы получить все переменные из лямбда-списка, чтобы определить макрос:ручки лямбда-списки в методе определения макросов
(defmacro my-defun (name lambda-list &body body &aux (fname (gensym)))
`(progn
(defun ,fname ,(all-vars lambda-list)
,@body)
(defun ,name ,lambda-list
(,fname ,@(all-vars lambda-list)))))
есть какие-то функции, чтобы сделать это или или другие вещи, чтобы справиться легче с лямбда-списки, или же нет более простой способ, чем писать такие функции, как это:
(defun all-vars (lambda-list)
(mapcar (lambda (cons) (if (consp cons) (car cons) cons))
(remove-if (lambda (symbol) (and (symbolp symbol)
(char= (char (symbol-name symbol) 0) #\&)))
lambda-list)))
Вместо проверки первый символ является ли переменная # \ &, вы можете проверить, является ли символ в [** лямбда -list-ключевые слова **] (http://www.lispworks.com/documentation/HyperSpec/Body/v_lambda.htm). –
Даже тогда вы должны следить за правильным синтаксисом и другими точными точками: 'lambda-list-keywords' имеет больше символов, чем те, которые разрешены в лямбда-списке функции, порядок имеет значение, аргументы' & optional' и '& key' могут быть минус, и они отличаются синтаксисом, '& aux' не являются действительно параметрами и т. д. – acelent
@PauloMadeira Это абсолютно правильно, особенно о переменных & aux. Однако, поскольку расширение макроса включает в себя '(defun, name, lambda-list ...)', реализация уже должна проверять правильность списка лямбда, поэтому проверка не так важна в этом конкретном случае *. –