En C existe la variable mágica __func__
que contiene el nombre de la función actual. ¡En Bash, hay una matriz que FUNCNAME
contiene los nombres de todas las funciones en la pila de llamadas!
¿Hay algo similar en Emacs Lisp? ¿O alguna forma simple de que una función tenga acceso a su nombre?
No he encontrado ninguna respuesta en el manual de Emacs Lisp (capítulo 12 sobre Funciones o índice de variables y funciones y ...)
Respuestas:
Para las funciones interactivas, es decir, comandos, puede utilizar la variable
this-command
, o más seguro,real-this-command
. La diferencia es que cuando escribe sus propias funciones, puede cambiar explícitamente el valor dethis-command
. Principalmente, esto se hace para jugar trucoslast-command
relacionados con comandos repetitivos. No deberías (¿no?) Hacer esto conreal-this-command
. Siempre será el nombre del comando actual.No conozco un equivalente para funciones no interactivas.
fuente
this-command
yreal-last-command
no son para nada similares__func__
. Por ejemplo, si el comando A llama al comando B que imprimethis-command
, imprimirá el comando A, no B, y esto tampoco funciona para las funciones.Respuesta actualizada con búsqueda de tiempo de expansión:
Dije en mi respuesta original que puede haber una manera de hacer esto en tiempo de expansión / compilación en lugar de tiempo de ejecución para dar un mejor rendimiento y finalmente lo implementé hoy mientras trabajaba en mi respuesta para esta pregunta: ¿Cómo puedo determinar qué función era llamado interactivamente en la pila?
Aquí hay una función que produce todos los marcos de traza inversa actuales
Usando eso en una macro, podemos buscar la pila de expansión para ver qué definición de función se está expandiendo en ese momento y poner ese valor en el código.
Aquí está la función para hacer la expansión:
Aquí está en acción.
Respuesta original
Puede usar
backtrace-frame
para buscar la pila hasta que vea el marco que representa una llamada de función directa y obtener el nombre de eso.Aquí estoy haciendo la búsqueda del nombre de la función en tiempo de ejecución, aunque probablemente sea posible implementar esto en una macro que se expande directamente en el símbolo de la función que sería más eficiente para las llamadas repetidas y elisp compilado.
Encontré esta información al intentar escribir una especie de registrador de llamadas de función para elisp que se puede encontrar aquí en forma incompleta, pero puede ser útil para usted. https://github.com/jordonbiondo/call-log
fuente
defun
está encerrado poreval-and-compile
, es decir, regresanil
.