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中执行此代码表达式,则会出现错误,因为函数的参数是命名空间合格的符号 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

1 答案

0

尝试

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

用正常单引号代替。这里不需要反引号。

...