Заменить имя символа в макросе

Как я могу заменить имя символа на функцию, созданную в макросе? Я думаю, что я упускаю что-то очевидное здесь. Например, я пытаюсь сделать макрос, который определяет некоторые переменные и функции, подобные следующим,

(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 ...),

(Первоначально это был комментарий: я выкладываю его здесь, чтобы был ответ.)

Другие вопросы по тегам