2010-03-13 23 views
16

Neredeyse aynı olan birkaç isim yazdım. Örneğinelisp makro?

; x is name, such as function/paragraph/line/etc. 
(defun my-x-function 
(interactive) 
(mark-x) (do-more-stuff) (modify-x)) 

vb fonksiyonu, paragraf, fonksiyonlar oluşturmak için otomatik olarak koymak için bir yol var? Makroların yaptığı bir duygu var ama onları nasıl kullanacağımı bilmiyorum. belki küçük bir örnek

Teşekkür

cevap

21

Yep çok iyi olurdu/yardımcı, yani makro tam olarak ne var. Sen Emacs bir *scratch* tamponuna bu makro kopyalayıp değerlendirmek ve sonra bu gibi işleri kontrol edebilirsiniz

(defmacro make-my-function (name) 
    (list 'defun (intern (format "my-%s-function" name))() 
     (list 'interactive) 
     (list (intern (format "mark-%s" name))) 
     (list 'do-more-stuff) 
     (list (intern (format "modify-%s" name))))) 

:

(make-my-function x) ; type control-J here 
my-x-function ; <-- Emacs's output 
(symbol-function 'my-x-function) ; type control-J here 
(lambda nil (interactive) (mark-x) (do-more-stuff) (modify-x)) ; <-- Emacs's output 
Burada belirtilen şablona göre fonksiyonları inşa basit makro var

Daha yaygın olarak, makroları daha özlü yazmak için backquote özelliğini kullanırız, ancak tüm makrolar esasen yukarıdaki örnekle aynı şekilde çalışır.

+4

+1. Makronun okunabilirliğini artırır. –

3

Makrolar bunu yapabilir, ancak benzer işler için emacs için çok sayıda şablon modülü vardır. Hızlı kod oluşturma işleri yapmak için yasnippet.el adlı bir şey kullanırım. Örneğin, bir C-kaynak dosyasında, for<TAB> yazıyorsa, bir for döngüsü şablonu alıyorum; Şablonu doldurmamı, değişken adını, limitleri ve dahili döngü içeriklerini ayarlamamı sağlar.

şuna benzer: İstediğiniz şey için şablonlar ayarlayabilirsiniz

alt text http://i39.tinypic.com/o8tbmq.jpg

. İşlev tanımları, ifadeler, ifadeler, ne olursa olsun. Farklı modlar için farklı şablonlar oluşturun. C'deki for döngüsü için şablon, C# öğesinde for döngüsünün şablonundan farklıdır, vb. Çok kullanışlı. Backquote tesisi için

+0

yasnippet harika, ama mutlaka aynı şey olmayabilir. Makro, belirsizdir çünkü emacs, * yazarak kopyalayan * klavye makrolarını * veya kod ağacını değiştiren * lisp makrolarını *; yasnippet daha çok yardımcı olur, eğer o, eğer soyutlanamayan bir klişe setine girmek zorundaysa (ki bu daha çok C/C++'dan daha doğrudur.) – Skrylar