2009-07-25 53 views
3
(defmacro nif [expr pos zer neg] 
    '(condp = (Integer/signum ~expr) 
    -1 ~neg 
    0 ~zer 
    1 ~pos)) 

我得到這個錯誤。在Clojure中這個宏有什麼問題?

1:1 user=> #<Namespace Chapter7Macros> 
1:2 Chapter7Macros=> (nif 1 (+ 2 2) (- 2 2) (- 3 2)) 
1:3 Chapter7Macros=> java.lang.Exception: Unable to resolve symbol: expr in this context (repl-1:57) 

回答

6
通過

一個反引號(`)更換引號('),以使語法引用。

+0

On Lisp的字體讓它很難(對我來說,顯然也是OP)來告訴'from'。一般來說,當你在使用你想要的宏時。 (反向,以防任何人遇到我的字體有問題!) – amalloy 2011-03-10 19:27:07

3

通常使用(macroexpand-1'(nif 1 ...))通過向您顯示您的宏實際正在翻譯的代碼將有很大幫助。