嗨!
我有一个接收函数表达式作为参数的合成宏
(defmacro func-macro [f]
`(def x ~f))
宏展开给出以下结果:
( macroexpand-1 `(func-macro (fn [x] x)))
->
(def runtime.repl/x (clojure.core/fn [runtime.repl/x] runtime.repl/x))
如果我将此代码形式在REPL中执行,则会出现错误,因为函数以运行时 Qualified Symbol runtime.repl/x 作为参数。
(runtime.repl/x) - failed: Extra input at: [:fn-tail :arity-1 :params] spec: :clojure.core.specs.alpha/param-list
runtime.repl/x - failed: vector? at: [:fn-tail :arity-n :params] spec: :clojure.core.specs.alpha/param-list
但如果我在REPL中调用此宏, everything 都正常!
( (func-macro (fn [x] x)) 100)
->
100
为什么在REPL中调用宏时,runtime.repl/x 适用于函数定义?
谢谢!
Andray