En C, il y a la variable magique __func__
qui contient le nom de la fonction actuelle. Dans Bash, il y a un tableau FUNCNAME
contenant les noms de toutes les fonctions dans la pile d'appel !!!
Y a-t-il une chose similaire dans Emacs Lisp? Ou un moyen simple pour qu'une fonction ait accès à son nom?
Je n'ai trouvé aucune réponse dans le manuel Emacs Lisp (chapitre 12 sur les fonctions ou index des variables et fonctions et ..)
Réponses:
Pour les fonctions interactives, par exemple, les commandes, vous pouvez utiliser la variable
this-command
, ou plus sûr,real-this-command
. La différence étant que lorsque vous écrivez vos propres fonctions, vous pouvez explicitement changer la valeur dethis-command
. Généralement, cela est fait pour jouer des tourslast-command
liés à la répétition de commandes. Vous ne devriez pas (ne pouvez pas) faire cela avecreal-this-command
. Ce sera toujours le nom de la commande en cours.Je ne connais pas d'équivalent pour les fonctions non interactives.
la source
this-command
etreal-last-command
ne sont pas du tout comme__func__
. Par exemple, si la commande A appelle la commande B qui l'imprime,this-command
elle imprimera la commande A, pas B, cela ne fonctionne pas du tout pour les fonctions.Réponse mise à jour avec recherche de temps d'extension:
J'ai dit dans ma réponse d'origine qu'il pouvait y avoir un moyen de le faire au moment de l'expansion / de la compilation au lieu de l'exécution pour donner de meilleures performances et j'ai finalement implémenté cela aujourd'hui tout en travaillant sur ma réponse à cette question: comment puis-je déterminer quelle fonction était appelé de manière interactive dans la pile?
Voici une fonction qui produit toutes les trames de trace actuelles
En utilisant cela dans une macro, nous pouvons rechercher la pile d'expansion pour voir quelle définition de fonction est développée à ce moment-là et mettre cette valeur directement dans le code.
Voici la fonction pour faire l'expansion:
Le voici en action.
Réponse originale:
Vous pouvez utiliser
backtrace-frame
pour rechercher la pile jusqu'à ce que vous voyiez un cadre qui représente un appel de fonction direct et obtenez le nom de cela.Ici, je fais la recherche du nom de la fonction lors de l'exécution, mais il est probablement possible de l'implémenter dans une macro qui se développe directement dans le symbole de la fonction, ce qui serait plus performant pour les appels répétés et compilés elisp.
J'ai trouvé ces informations en essayant d'écrire une sorte d'enregistreur d'appels de fonction pour elisp qui peut être trouvé ici sous sa forme incomplète, mais cela pourrait vous être utile. https://github.com/jordonbiondo/call-log
la source
defun
est entouré pareval-and-compile
, c'est-à-dire qu'il revientnil
.