Emacs Lisp, как отобразить макрос и оценить один из аргументов

В главе 3 "Написание расширений GNU Emacs", глава 3, Боб Гликштейн описывает способ прокрутки функций. (Он предлагает сделать их обратимыми, поэтому мы должны сохранить состояние перед прокруткой.)

Например, для команды прокрутки вверх это консультирование выполняется так

(defadvice scroll-up-command (before reversibilate activate compile)
   "If it wants to be reversible, it must save the former state."
   (save-before-scroll))

Что ж. Я, конечно, должен сделать это со всеми командами прокрутки. Поэтому я хотел бы составить их последовательность и посоветовать им вместе.

(setq reversible-scroll-commands 
  [scroll-up-command 
   scroll-down-command 
   scroll-left-command 
   scroll-right-command])

(Я использую вектор, чтобы сохранить 5 цитат.)

Но сейчас я застрял.

(mapcar 
  (lambda (fun-name)
    (defadvice fun-name (before reversibilate activate compile)
       "If it wants to be reversible, it must save the former state."
       (save-before-scroll)))
   reversible-scroll-commands)

будет сообщать (несуществующую) функцию fun-name четыре раза, так как defadvice является макросом и не оценивает fun-name.

Есть ли способ сделать это?

(Я использую Emacs 24)

1 ответ

Решение

Непроверенные:

(mapcar 
  (lambda (fun-name)
    (eval `(defadvice ,fun-name (before reversibilate activate compile)
             "If it wants to be reversible, it must save the former state."
             (save-before-scroll))))
   reversible-scroll-commands)

Смотрите раздел о обратных цитатах в руководстве по elisp.

Другие вопросы по тегам