2024 Clojure 状态调查!分享您的想法。

欢迎!有关如何使用本站的更多信息,请参阅关于页面。

0

嗨!

我有一个接收函数表达式作为参数的合成宏

(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

1 答案

0

试着用正常单引号替换。

(macroexpand-1 '(func-macro (fn [x] x)))

在这里不需要反引号。

欢迎使用 Clojure Q&A,在这里您可以提出问题并从 Clojure 社区成员那里获得答案。
...