emacs: Wie verwende ich edebug für Code, der in einem Makro definiert ist?

8

Ich kenne nicht einmal die richtige Terminologie für diese Lispensyntax, daher weiß ich nicht, ob die Wörter, die ich verwende, um die Frage zu stellen, einen Sinn ergeben. Aber die Frage ergibt, ich bin mir sicher.

Also lass es mich dir zeigen. cc-mode (cc-fonts.el) hat Dinge namens "matchers", bei denen es sich um Code-Bits handelt, die ausgeführt werden, um zu entscheiden, wie eine Code-Region definiert werden soll. Das klingt einfach genug, aber der Matcher-Code ist in einer Form, die ich nicht vollständig verstehe, mit Backticks und Komma-Zeichen und nur Komma und so weiter, und außerdem ist er eingebettet in eine c-lang-defcost, die selbst ein a ist Makro. Ich weiß nicht, wie ich all das nennen soll, aber ich möchte edebug auf diesem Code laufen lassen.

Schau:

%Vor%

Ich lese gerade über Lisp Syntax, um herauszufinden, was diese Dinge sind und wie sie sie nennen, aber abgesehen davon, wie kann ich Edgebug auf den Code, der dem Kommentar folgt, der ;; Fontify the identifiers inside enum lists. ? liest, ausführen?

Ich weiß, wie man edebug auf einem defun ausführt - rufen Sie einfach edebug-defun innerhalb der Definition der Funktion auf, und ich gehe los. Gibt es eine entsprechende Sache, die ich tun muss, um die cc-Modus-Matcher-Code-Formulare edebug?

Was macht def-edebug-spec , und würde ich es hier benutzen? Wenn das so ist, wie?

    
Cheeso 24.04.2010, 12:06
quelle

2 Antworten

4

Laut (elisp)Top > Debugging > Edebug > Edebug and Macros müssen Sie Edebug mitteilen, wie Sie ein Makro debuggen, indem Sie es mit debug -Anweisungen definieren oder def-edebug-spec verwenden. Dies sagt ihm, welche Parameter ausgewertet werden sollten und welche nicht. So kann es gemacht werden. Tatsächlich sieht es so aus, als wäre c-lang-defconst bereits für edebug angepasst worden. Hier ist die Definition für den Fall, dass Sie interessiert sind:

%Vor%

Wenn Sie jedoch nur sehen möchten, was der Körper auswertet, verwenden Sie etwas wie macro-expand-last-sexp , um das Ergebnis zu sehen. Positioniere den Cursor nach dem gewünschten Sexp (wie bei C-x C-e ) und führe M-x macro-expand-last-sexp RET aus. Dies zeigt Ihnen, worauf es erweitert wird. Sie könnten Probleme bekommen, wenn Sie versuchen, etwas wie ,(....) zu erweitern, so dass Sie dieses Sexp irgendwo anders kopieren müssen und die , oder ,@ löschen müssen.

%Vor%

Ich schätze, es kommt darauf an, was genau Sie vorhaben.

    
Ivan Andrus 01.05.2010, 23:13
quelle
4

Verwenden Sie macroexpand oder macroexpand-all , um es in makrofreien Code umzuwandeln und wie üblich zu debuggen?

Backticks & amp; co kann am besten durch ein Beispiel illustriert werden:

%Vor%

Ein Backtick (oder ein Backquote ' ) ähnelt einem Zitat ( ' ) insofern, als es die Auswertung verhindert, außer dass der Effekt selektiv mit einem Komma rückgängig gemacht werden kann ( , ); und ,@ ist wie , , außer dass sein Argument, das eine Liste sein muss, in die resultierende Liste eingefügt wird.

    
huaiyuan 01.05.2010 12:05
quelle

Tags und Links