4

私はマクロに不慣れです。いくつかの関数を生成するマクロを作成しようとしています。

(defmacro test (name)
  `(defun ,(intern (concat "fun-" (symbol-name name))) ()
     ...))

のようなシンボルをこのマクロに渡したいのです(test 'stuff)が、emacsはこのエラーを出します:

Debugger entered--Lisp error: (wrong-type-argument symbolp (quote stuff))

それは私に言うこと(quote staff)は正しい議論ではありませんsymbol-nameか?どうすればこれを修正できますか?

4

1 に答える 1

4

これはすべて問題ないようです。唯一のことは、次のように、引用符で囲まれていない記号を使用してマクロを呼び出す必要があることです。

(test stuff)

この理由は、Emacs Lispマニュアルに記載されているように、次のとおりです。

マクロ[...]は、関数のように引数の値ではなく、引数の未評価の式を操作します。

関数にシンボルを渡すときは、それらが変数名と見なされて関連する値に評価されるのを防ぐために、それらを引用符で囲むために使用されます。ただし、マクロ引数はマクロ展開中は評価されませんが、その後、展開自体が評価されるときに評価されます。

于 2012-12-22T08:16:27.127 に答える