Evaluasi docstring di makro
Makro seperti defun(atau defmacrodirinya sendiri) memiliki docstringargumen opsional , tetapi karena makro dan bukan fungsi, docstringtidak dievaluasi, tetapi dianggap apa adanya.
Saya perlu docstringdievaluasi sehingga alih-alih sesuatu seperti ini -
"does a, then b, then c" ; b is hardcoded
Saya bisa meletakkan sesuatu seperti ini sebagai gantinya -
(concat "does a, then " (getenv "<some-shell-variable>") " , then c") ; b isn't hardcoded
Apakah mungkin melakukan ini tanpa harus mengubah definisi defundan defmacro?
Dengan tweak, saya tidak bermaksud menimpa definisi, tetapi menulis makro baru seperti prefix-defundan prefix-defmacroberdasarkan definisi yang ada dari defundan demacro, kecuali, docstring dievaluasi dengan mengganti semua contoh docstringdengan (eval docstring).
Jawaban
Anda dapat menyetel string dokumen dari setiap fungsi, variabel, atau wajah ke string apa pun yang Anda inginkan, baik (dibuat secara dinamis atau tidak).
Untuk suatu fungsi foo, letakkan string yang Anda inginkan pada simbol foosebagai nilai properti function-documentation:
(defun foo () ; `foo' gets no doc string from this defun.
(interactive)
(message "FOOOOOOOO"))
(put 'foo 'function-documentation "I'm `foo'.") ; Give function `foo' a doc string.
(put 'foo 'function-documentation "I'm NEW `foo' doc.") ; Redefine the doc string.
Hal yang sama untuk defvar atau defcustom - gunakan properti simbol variable-documentation:
(defvar foo 42) ; Variable `foo' has no doc string.
(put 'foo 'variable-documentation "I'm `foo'.") ; Give var `foo' a doc string.
(put 'foo 'variable-documentation "I'm NEW `foo' .") ; Redefine the doc string.
Lihat manual Elisp, Dasar - dasar Dokumentasi node dan subnodenya.
Hal yang sama untuk defface- gunakan properti simbol variable-documentation. Tetapi deffacemembutuhkan string dokumen. Namun, Anda dapat mengubahnya secara dinamis, seperti yang Anda bisa untuk fungsi atau variabel.
(defface foo '((t :foreground "Red")) "0000") ; Doc string "0000".
(put 'foo 'face-documentation "11111") ; Change doc string to "1111".
(defun foo ()
(:documentation (concat "does a, then " (getenv "<some-shell-variable>") " , then c"))
...BODY...)
Ini secara efektif merupakan duplikat dari Apakah mungkin untuk melampirkan string dokumen yang dihasilkan ke lambda? kecuali pertanyaan itu sangat lambdaberorientasi, jadi jawaban Stefan tidak menunjukkan bahwa Anda dapat melakukan hal yang sama defun.
Jika Anda membutuhkan docstring sesuai evalpermintaan (yaitu setiap kali Anda memintanya), Anda dapat melakukannya juga, tetapi tampaknya tidak dengan :documentation. Lihat jawaban saya untuk pertanyaan sebelumnya untuk beberapa opsi untuk melakukan itu.