Estou trabalhando para otimizar minha configuração do emacs, onde posso criar dinamicamente funções interativas para todos os temas que tenho em uma lista.
Abaixo está uma versão simplificada da construção que estou tentando fazer 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))
Mas se eu desenrolar o loop manualmente, ele funcionará:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Mas o abaixo não funciona onde passo os nomes dos símbolos (que provavelmente é o que está acontecendo quando o loop se desenrola sozinho). Observe as aspas antes dos argumentos da macro.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Atualizar
Graças à ajuda de @wvxvw , finalmente consegui fazer isso funcionar !
Como o @wvxvw sugere, não serei desonesto para gerar lotes para todo e qualquer caso de uso. Este foi um caso de uso especial em que, para um tema chamado XYZ
, eu quero gerar um desunião chamado load-theme/XYZ
que faz o trabalho de
- Desativando todos os outros temas que podem estar ativos
- Ligando
load-theme
paraXYZ
- Fazendo algumas coisas mais personalizadas relacionadas a esse tema; Passo as configurações personalizadas para cada tema através da lista
my/themes
.
cons
es, mas pretendo convertê-los em listas com propriedades personalizadas para cada tema.
(my/create-defun name)
3 vezes, então você deve definir uma função chamada name
3 vezes.
defuns
dentro de umprogn
.progn
pode ser um formulário de nível superior (no sentido de que tudo o que se aplica aos formulários de nível superior também se aplica ao conteúdoprogn
). Mas eu questionaria a lógica de criar funções dessa maneira: por que não ter, digamos, uma tabela de has- tas com lambdas como valores?