【问题标题】:Substitute symbol name in macro在宏中替换符号名称
【发布时间】:2016-07-23 06:26:53
【问题描述】:

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

(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 的东西,但其余的看起来还不错)。
  • 你在问题​​中提到过,所以我敢打赌是手指问题...

标签: emacs lisp-macros


【解决方案1】:

您希望对fn 的调用为(fn ',sym)(您提到您在问题中尝试过,但我怀疑以某种方式出错)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多