在宏中替换符号名称

时间:2016-07-23 06:26:54

标签: emacs lisp-macros

如何将符号名称替换为在宏中创建的函数?我想我在这里遗漏了一些明显的东西。例如,我正在尝试创建一个宏来定义一些类似于以下的变量和函数,

(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 个答案:

答案 0 :(得分:1)

您希望fn的来电为(fn ',sym)(您在问题中提到过这个问题,但我怀疑是出了问题)。

您可能还希望将宏扩展为(progn ...)而不是(list ...)

(这最初是评论:我把它放在这里只是为了得到答案。)