Похожая идея, как Дмитрий, но генерирует немного меньше кода:
(defmacro clean (&rest variables)
`(setq ,@(loop for var in variables nconc (list var nil))))
(macroexpand '(clean a b c d))
;; (setq a nil b nil c nil d nil)
касается другого вопроса:
Простой, но трудоемкий способ знать, это переместить точку в функцию, которую вы не знаете nd C-h f или M-xdescribe-function
это поместит имя функции в приглашение (если это действительно функция Emacs Lisp) и покажет описание и, если доступно, место в исходном коде.
Я попытаюсь объяснить, но я не буду никаких ссылок языка :)
defmacro
- похож на функцию, но она не оценивает аргументы. Макросы выполняются, когда ваш код считывается и компилируется в байт-код. Их основная цель - генерировать другой код.
lambda
- это макрос, который создает анонимную функцию и возвращает ее.
mapcar
- это функция высокого порядка, которая последовательно применяет функцию ко всем элементам списка и собирает результат в список в том порядке, в котором она применялась.
&rest
- это специальное ключевое слово в лямбда-списке функции (т. Е. Определение параметров), что буквально означает, что идентификатор, следующий за этим символом, является списком всех аргументов справа от него).
,@
- специальный оператор, используемый в макросах, внутри макросов обратной цитаты. Он инструктирует читателя, что выражение, следующее за ним, должно оцениваться, рассматриваться как список, и все его требования должны быть добавлены к форме, которая в настоящее время обрабатывается.
Я не думаю, что вы можете сделать это «чисто», потому что эта операция принципиально некрасиво. Если вы покажете нам пример, где вы думаете, что хотите этого, мы покажем вам, как это сделать лучше. – Stefan
ну, я действительно хочу поведения, как описано здесь ... – PascalVKooten