2016-07-23 153 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 ...)

(這本來是一個註釋:我把它這裏只是所以有一個答案。)