In C gibt es die magische Variable __func__
, die den aktuellen Funktionsnamen enthält. In Bash gibt es ein Array FUNCNAME
, das die Namen aller Funktionen im aufrufenden Stack enthält !!!
Gibt es in Emacs Lisp etwas Ähnliches? Oder eine einfache Möglichkeit für eine Funktion, auf ihren Namen zuzugreifen?
Ich habe im Emacs Lisp-Handbuch keine Antwort gefunden (Kapitel 12 über Funktionen oder Index von Variablen und Funktionen und ..)
Antworten:
Für interaktive Funktionen, dh Befehle, können Sie die Variable verwenden
this-command
oder sichererreal-this-command
. Der Unterschied besteht darin, dass Sie beim Schreiben Ihrer eigenen Funktionen den Wert von explizit ändern könnenthis-command
. Meistens wird dies getan, um Streiche mitlast-command
sich wiederholenden Befehlen zu spielen. Das solltest du nicht (kannst du nicht?) Mit machenreal-this-command
. Es wird immer der Name des aktuellen Befehls sein.Mir ist kein Äquivalent für nicht interaktive Funktionen bekannt.
quelle
this-command
undreal-last-command
überhaupt nicht mögen__func__
. Wenn beispielsweise der Befehl A den Befehl B aufruft, der ihn ausgibtthis-command
, wird der Befehl A und nicht B ausgegeben, und dies funktioniert überhaupt nicht für Funktionen.Aktualisierte Antwort mit Suche nach Erweiterungszeit:
Ich sagte in meiner ursprünglichen Antwort, dass es eine Möglichkeit geben könnte, dies zur Expansions- / Kompilierungszeit anstatt zur Laufzeit zu tun, um eine bessere Leistung zu erzielen, und implementierte dies schließlich heute, während ich an meiner Antwort für diese Frage arbeitete: Wie kann ich bestimmen, welche Funktion war? interaktiv im Stack aufgerufen?
Hier ist eine Funktion, die alle aktuellen Backtrace-Frames liefert
Wenn wir das in einem Makro verwenden, können wir im Erweiterungsstapel nachsehen, welche Funktionsdefinition gerade erweitert wird, und diesen Wert direkt in den Code einfügen.
Hier ist die Funktion, um die Erweiterung durchzuführen:
Hier ist es in Aktion.
Ursprüngliche Antwort:
Mit können Sie
backtrace-frame
den Stapel nachschlagen, bis Sie einen Frame sehen, der einen direkten Funktionsaufruf darstellt, und den Namen daraus erhalten.Hier mache ich die Suche nach Funktionsnamen zur Laufzeit, obwohl es wahrscheinlich möglich ist, dies in einem Makro zu implementieren, das direkt in das Funktionssymbol erweitert wird, das für wiederholte Aufrufe und kompiliertes Elisp leistungsfähiger wäre.
Ich habe diese Information gefunden, als ich versucht habe, eine Art Funktionsaufruf-Logger für elisp zu schreiben, der hier in unvollständiger Form zu finden ist, aber er könnte für Sie nützlich sein. https://github.com/jordonbiondo/call-log
quelle
defun
eingeschlossen isteval-and-compile
, dh es kehrt zurücknil
.