Makrolarda docstring'i değerlendirin

Sep 27 2020

Makroların defun(veya defmacrokendilerinin) isteğe bağlı bir docstringargümanı vardır, ancak bunlar makro olduklarından ve işlev docstringolmadıklarından değerlendirilmez, ancak olduğu gibi alınır.

Bunun docstringgibi bir şey yerine değerlendirilmeye ihtiyacım var -

"does a, then b, then c" ; b is hardcoded

Bunun yerine bunun gibi bir şey koyabilirim -

(concat "does a, then " (getenv "<some-shell-variable>") " , then c") ; b isn't hardcoded

O tanımlarını çimdik kalmadan bunu yapmak mümkün mü defunve defmacro?

Çimdik olarak, ben tanımlarını üzerine yazarak ama gibi yeni makrolar yazma anlamına gelmez prefix-defunve prefix-defmacromevcut tanımlarına dayalı defunve demacrodocstring'ini tüm örneklerini değiştirerek değerlendirilir hariç, docstringile (eval docstring).

Yanıtlar

1 Drew Sep 28 2020 at 03:33

Herhangi bir işlevin, değişkenin veya yüzün doc dizesini (dinamik olarak oluşturulmuş olsun veya olmasın) istediğiniz herhangi bir dizeye ayarlayabilirsiniz.

Bir işlev için foo, sembole istediğiniz dizeyi fooözellik değeri olarak koyun 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.

Bir defvar veya defcustom için aynı şey - sembol özelliğini kullanın 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.

Elisp kılavuzuna, düğüm Dokümantasyon Temelleri ve alt düğümlerine bakın.

Aynı şey defface- sembol özelliğini kullanın variable-documentation. Ancak deffacebir doc dizesi gerektirir. Yine de, bir işlev veya değişken için yapabildiğiniz gibi, onu dinamik olarak değiştirebilirsiniz.

(defface foo '((t :foreground "Red")) "0000") ; Doc string "0000".

(put 'foo 'face-documentation "11111") ; Change doc string to "1111".
2 phils Sep 27 2020 at 19:47
(defun foo ()
  (:documentation (concat "does a, then " (getenv "<some-shell-variable>") " , then c"))
  ...BODY...)

Bu etkin bir şekilde kopyasıdır Oluşturulan doc dizesini bir lambda'ya eklemek mümkün mü? ancak bu soru çok lambdayönlüdür ve bu yüzden Stefan'ın cevabı aynı şeyi yapabileceğinizi göstermez defun.

Dokümanın evalisteğe bağlı olmasına ihtiyacınız varsa (yani, her talep ettiğinizde), bunu da yapabilirsiniz, ama görünüşe göre onunla değil :documentation. Bunu yapmak için bazı seçenekler için önceki soruya verdiğim cevaba bakın.