W C znajduje się zmienna magiczna, __func__
która przechowuje aktualną nazwę funkcji. W Bash znajduje się tablica FUNCNAME
zawierająca nazwy wszystkich funkcji na stosie wywołującym !!!
Czy w Emacs Lisp jest coś podobnego? Lub jakikolwiek prosty sposób, aby funkcja miała dostęp do jej nazwy?
Nie znalazłem żadnej odpowiedzi w podręczniku Emacsa Lispa (rozdział 12 o funkcjach lub indeks zmiennych i funkcji i ..)
Odpowiedzi:
Dla funkcji interaktywnych, to znaczy poleceń można użyć zmiennej
this-command
, lub bezpieczniejszymi,real-this-command
. Różnica polega na tym, że pisząc własne funkcje, możesz wyraźnie zmienić wartośćthis-command
. Przeważnie odbywa się to w celu zagrania trikówlast-command
związanych z powtarzaniem poleceń. Nie powinieneś (nie możesz?) Tego zrobićreal-this-command
. Zawsze będzie to nazwa bieżącego polecenia.Nie znam odpowiednika funkcji nieinteraktywnych.
źródło
this-command
ireal-last-command
wcale tak nie jest__func__
. Na przykład, jeśli polecenie A wywołuje polecenie B, którethis-command
je wypisuje , wypisze polecenie A, a nie B, to również nie działa w ogóle dla funkcji.Zaktualizowana odpowiedź z wyszukiwaniem czasu rozszerzenia:
Powiedziałem w mojej oryginalnej odpowiedzi, że może istnieć sposób, aby to zrobić w czasie rozszerzania / kompilacji zamiast w czasie wykonywania, aby zapewnić lepszą wydajność, i w końcu zaimplementowałem to dzisiaj, pracując nad moją odpowiedzią na to pytanie: Jak ustalić, która funkcja była wywoływany interaktywnie na stosie?
Oto funkcja, która zwraca wszystkie bieżące ramki śledzenia
Korzystając z tego w makrze, możemy sprawdzić stos rozszerzeń, aby zobaczyć, która definicja funkcji jest rozwijana w danym momencie i umieścić tę wartość w kodzie.
Oto funkcja wykonania rozszerzenia:
Tutaj jest w akcji.
Oryginalna odpowiedź:
Możesz użyć
backtrace-frame
do sprawdzenia stosu, aż zobaczysz ramkę reprezentującą bezpośrednie wywołanie funkcji i uzyskaj z tego nazwę.W tym momencie wykonuję wyszukiwanie nazwy funkcji w czasie wykonywania, chociaż prawdopodobnie można to zaimplementować w makrze, które rozwija się bezpośrednio w symbol funkcji, który byłby bardziej wydajny w przypadku powtarzania wywołań i kompilacji elisp.
Znalazłem tę informację, próbując napisać rodzaj rejestratora wywołań funkcji dla elisp, który można znaleźć tutaj w niekompletnej formie, ale może być dla ciebie przydatny. https://github.com/jordonbiondo/call-log
źródło
defun
jest otoczoneeval-and-compile
, tzn. Zwracanil
.