Как заменить имя символа на функцию, созданную в макросе? Я думаю, что здесь нет ничего очевидного. Например, я пытаюсь сделать макрос, который определяет некоторые переменные и функции, аналогичные приведенным ниже,Заменить имя символа в макросе
(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
и другие ... Но не могу похоже, все правильно.
Расширение макроса должно вероятно быть 'progn' форма, для одной вещи. Вероятно, вы хотите, чтобы вызов 'fn' был' (fn ', sym) '. (У меня нет ничего с elisp на нем, но все остальное выглядит нормально). – tfb
Вы упомянули об этом в вопросе, поэтому я держал пари, что это была проблема с пальцами ... – tfb