gpt4 book ai didi

macros - 为什么不能在普通(未引用)代码中取消引用拼接?

转载 作者:行者123 更新时间:2023-12-04 16:40:46 25 4
gpt4 key购买 nike

在 Clojure 中,您可以取消引用拼接值列表以生成代码,例如

(def extra-values [1 2 3 4])

`(+ 100 200 ~@extra-values)
=> (clojure.core/+ 100 200 1 2 3 4)

同样的方法应该在未引用的上下文中工作似乎是合乎逻辑的,例如
(def extra-values [1 2 3 4])

(+ 1000 ~@extra-values)
=> [an error, but one could argue that the answer should be 1010??]

是否有任何深层的技术/哲学原因导致这不起作用?

最佳答案

一个简单的原因是,那么

`(+ 100 200 ~@extra-values) 

定义不明确:它是否扩展到
(+ 100 200 1 2 3 4)

或者
(+ 100 200 ~@extra-values)

?如果 ~@,两者都是有效的解释在这种情况下,construct 是合法的。

这也会导致宏观系统出现严重问题。考虑
(defmacro foo [x & args]
`(list ~x ~(count args)))

(let [data '(1 2 3)]
(foo "three" ~@data))

怎么可以 foo知道它正在传递什么参数吗?它当然不能在编译时扩展它,所以现在取消引用拼接仅在某些非引用上下文中有效。

总的来说,它只是混淆了语言以适应对核心概念的理解不佳 - 如果你真的想取消引用拼接来构建一个复杂的参数列表,你可以轻松地使用 apply在类似的东西
(apply + `(100 ~@extra-values 200))

关于macros - 为什么不能在普通(未引用)代码中取消引用拼接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9170819/

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