Saya sedang berupaya mengoptimalkan konfigurasi emacs saya di mana saya dapat secara dinamis membuat fungsi interaktif untuk semua tema yang saya miliki dalam daftar.
Di bawah ini adalah versi sederhana dari konstruk yang saya coba buat.
;; 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))
Tetapi jika saya membuka gulungan secara manual, itu bekerja:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Tetapi di bawah ini tidak berfungsi di mana saya memberikan nama simbol (yang mungkin adalah apa yang terjadi ketika loop terbuka dengan sendirinya). Catat kutipan sebelum argumen makro.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Memperbarui
Terima kasih atas bantuan @wvxvw , akhirnya saya berhasil !
Seperti yang disarankan @wvxvw, saya tidak akan menjadi penggila batch untuk setiap kasus penggunaan. Ini adalah kasus penggunaan khusus di mana untuk tema bernama XYZ
, saya ingin menghasilkan defun disebut load-theme/XYZ
yang melakukan pekerjaan
- Menonaktifkan semua tema lain yang mungkin aktif
- Memanggil
load-theme
untukXYZ
- Melakukan beberapa hal khusus yang terkait dengan tema itu; Saya melewati pengaturan khusus untuk setiap tema melalui daftar
my/themes
alist.
cons
es tetapi saya berencana untuk mengonversinya menjadi daftar dengan properti khusus untuk setiap tema.
(my/create-defun name)
3 kali, jadi Anda harus mendefinisikan fungsi yang disebut name
3 kali.
defuns
dalam aprogn
.progn
diizinkan untuk menjadi formulir tingkat atas (dalam arti bahwa segala sesuatu yang berlaku untuk formulir tingkat atas berlaku untuk kontenprogn
juga). Tetapi saya akan mempertanyakan alasan menciptakan fungsi sedemikian rupa: mengapa tidak, katakanlah, memiliki tabel dengan lambdas sebagai nilai?