Sto lavorando per ottimizzare la mia configurazione di emacs in cui posso creare dinamicamente funzioni interattive per tutti i temi che ho in un elenco.
Di seguito è una versione semplificata del costrutto che sto cercando di far funzionare.
;; 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))
Ma se scarico il ciclo manualmente, funziona:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Ma il seguito non funziona dove passo i nomi dei simboli (che è probabilmente ciò che sta accadendo quando il ciclo si svolge da solo). Nota le virgolette prima degli argomenti macro.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Aggiornare
Grazie all'aiuto di @wvxvw , ho finalmente funzionato !
Come suggerisce @wvxvw, non genererò batch generatori per ogni singolo caso d'uso. Questo è stato un caso d'uso speciale in cui per un tema chiamato XYZ
, voglio generare un defun chiamato load-theme/XYZ
che fa il lavoro di
- Disabilitando tutti gli altri temi che potrebbero essere attivi
- Chiamando
load-theme
perXYZ
- Fare alcune altre cose personalizzate relative a quel tema; Passo attraverso le impostazioni personalizzate per ciascun tema attraverso la
my/themes
lista.
cons
es, ma ho intenzione di convertirli in elenchi con proprietà personalizzate per ciascun tema.
(my/create-defun name)
3 volte, quindi dovresti finire per definire una funzione chiamata name
3 volte.
defuns
dentro aprogn
.progn
è consentito essere un modulo di livello superiore (nel senso che tutto ciò che si applica ai moduli di livello superiore si applica anche al contenuto diprogn
). Ma metterei in dubbio la logica della creazione di funzioni in questo modo: perché non avere, diciamo, una tabella hash con lambda come valori?