2010-04-24 10 views
8

Nie znam nawet właściwej terminologii dla tej składni lisp, więc nie wiem, czy słowa, których używam do zadawania pytania, mają sens. Ale to pytanie ma sens, jestem pewien.emacs: jak używać edebug na kodzie zdefiniowanym w makrze?

Pozwolę sobie więc pokazać. cc-mode (cc-fonts.el) ma rzeczy zwane "matchers", które są bitami kodu, które działają, aby zdecydować, jak uściślić region kodu. Brzmi to dość prosto, ale kod Matchera jest w formie, której nie rozumiem całkowicie, z backtickami i przecinkiem, po prostu przecinkiem i tak dalej, a ponadto jest osadzony w C-Lang-Defcost, który sam w sobie jest makro. Nie wiem, jak to nazwać, ale chcę uruchomić edebug na tym kodzie.

Look:

(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))))))) 

Czytam się na składni lisp, aby dowiedzieć się, co te rzeczy są i co do nich zadzwonić, ale poza tym, w jaki sposób mogę uruchomić edebug na kodzie, który następuje komentarz to czyta ;; Fontify the identifiers inside enum lists.?

Wiem, jak uruchomić edebug na defun - wystarczy wywołać edebug-defun w ramach definicji funkcji i wyłączyć Idź. Czy istnieje odpowiednia rzecz do zrobienia edebug formularzy kodu cc-mode matcher?

Co robi def-edebug-spec i czy mogę go tutaj użyć? Jeśli tak to jak?

Odpowiedz

4

Według (elisp)Top > Debugging > Edebug > Edebug and Macros trzeba powiedzieć Edebug jak debugować makro definiując ją debug sprawozdania lub za pomocą def-edebug-spec. To mówi, jakie parametry powinny być oceniane, a które nie. Więc można to zrobić. Wygląda na to, że c-lang-defconst zostało już zainstalowane pod edebug. Oto definicja w przypadku, gdy byli zainteresowani:

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

Jednakże, jeśli chcesz po prostu zobaczyć, co ciało ma wartość, to sposób, aby to zrobić jest użycie czegoś podobnego macro-expand-last-sexp poniżej, aby zobaczyć wynik. Ustaw kursor za seksem, który chcesz rozwinąć (tak jak w przypadku C-x C-e) i uruchom M-x macro-expand-last-sexp RET. Spowoduje to wyświetlenie, do czego zostanie rozszerzony. Możesz napotkać problemy, jeśli spróbujesz rozwinąć coś takiego, jak ,(....), więc będziesz musiał skopiować to słowo gdzie indziej i usunąć , lub ,@.

(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))))) 

Myślę, że to zależy od tego, co dokładnie chcesz zrobić.

+0

Minęło trochę czasu, ale wierzę, że edebug obsługuje makropolecenie (') i jego specjalne konstrukcje do poprawnego wstawiania (, i, @). Nie ma sposobu, aby użyć edebug tylko dla podwyrażenia w definicji. Zamiast tego musisz przyswoić całe wyrażenie defun lub najwyższego poziomu. – dlaliberte

4

Użyj macroexpand lub macroexpand-all, aby przekształcić go w kod bez makr i jak zwykle debugować?

backticks & co można najlepiej zilustrować na przykład:

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

grawis (lub backquote `) jest podobna do środki (') tym, że zapobiega oceny, z wyjątkiem jej wpływ może być selektywnie cofnięte z przecinkiem (,); i ,@ jest podobny do ,, z tym że jego argument, który musi być listą, jest łączony na liście wynikowej.

Powiązane problemy