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ましたが、うまくいきません。

4

1 に答える 1

1

あなたは呼び出しをfnしたいです(fn ',sym)(あなたは質問で試したと言いましたが、どういうわけか間違っていたと思います)。

(progn ...)おそらく、マクロの展開を の代わりにしたいでしょう(list ...)

(これはもともとコメントでした。答えがあるので、ここに入れています。)

于 2016-07-23T18:17:15.310 に答える