Je travaille à l' optimisation de ma configuration emacs où je peux créer dynamiquement des fonctions interactives pour tous les thèmes que j'ai dans une liste.
Voici une version simplifiée de la construction que j'essaie de faire fonctionner.
;; 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))
Mais si je déroule la boucle manuellement, cela fonctionne:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Mais ce qui suit ne fonctionne pas là où je passe les noms de symboles (ce qui se produit probablement lorsque la boucle se déroule d'elle-même). Notez les guillemets avant les arguments de macro.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Mise à jour
Grâce à l 'aide de @wvxvw , j'ai finalement réussi à faire en sorte que cela fonctionne !
Comme le suggère @wvxvw, je ne produirai pas de défuns générant des lots pour tous les cas d'utilisation. C'était un cas d'utilisation spécial où pour un thème nommé XYZ
, je veux générer un defun appelé load-theme/XYZ
qui fait le travail de
- Désactiver tous les autres thèmes qui pourraient être actifs
- Appel
load-theme
àXYZ
- Faire des trucs plus personnalisés liés à ce thème; Je passe les paramètres personnalisés pour chaque thème à travers la liste
my/themes
.
cons
liste ne contient que des es, mais je prévois de les convertir en listes avec des propriétés personnalisées pour chaque thème.
(my/create-defun name)
3 fois, vous devez donc définir une fonction appelée name
3 fois.
defuns
intérieur aprogn
.progn
est autorisé à être un formulaire de niveau supérieur (dans le sens où tout ce qui s'applique aux formulaires de niveau supérieur s'applique également au contenu deprogn
). Mais je remettrais en question la justification de la création de fonctions de cette manière: pourquoi ne pas avoir, disons, un has-table avec des lambdas comme valeurs?