Я работаю над оптимизацией своего конфига emacs, где я могу динамически создавать интерактивные функции для всех тем, которые есть в списке.
Ниже приведен упрощенный вариант конструкции, которую я пытаюсь заставить работать.
;; List containing names of functions that I want to create
(setq my/defun-list '(zz-abc
zz-def
zz-ghi))
;; Elisp macro to create an interactive defun whose name
;; is passed as the macro argument
(defmacro my/create-defun (defun-name)
`(defun ,defun-name ()
(interactive)
(let ((fn-name (symbol-name ',defun-name)))
(message "Testing creation of function %s" fn-name))))
;; Loop to call the above macro for each element in the list
;; DOES *NOT* WORK
(dolist (name my/defun-list)
(my/create-defun name))
Но если я разверну цикл вручную, он будет работать:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Но ниже не работает, где я передаю имена символов (что, вероятно, происходит, когда цикл разворачивается сам по себе). Обратите внимание на кавычки перед аргументами макроса.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Обновить
Благодаря помощи @wvxvw , я наконец-то заработал !
Как подсказывает @wvxvw, я не буду генерировать пакетные функции для любого и каждого варианта использования. Это был особый случай, когда для темы с именем XYZ
я хочу создать defun с именем, load-theme/XYZ
который выполняет работу
- Отключение всех других тем, которые могут быть активными
- Призывая
load-theme
кXYZ
- Делать еще кое-что, связанное с этой темой; Я передаю пользовательские настройки для каждой темы через
my/themes
alist.
cons
es, но я планирую преобразовать их в списки с настраиваемыми свойствами для каждой темы.
(my/create-defun name)
3 раза, поэтому вам следует определить функцию, вызываемую name
3 раза.
defuns
внутрьprogn
.progn
разрешено быть формой верхнего уровня (в том смысле, что все, что относится к формам верхнего уровня, относится и к содержимомуprogn
). Но я бы поставил под сомнение обоснованность создания функций таким образом: почему бы не иметь, скажем, таблицу с лямбдами в качестве значений?