Заменить имя символа в макросе
Как я могу заменить имя символа на функцию, созданную в макросе? Я думаю, что я упускаю что-то очевидное здесь. Например, я пытаюсь сделать макрос, который определяет некоторые переменные и функции, подобные следующим,
(cl-defmacro mac (pkg)
(let (
;; Define some variables
(sym (intern (concat pkg "-file")))
(sym-def "default-file.el")
(sym-doc (concat "A custom var from `" pkg "'."))
;; Define some functions
(symfn (intern (concat pkg "-fn")))
(symfn-doc (concat "A function for `" pkg "'.")))
`(list
(defcustom ,sym ,sym-def ,sym-doc
:group (quote ,(make-symbol pkg))
:type '(choice (const :tag "None" nil)
file))
(defun ,symfn ()
,symfn-doc
(interactive)
(fn ,sym)))))
Возвращенная функция делает вызов другой функции (fn
) с подписью вроде
(defun fn (var) (symbol-value var))
Итак, он ожидает звонка, как (fn 'some-var)
, И я хочу иметь возможность использовать макрос, как
(mac "pack")
И иметь следующую работу,
pack-file ; works: "default-file.el"
(pack-fn) ; error: not a symbol
Я пробовал такие вещи, как (quote ,sym)
, symbol-name
и другие... Но, похоже, не могу понять это правильно.
1 ответ
Вы хотите позвонить fn
быть (fn ',sym)
(который вы упоминаете, что пытались в вопросе, но я подозреваю, что ошибся как-то).
Вы, вероятно, также хотите, чтобы расширение макроса было (progn ...)
вместо (list ...)
,
(Первоначально это был комментарий: я выкладываю его здесь, чтобы был ответ.)