如何调用宏,并将参数传递给它

nav*_*eet 3 lisp macros clojure

似乎我对宏的理解是不完整的.如何将参数传递给宏,并从函数中调用它们.代码下面看似简单的代码不起作用.

(defmacro bar [arg]
  (println (symbol? arg)))

(defn foo [arg]
  (bar arg))

(foo 'baz) => nil
Run Code Online (Sandbox Code Playgroud)

Joe*_*ann 6

定义foo时正在评估宏.如果在repl中定义foo函数,则会注意到Clojure打印为true.

user=> (defmacro bar [arg]
         (println (symbol? arg)))
#'user/bar
user=> (defn foo [arg]
         (bar arg))
true ;  <= This is the print from your macro 
     ;     (it prints true, because arg is a symbol)
#'user/foo
Run Code Online (Sandbox Code Playgroud)

你需要引用宏的主体,否则它将被评估,因为它的返回值是nil,foo将只返回nil.

(defmacro bar [arg]
   `(println (symbol? ~arg)))
Run Code Online (Sandbox Code Playgroud)