2016-07-23 154 views
0

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

(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

宏的扩展也许应该是一个'progn'形式,一两件事。您可能希望将'fn'调用为'(fn',sym)'。 (我没有任何关于elisp的信息,但剩下的看起来没问题)。 – tfb

+0

你在问题中提到过,所以我敢打赌这是手指麻烦...... – tfb

回答

1

你想拨打fn(fn ',sym)(你提到你在这个问题上尝试过,但我怀疑有错误)。

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

(这本来是一个注释:我把它这里只是所以有一个答案。)