这个问题是基于 this answer 的限制.
如果我有一个像这样使用拼接取消引用的宏:
(defmacro instantiate [klass values]
`(new ~klass ~@values))
仅当 values
是文字序列或可 seq-able 时,它才有效。
如果传递一个包含如下序列的 var:
(def v [1 2 3])
(macroexpand '(instantiate Person v))
那么输出将是一个错误,表明 v
不是一个序列。
即使是函数调用也会被解释为列表:
(defn vf [] [1 2 3])
(macroexpand '(instantiate Person (vf)))
user=>(new Person vf)
我的问题是:在要拼接的序列不是文字的两种情况下,有没有办法在 Clojure 宏中使用拼接取消引号?
最佳答案
宏接收的参数未经评估,因此您看到的行为是预期的。
宏在编译时展开,而不是运行时。传递到宏的任何变量的值在编译时可能不可用,因此像使用eval
这样的肮脏黑客行为在一般情况下不起作用。不要创建需要此类技巧的宏。
关于macros - 拼接非文字序列的取消引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4607213/