В C есть магическая переменная, __func__
которая содержит текущее имя функции. В Bash есть массив, FUNCNAME
содержащий имена всех функций в стеке вызовов !!!
Есть ли похожая вещь в Emacs Lisp? Или какой-нибудь простой способ для функции иметь доступ к своему имени?
Я не нашел никакого ответа в руководстве по Emacs Lisp (глава 12, посвященная функциям или индексу переменных и функций и ...)
Ответы:
Для интерактивных функций, т. Е. Команд, вы можете использовать переменную
this-command
или безопаснееreal-this-command
. Разница в том, что когда вы пишете свои собственные функции, вы можете явно изменить значениеthis-command
. В основном это делается для того, чтобы поиграть сlast-command
повторяющимися командами. Вы не должны (не можете?) Сделать это сreal-this-command
. Это всегда будет имя текущей команды.Я не знаю эквивалент для неинтерактивных функций.
источник
this-command
иreal-last-command
вовсе не как__func__
. Например, если команда A вызывает команду B, которая печатает,this-command
она напечатает команду A, а не B, также это не работает вообще для функций.Обновленный ответ с поиском по времени расширения:
В своем первоначальном ответе я сказал, что может быть способ сделать это во время развертывания / компиляции вместо времени выполнения, чтобы повысить производительность, и я, наконец, реализовал это сегодня, работая над своим ответом на этот вопрос: как определить, какая функция была интерактивно вызывается в стеке?
Вот функция, которая выдает все текущие кадры обратного следа
Используя это в макросе, мы можем найти стек расширения, чтобы увидеть, какое определение функции расширяется в данный момент, и поместить это значение прямо в код.
Вот функция для расширения:
Вот оно в действии.
Оригинальный ответ:
Вы можете использовать
backtrace-frame
поиск стека, пока не увидите фрейм, представляющий прямой вызов функции, и не получите имя из этого.Здесь я делаю поиск имени функции во время выполнения, хотя, вероятно, возможно реализовать это в макросе, который расширяется непосредственно в символ функции, который был бы более производительным для повторных вызовов и скомпилированного elisp.
Я нашел эту информацию, пытаясь написать своего рода журнал вызовов функций для elisp, который можно найти здесь в его неполной форме, но он может быть полезен для вас. https://github.com/jordonbiondo/call-log
источник
defun
заключеноeval-and-compile
, то есть возвращаетсяnil
.