Di C ada variabel ajaib __func__
yang menyimpan nama fungsi saat ini. Di Bash, ada array yang FUNCNAME
menyimpan nama semua fungsi di tumpukan panggilan !!!
Apakah ada hal serupa di Emacs Lisp? Atau ada cara sederhana untuk fungsi untuk memiliki akses ke namanya?
Saya belum menemukan jawaban dalam manual Emacs Lisp (bab 12 tentang Fungsi atau indeks variabel dan fungsi dan ..)
Jawaban:
Untuk fungsi interaktif, mis. Perintah, Anda bisa menggunakan variabel
this-command
, atau lebih amanreal-this-command
,. Perbedaannya adalah bahwa ketika Anda menulis fungsi Anda sendiri, Anda dapat secara eksplisit mengubah nilaithis-command
. Sebagian besar ini dilakukan untuk memainkan trik-trik yanglast-command
berkaitan dengan perintah berulang. Anda seharusnya (tidak bisa?) Melakukan ini denganreal-this-command
. Itu akan selalu menjadi nama perintah saat ini.Saya tidak mengetahui adanya persamaan untuk fungsi non-interaktif.
sumber
this-command
danreal-last-command
sama sekali tidak suka__func__
. Misalnya jika perintah A memanggil perintah B yang mencetaknyathis-command
akan mencetak perintah A, bukan B, juga ini tidak berfungsi sama sekali untuk fungsi.Jawaban yang diperbarui dengan pencarian waktu ekspansi:
Saya mengatakan dalam jawaban asli saya bahwa mungkin ada cara untuk melakukan ini pada waktu ekspansi / kompilasi alih-alih menjalankan waktu untuk memberikan kinerja yang lebih baik dan saya akhirnya mengimplementasikannya hari ini sambil mengerjakan jawaban saya untuk pertanyaan ini: Bagaimana saya bisa menentukan fungsi mana yang disebut secara interaktif di stack?
Berikut adalah fungsi yang menghasilkan semua frame backtrace saat ini
Menggunakan itu dalam makro kita bisa mencari tumpukan ekspansi untuk melihat definisi fungsi apa yang sedang diperluas saat itu dan menempatkan nilai itu tepat di dalam kode.
Berikut adalah fungsi untuk melakukan ekspansi:
Ini dia sedang beraksi.
Jawaban asli:
Anda dapat menggunakan
backtrace-frame
untuk mencari tumpukan sampai Anda melihat bingkai yang mewakili panggilan fungsi langsung dan mendapatkan nama dari itu.Di sini saya melakukan pencarian nama fungsi saat runtime meskipun mungkin untuk mengimplementasikan ini di makro yang memperluas langsung ke simbol fungsi yang akan lebih performant untuk panggilan ulang dan kompilasi elisp.
Saya menemukan informasi ini ketika mencoba untuk menulis semacam logger fungsi panggilan untuk elisp yang dapat ditemukan di sini dalam bentuk tidak lengkap, tetapi mungkin berguna bagi Anda. https://github.com/jordonbiondo/call-log
sumber
defun
ditutup oleheval-and-compile
, yaitu ia kembalinil
.