2013-01-12 3 views
0

Я хотел бы создать функцию nil, которая принимает любое количество символов и устанавливает их все в nil.Emacs, определяющий функцию, которая устанавливает аргументы в nil

(defun clean (as many args as given by user) 
    (setq each-arg nil) 
) 

(clean x y z) 

Как это сделать «чисто»?

+1

Я не думаю, что вы можете сделать это «чисто», потому что эта операция принципиально некрасиво. Если вы покажете нам пример, где вы думаете, что хотите этого, мы покажем вам, как это сделать лучше. – Stefan

+0

ну, я действительно хочу поведения, как описано здесь ... – PascalVKooten

ответ

5

Поскольку вы не процитировать аргументы, он должен быть макрос:

(defmacro clean (&rest symbols) 
    `(progn 
    ,@(mapcar (lambda (sym) (list 'setq sym 'nil)) 
       symbols))) 
+0

Много нового для меня, 'defmacro',' lambda', 'mapcar',' & rest', ', @'. Не могли бы вы добавить еще несколько объяснений, почему вы используете эти вещи? – PascalVKooten

+0

Я читал каждый из них раньше, но они сложны. Используя это в качестве примера, я думаю, что некоторые другие действительно выиграют от объяснения (по крайней мере, я бы это сделал!). – PascalVKooten

+0

Это круто, если кто-то хочет помочь вам в этом. Я считаю, что лучше быть уверенным в себе и изучать этот материал. Если у вас возникли проблемы с его изучением из руководства, ошибки в документации к файлам, чтобы другие в вашей позиции могли легче узнать в будущем. –

5

Похожая идея, как Дмитрий, но генерирует немного меньше кода:

(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 - это специальное ключевое слово в лямбда-списке функции (т. Е. Определение параметров), что буквально означает, что идентификатор, следующий за этим символом, является списком всех аргументов справа от него).
    • ,@ - специальный оператор, используемый в макросах, внутри макросов обратной цитаты. Он инструктирует читателя, что выражение, следующее за ним, должно оцениваться, рассматриваться как список, и все его требования должны быть добавлены к форме, которая в настоящее время обрабатывается.
+0

Спасибо, это действительно помогает! Я знаю «C-h f» и использую его много, но некоторые из них (например, «mapc» или другие просто очень сложны, и я их не «получал»). – PascalVKooten

+0

'M-x elisp-index-search' - ваш друг. (И если это не говорит вам достаточно, ключ 'I' предоставит вам полный список обращений к индексу для данного поискового запроса.) – phils

Смежные вопросы