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