Как использовать локальную переменную в Elisp defmacro? - PullRequest
0 голосов
/ 06 июля 2018

Я записываю макрос elisp в моем файле конфигурации emacs, но, как показано ниже, ,(intern (format "%s-display-table" name)) используется несколько раз, как я могу использовать переменную типа like для ее представления?

;; Change the glyphs of "wrap", "truncation" and "vertical-border" in the display table specified by
;; parameter "name", obviously "↩", "…" and "ǁ" is better choice than the default values "\", "$"
;; and "|".
(defmacro change-glyphs-of-display-table (name)
  `(lambda ()
   (interactive)
   (unless ,(intern (format "%s-display-table" name))
     (setq ,(intern (format "%s-display-table" name)) (make-display-table)))
   (set-display-table-slot ,(intern (format "%s-display-table" name)) 'wrap ?\↩)
   (set-display-table-slot ,(intern (format "%s-display-table" name)) 'truncation ?\…)
   (set-display-table-slot ,(intern (format "%s-display-table" name)) 'vertical-border ?\ǁ)))

1 Ответ

0 голосов
/ 06 июля 2018

Поскольку name является аргументом макроса, вы знаете, что он всегда доступен во время раскрытия, и поэтому вы можете обрабатывать его вне формы с кавычками:

;; Change the glyphs of "wrap", "truncation" and "vertical-border" in the display table specified by
;; parameter "name", obviously "↩", "…" and "ǁ" is better choice than the default values "\", "$"
;; and "|".
(defmacro change-glyphs-of-display-table (name)
  (let ((namedisplaytable (intern (format "%s-display-table" name))))
    `(lambda ()
       (interactive)
       (unless ,namedisplaytable
         (setq ,namedisplaytable (make-display-table)))
       (set-display-table-slot ,namedisplaytable 'wrap ?\↩)
       (set-display-table-slot ,namedisplaytable 'truncation ?\…)
       (set-display-table-slot ,namedisplaytable 'vertical-border ?\ǁ))))
...