Pracuję nad optymalizacją konfiguracji emacsa, w której mogę dynamicznie tworzyć interaktywne funkcje dla wszystkich motywów, które mam na liście.
Poniżej znajduje się uproszczona wersja konstruktu, który próbuję wykonać.
;; 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))
Ale jeśli rozwinę pętlę ręcznie, zadziała:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Ale poniżej nie działa, gdy przekazuję nazwy symboli (co prawdopodobnie dzieje się, gdy pętla sama się rozwija). Zwróć uwagę na cudzysłowy przed argumentami makr.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Aktualizacja
Dzięki pomocy @wvxvw w końcu udało mi się to uruchomić !
Jak sugeruje @wvxvw, nie będę generować partii generujących odrzucenia dla każdego przypadku użycia. To był szczególny przypadek użycia, w którym dla motywu o nazwie XYZ
chcę wygenerować wywołanie defun, load-theme/XYZ
które działa
- Wyłączanie wszystkich innych motywów, które mogą być aktywne
- wywołanie
load-theme
dlaXYZ
- Robienie niestandardowych rzeczy związanych z tym tematem; Przechodzę przez niestandardowe ustawienia dla każdego motywu
my/themes
.
cons
e, ale planuję przekonwertować je na listy z niestandardowymi właściwościami dla każdego motywu.
(my/create-defun name)
3 razy, więc powinieneś zdefiniować funkcję o nazwie name
3 razy.
defuns
środkuprogn
.progn
może być formularzem najwyższego poziomu (w tym sensie, że wszystko, co dotyczy formularzy najwyższego poziomu, dotyczy również treściprogn
). Chciałbym jednak zakwestionować uzasadnienie tworzenia funkcji w taki sposób: dlaczego nie mieć, powiedzmy, tabelę z lambdami jako wartościami?