嗨!
我有以下合成宏,它接收函数表达式作为参数
(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中执行此代码表达式,则会出现错误,因为函数的参数是命名空间合格的符号 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中时,所有事情都可以正常工作!
( (func-macro (fn [x] x)) 100)
->
100
为什么在REPL中调用宏时,runtime.repl/x对于函数定义来说是OK的?
谢谢!
Andray