替换宏中的符号名称
Substitute symbol name in macro
如何将符号名称替换为在宏中创建的函数?我想我在这里遗漏了一些明显的东西。例如,我正在尝试制作一个定义一些类似于以下变量和函数的宏,
(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
和其他方法...但似乎无法正确处理。
您希望对 fn
的调用是 (fn ',sym)
(您提到您在问题中尝试过,但我怀疑不知何故弄错了)。
您可能还希望宏的扩展为 (progn ...)
而不是 (list ...)
。
(这本来是评论:我把它放在这里只是为了有答案。)
如何将符号名称替换为在宏中创建的函数?我想我在这里遗漏了一些明显的东西。例如,我正在尝试制作一个定义一些类似于以下变量和函数的宏,
(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
和其他方法...但似乎无法正确处理。
您希望对 fn
的调用是 (fn ',sym)
(您提到您在问题中尝试过,但我怀疑不知何故弄错了)。
您可能还希望宏的扩展为 (progn ...)
而不是 (list ...)
。
(这本来是评论:我把它放在这里只是为了有答案。)