2010-04-24 17 views
8

Hatta bu lisp sözdizimi için uygun terminolojiyi bilmiyorum, o yüzden soru sormak için kullanıyorum kelimeler, mantıklı eğer bilmiyorum. Ama soru mantıklı, eminim. emacs: Bir makroda tanımlanan kod hakkında nasıl bir özellik kullanırım?

Yani bana sadece size göstereyim. cc-mode (cc-fonts.el) kod bölgesini nasıl font edeceğine karar vermek için çalışan kod parçaları olan "eşleştiriciler" adı verilen şeylere sahiptir. Bu yeterince basit geliyor ama eşleştirici kodu vb ters tırnakların ve virgül-ATSIGN ve sadece virgül ile, tamamen anlamıyorum bir formda olup, öte yandan kendisi bir c-lang-defcost, gömülüdür makro. Tüm bunlara ne diyeceğimi bilmiyorum, ama o koddaki yayıncıyı çalıştırmak istiyorum.

Bak: Ben yorumunu şöyle kodu edebug çalıştırabilirsiniz nasıl Bundan bir kenara çağırır, ancak ne bu şeyler vardır ve ne olduğunu anlamaya lisp sözdizimi üzerinde okuyorum

(c-lang-defconst c-basic-matchers-after 
    "Font lock matchers for various things that should be fontified after 
generic casts and declarations are fontified. Used on level 2 and 
higher." 

    t `(;; Fontify the identifiers inside enum lists. (The enum type 
     ;; name is handled by `c-simple-decl-matchers' or 
     ;; `c-complex-decl-matchers' below. 
     ,@(when (c-lang-const c-brace-id-list-kwds) 
      `((,(c-make-font-lock-search-function 
       (concat 
       "\\<\\(" 
       (c-make-keywords-re nil (c-lang-const c-brace-id-list-kwds)) 
       "\\)\\>" 
       ;; Disallow various common punctuation chars that can't come 
       ;; before the '{' of the enum list, to avoid searching too far. 
       "[^\]\[{}();,/#=]*" 
       "{") 
       '((c-font-lock-declarators limit t nil) 
        (save-match-data 
        (goto-char (match-end 0)) 
        (c-put-char-property (1- (point)) 'c-type 
             'c-decl-id-start) 
        (c-forward-syntactic-ws)) 
        (goto-char (match-end 0))))))) 

, ;; Fontify the identifiers inside enum lists. okur?

Bir defun üzerinde edebug çalıştırmak için biliyorum - sadece işlevin tanımı içinde edebug-defun çağırmak ve ben gidiyorum. Cc-mode eşleştirici kod formlarımda yayınlamak için yapmam gereken bir şey var mı?

def-edebug-spec ne yapar, ve ben burayı kullanırsınız? Öyleyse nasıl?

cevap

4

(elisp)Top > Debugging > Edebug > Edebug and Macros'a göre Edebug'a, debug ifadeleriyle tanımlayarak veya def-edebug-spec kullanarak bir makroda nasıl hata ayıklanacağını söylemeniz gerekir. Bu, hangi parametrelerin değerlendirilmesi gerektiğini ve hangisinin yapılmaması gerektiğini söyler. Yani yapılabilir. Aslında, edebug için zaten c-lang-defconst takılmış gibi görünüyor. Burada ilgi durumunda tanımı şöyledir: Ancak

(def-edebug-spec c-lang-defconst 
    (&define name [&optional stringp] [&rest sexp def-form])) 

, sadece beden olarak değerlendirilir neyi görmek istiyorsanız, bunu yapmak için daha sonra yolu sonucunu görmek için aşağıdaki macro-expand-last-sexp gibi bir şey kullanmaktır. İmlecinizi genişletmek istediğiniz cinsinden sonra (C-x C-e için yaptığınız gibi) konumlandırın ve M-x macro-expand-last-sexp RET'u çalıştırın. Bu size ne kadar genişleyeceğini gösterecektir. ,(....) gibi bir şeyi genişletmeye çalışırsanız, bu tür sorunlarla karşılaşabilirsiniz, böylece bu sexp'i başka bir yere kopyalayıp , veya ,@'u silin.

(defun macro-expand-last-sexp (p) 
    "Macro expand the previous sexp. With a prefix argument 
insert the result into the current buffer and pretty print it." 
    (interactive "P") 
    (let* 
     ((sexp (preceding-sexp)) 
     (expanded (macroexpand sexp))) 
    (cond ((eq sexp expanded) 
      (message "No changes were found when macro expanding")) 
      (p 
      (insert (format "%S" expanded)) 
      (save-excursion 
      (backward-sexp) 
      (indent-pp-sexp 1) 
      (indent-pp-sexp))) 
      (t 
      (message "%S" expanded))))) 

Sanırım, tam olarak ne yapmaya çalıştığınıza bağlı.

+0

Bir süredir var, ama ben inanıyorum ki, backgrick makrosu (') ve onun özel yapısı (, ve, @) için uygun şekilde ele alır. Bir tanım içinde yalnızca bir alt ifadeyle ilgili olarak Bunun yerine, tüm defun veya üst düzey ifadeyi almanız gerekir. – dlaliberte

4

kullanın macroexpand veya macroexpand-all zamanki gibi makro içermeyen kodu ve hata ayıklama çevirmek için?

backticks & eş iyi bir örnek ile izah edilebilir:

(let ((a 1) 
     (b (list 2 3))) 
    `(a ,a ,b ,@b)) 
-> (a 1 (2 3) 2 3) 

bir ters tırnak (veya Backquote `) etkisi seçimli olarak geri alınabilir ancak bu, değerlendirme önler bir tırnak işareti (') benzerdir bir virgülle (,); ve ,@, bir liste olması gereken argümanın sonuç listesine eklenmesi dışında , gibidir.

İlgili konular