Я працюю над оптимізацією конфігурації 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я хочу генерувати розгортку, яку називають, load-theme/XYZяка виконує завдання
- Вимкнення всіх інших тем, які можуть бути активними
- виклик
load-themeдляXYZ - Робити ще деякі спеціальні речі, пов’язані з цією темою; Я передаю спеціальні налаштування для кожної теми через список
my/themes.
conses, але я планую перетворити їх у списки зі спеціальними властивостями для кожної теми.
(my/create-defun name)3 рази, тому вам слід завершити визначення функції, яка називається name3 рази.
defunsвсерединуprogn.prognможе бути формою найвищого рівня (у тому сенсі, що все, що стосується форм вищого рівня, теж стосується вмістуprogn). Але я б поставив під сумнів обґрунтування створення функцій таким чином: чому б не мати, скажімо, таблицю з таблицями з лямбдазами як значення?