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.
sumber
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?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 disebutname
3 kali.Jawaban:
Berikut adalah upaya menjelaskan dan beberapa saran.
Sekarang, mari kita coba perbaiki ini:
Contoh dengan membaca nama fungsi dari variabel
Masalahnya adalah dari jenis konseptual: makro adalah untuk menghasilkan kode ketika lingkungan ingin membacanya. Ketika Anda mengeksekusi kode sendiri (sebagai pengguna program Anda) ini sudah terlambat untuk melakukannya (lingkungan harus tahu pada saat itu apa program itu).
Sebuah catatan pinggir: Saya akan menyarankan agar tidak menyatukan beberapa
defuns
. Alasannya adalah itu membuat debuggin jauh lebih rumit. Sedikit redundansi yang Anda miliki dalam definisi berulang terbayar dengan sangat baik selama fase pemeliharaan (dan pemeliharaan biasanya merupakan fase terpanjang dalam masa hidup program).sumber
mapcar
dengan alists. Ini sepertinya tidak bekerja dengan use case saya yang sebenarnya. Saya akan menggali ini secepat mungkin.(mapcar (lambda (x) (message "argument: %s" x)) some-alist)
apa argumen yang Anda dapatkan, dan bekerja dari sana. Jika itu daftar asosiatif, saya bayangkan outputnya sepertiargument: (foo . bar)
, maka Anda dapat mengaksesfoo
menggunakancar
danbar
menggunakancdr
fungsi.nth
fn alih-alihcar
dancadr
) tetapisequencep
check-inmapcar
salah. Saya memberikan alist sebagai input tetapi mapcar masih tidak berpikir itu adalah urutan. Jika saya melakukannya(sequencep my-alist)
, itu bukan nol. Jadi saya bingung .. Saya harus men-debug itu.my-alist
adalahnil
atau Anda lupa (atau menambahkan ekstra) tanda kutip sehinggamy-alist
bisa menjadi simbol, atau dievaluasi lebih jauh untuk menjadi sesuatu yang lain. Anda mungkin ingin memperluas pertanyaan Anda dengan kode baru agar lebih mudah dijawab.Tidak benar-benar defun tapi mengapa tidak? : P
sumber
Saya memiliki yang berikut di init saya:
Ini mungkin sedikit lebih kompleks daripada yang dibutuhkan (terutama eval tambahan) tetapi itu memungkinkan saya untuk menghasilkan defuns yang saya butuhkan untuk properti-properti tersebut (dan memasukkan dokumen dengan informasi yang benar dalam string).
sumber