2012-12-22 87 views
3

我是宏的新手。我試圖寫一個宏來生成一些功能:將符號傳遞給宏中的emacs

(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

這一切似乎都沒問題。唯一的一點是,你應該打電話給你的宏用不帶引號的符號,例如:

(test stuff) 

這樣做的原因是,在注意到Emacs Lisp Manual

Macros [...] operate on the unevaluated expressions for the arguments, not on the argument values as functions do.

當您將符號函數,您可以引用它們來防止它們被視爲變量名稱並評估爲關聯值。但是,在宏擴展期間不對宏參數進行評估,但之後會在評估擴展本身時進行評估。

+0

感謝您的回答。有沒有另外一種方法可以將引用符號傳遞給宏並修改宏體的某些代碼,然後使其工作?或者你的意思是一個符號的引用從來不需要宏? – Edityouprofile

+0

那麼,你總是可以''評價'引用'的符號來「引用」它,但我不認爲這是非常習慣......見我的編輯更多細節。 – Francesco

+0

很清楚,謝謝! – Edityouprofile