macros - 拼接非文字序列的取消引号

标签 macros clojure

这个问题是基于 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/

相关文章:

ios - 如何从 Swift 访问 UIColor 的宏

必要时插入类型名的 C++ 宏

python - 如何在 Clojure 中实现递归 DFS(不使用向量/堆栈)

java - 在 Java/Clojure 中杀死无限循环

java - http-kit 客户端中的最大并发 http 请求数?

c - 有没有更好的 MACRO 来获得 2^n (1 << n) 的恒定功率值

xcode - XCode4 的 Perforce Checkout 宏

macros - 在 Sublime Text 3 中自动选择粘贴的文本

clojure - Clojure 中的符号

maven - Maven Central 的 Nexus 索引不是最新的(新安装)