2016-07-23 8 views
0

Wie kann ich einen Symbolnamen in eine Funktion einfügen, die in einem Makro erstellt wurde? Ich denke, ich vermisse hier etwas Offensichtliches. Zum Beispiel, Ich versuche, ein Makro zu machen, die einige Variablen und Funktionen ähnlich der folgenden definiert,Ersatzsymbolname im Makro

(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))))) 

Die Funktion gibt einen Aufruf zurückgeführt auf eine andere Funktion macht (fn) mit einer Signatur wie

(defun fn (var) (symbol-value var)) 

So erwartet es einen Anruf wie (fn 'some-var). Und ich will das Makro zu verwenden, um der Lage sein, wie

(mac "pack") 

und haben die folgende Arbeit,

pack-file ; works: "default-file.el" 
(pack-fn) ; error: not a symbol 

ich versucht habe, Dinge wie (quote ,sym), symbol-name und andere ... Aber kann nicht scheinen es richtig zu machen.

+1

Die Erweiterung des Makros wahrscheinlich eine 'progn' Form sein sollte, für eine Sache. Sie möchten wahrscheinlich, dass der Aufruf von 'fn' '(fn ', sym)' ist. (Ich habe nichts mit elisp auf der Hand, aber der Rest sieht OK). – tfb

+0

Du hast es in der Frage erwähnt, also wette ich, es waren Fingerprobleme ... – tfb

Antwort

1

Sie wollen den Anruf zu fn zu (fn ',sym) (die Sie erwähnen, dass Sie in der Frage versucht haben, aber ich vermute, dass falsch irgendwie).

Sie möchten wahrscheinlich auch die Erweiterung des Makros (progn ...) statt (list ...) sein.

(Dies war ursprünglich ein Kommentar: Ich habe es hier nur so gibt es eine Antwort bin setzen.)

Verwandte Themen