elisp

2011-01-10 19 views
6

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!

+0

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

+0

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

cevap

8

Yerel olarak install'u ve arkadaşlarını tanımlamaya ne dersiniz? Bu, standart fonksiyonları gizlemez, ama gerçekten peşinde olduğunuza benzemez.

(defmacro commands (&rest body) 
    `(flet ((install (&rest args) (apply 'package-install args)) 
      (uninstall (&rest args) (apply 'package-uninstall args))) 
    ,@body)) 

Elbette otomatik flet bağımsız değişkenlerin o listeyi oluşturmak istersiniz. Paketinizin öğelerinin bir listesini, muhtemelen (feature-symbols 'package) kullanarak bir yere ihtiyacınız var.

+1

Bu tam olarak aradığım şey! Çok teşekkürler! – rejeep

İlgili konular