Em C, existe a variável mágica __func__
que contém o nome da função atual. No Bash, existe uma matriz FUNCNAME
contendo os nomes de todas as funções na pilha de chamada !!!
Existe algo semelhante no Emacs Lisp? Ou alguma maneira simples de uma função ter acesso ao seu nome?
Não encontrei nenhuma resposta no manual Emacs Lisp (capítulo 12 sobre Funções ou índice de variáveis e funções e ..)
Respostas:
Para funções interativas, ou seja, comandos, você pode usar a variável
this-command
ou mais seguroreal-this-command
. A diferença é que, quando você escreve suas próprias funções, pode alterar explicitamente o valor dethis-command
. Isso é feito principalmente para executar truqueslast-command
relacionados a comandos repetidos. Você não deve (não pode?) Fazer isso comreal-this-command
. Será sempre o nome do comando atual.Não conheço um equivalente para funções não interativas.
fonte
this-command
ereal-last-command
não é nada parecido__func__
. Por exemplo, se o comando A chamar o comando B que o imprimethis-command
, imprimirá o comando A, e não B, também isso não funciona para as funções.Resposta atualizada com pesquisa de tempo de expansão:
Eu disse na minha resposta original que pode haver uma maneira de fazer isso no tempo de expansão / compilação, em vez do tempo de execução, para oferecer melhor desempenho e finalmente o implementei hoje, enquanto trabalhava na minha resposta para esta pergunta: Como posso determinar qual função foi chamado interativamente na pilha?
Aqui está uma função que gera todos os quadros de backtrace atuais
Usando isso em uma macro, podemos procurar a pilha de expansão para ver qual definição de função está sendo expandida no momento e colocar esse valor no código.
Aqui está a função para fazer a expansão:
Aqui está em ação.
Resposta original:
Você pode usar
backtrace-frame
para procurar a pilha até ver o quadro que representa uma chamada de função direta e obter o nome disso.Aqui, estou pesquisando o nome da função em tempo de execução, embora provavelmente seja possível implementá-la em uma macro que se expanda diretamente no símbolo da função, que teria melhor desempenho para chamadas repetidas e elisp compilado.
Encontrei essas informações ao tentar escrever um tipo de registrador de chamadas de função para elisp, que pode ser encontrado aqui em sua forma incompleta, mas pode ser útil para você. https://github.com/jordonbiondo/call-log
fonte
defun
é delimitado poreval-and-compile
, ou seja, ele retornanil
.