bir DSL oluşturmak için nasıl böyle bir şey arayan elisp bir DSL oluşturmak istiyorum: elisp genel bir ad alanı beri, Ancakelisp
(install
;; do install
)
(uninstall
;; do uninstall
)
, bu iyi bir fikir değildir. Ve bu gibi işlevlerin öneki, çok çirkin.
(commands
(install
;; do install
)
(uninstall
;; do uninstall
)
;; ...
)
Ama istemiyorum çünkü genel ad ve kaldırma yükleyin:
(package-install
;; do install
)
(package-uninstall
;; do uninstall
)
Yani böyle diyoruz tüm komutlar bir komutlar sarılmış edilebilecek bir uzlaşma olarak düşünülen
(defmacro commands (&rest body)
(mapcar
(lambda (exp)
(setcar exp (intern (concat "package-" (symbol-name (car exp)))))
(setcdr exp (list (cons 'progn (cdr exp)))))
body)
`(progn ,@body))
(commands
(install
;; do install
)
(uninstall
;; do uninstall
)
;; ...
)
: ben bir şekilde bu gibi belki için örnek önek adları komutları tüm tekrarlarını değiştirmek, komutlar makro zorunda
Bu böyle bir kesmek gibi görünüyor. Ayrıca iç içe komutlar varsa işe yaramaz.
Bunun için iyi bir çözüm var mıdır, yoksa gitmek için bir yol var mı?
Teşekkürler!
YASnipper, işlevlerini "yas /' ile önler; böylece "yas/expand" ifadesini alırsınız. Bunun çirkin olduğunu düşünmedim. Yazdığım tfs entegrasyonu için sözleşmeyi kabul ettim, böylece tfs/checkout', tfs/add' vb. Var. Bu, bunun için resmi desteğin yokluğunda isim belirleme yapmak için ucuz ve kolay bir yol gibi görünüyor. – Cheeso
Sadece stilistik bir açıklama: 'komut 'makronun tanımında olduğu gibi' setcar'/'setcdr' kullanmazdım. Taze bir 'cons' oluşturun (kod temizleyici bile yapardı). Makro genişleticiniz orijinal kod ağacını yıkıcı bir şekilde keyfi olarak değiştirirse, ne gibi etkileri olduğunu bilmiyorsunuz. – Dirk