gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:38:14 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com