Estoy trabajando en la optimización de mi configuración de emacs donde puedo crear dinámicamente funciones interactivas para todos los temas que tengo en una lista.
A continuación se muestra una versión simplificada de la construcción que estoy tratando de hacer funcionar.
;; 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))
Pero si desenrollo el bucle manualmente, funciona:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Pero a continuación no funciona donde paso los nombres de los símbolos (que probablemente sea lo que sucede cuando el bucle se desenrolla solo). Tenga en cuenta las comillas antes de los argumentos macro.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Actualizar
Gracias a la ayuda de @wvxvw , ¡ finalmente conseguí que esto funcionara !
Como @wvxvw sugiere, no generaré desfuns generadores de lotes para todos y cada uno de los casos de uso. Este fue un caso de uso especial donde para un tema llamado XYZ
, quiero generar un defun llamado load-theme/XYZ
que hace el trabajo de
- Deshabilitar todos los demás temas que puedan estar activos
- llamar
load-theme
paraXYZ
- Haciendo algunas cosas más personalizadas relacionadas con ese tema; Paso la configuración personalizada para cada tema a través de la
my/themes
lista.
cons
es pero planeo convertirlos en listas con propiedades personalizadas para cada tema.
(my/create-defun name)
3 veces, por lo que deberías terminar definiendo una función llamada name
3 veces.
defuns
dentro de aprogn
.progn
se permite que sea un formulario de nivel superior (en el sentido de que todo lo que se aplica a los formularios de nivel superior también se aplica al contenido deprogn
). Pero cuestionaría la lógica de crear funciones de esa manera: ¿por qué no tener, por ejemplo, una tabla has con lambdas como valores?