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)
定义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)