Évaluer docstring dans les macros
Les macros comme defun(ou defmacroelle - même) ont un docstringargument facultatif , mais comme ce sont des macros et non des fonctions, elles docstringne sont pas évaluées, mais sont prises telles quelles .
J'ai besoin que le docstringsoit évalué pour qu'au lieu de quelque chose comme ça -
"does a, then b, then c" ; b is hardcoded
Je peux mettre quelque chose comme ça à la place -
(concat "does a, then " (getenv "<some-shell-variable>") " , then c") ; b isn't hardcoded
Est-il possible de faire cela sans avoir à modifier les définitions de defunet defmacro?
Par tweak, je ne veux pas dire écraser les définitions, mais écrire de nouvelles macros comme prefix-defunet prefix-defmacrobasées sur les définitions existantes de defunet demacro, sauf que la docstring est évaluée en remplaçant toutes les instances de docstringpar (eval docstring).
Réponses
Vous pouvez définir la chaîne doc de n'importe quelle fonction, variable ou face sur n'importe quelle chaîne de votre choix, qu'elle soit (générée dynamiquement ou non).
Pour une fonction foo, placez la chaîne souhaitée sur le symbole foocomme valeur de propriété 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.
Même chose pour un defvar ou defcustom - utilisez la propriété symbol 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.
Voir le manuel Elisp, les bases de la documentation des nœuds et ses sous-nœuds.
Même chose pour defface- utiliser la propriété de symbole variable-documentation. Mais deffacenécessite une chaîne doc. Vous pouvez néanmoins le modifier dynamiquement, comme vous pouvez le faire pour une fonction ou une variable.
(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...)
Il s'agit en fait d'un double de Est-il possible d'attacher une chaîne doc générée à un lambda? sauf que cette question est très lambdaorientée, et donc la réponse de Stefan ne précise pas que vous pouvez faire la même chose avec defun.
Si vous avez besoin que la docstring soit evalà la demande (c'est-à-dire à chaque fois que vous en faites la demande), vous pouvez également le faire, mais apparemment pas avec :documentation. Reportez-vous à ma réponse à la question précédente pour quelques options pour y parvenir.