gpt4 book ai didi

Julia 宏飞溅

转载 作者:行者123 更新时间:2023-12-02 00:26:01 24 4
gpt4 key购买 nike

为什么这有效:

function test_func(a, b)
a + b
end

test_func((1, 2)...)

但这不是吗?

macro test_func(a, b)
a + b
end

@test_func((1, 2)...)

这是 Julia 中的错误吗?

最佳答案

宏在表面语法上运行,因此@test_func看不到splat的结果。相反,它看到的是 splat 操作本身!与往常一样,检查它的一个好方法是引用它并准确查看宏正在运行的语法:

julia> :(@test_func((1,2)...))
:(@test_func (1,2)...)

julia> Meta.show_sexpr(ans)
(:macrocall, symbol("@test_func"), (:..., (:tuple, 1, 2)))

因此该宏仅接收一个参数(而不是两个),并且它是一个 Expr(:..., Expr(:tuple, 1, 2))。请注意,元组 (1,2) 已传递给您的宏,但它只是隐藏在 splat 操作中。因此,您可以自己深入研究 Expr 和某种实现 splatting 的方法:

julia> macro test_func(as...)
if length(as) == 1 && isa(as[1], Expr) && as[1].head == :... &&
isa(as[1].args[1], Expr) && as[1].args[1].head == :tuple
a, b = as[1].args[1].args
elseif length(as) == 2
a, b = as
else
error("unsupported syntax $as")
end
return esc(:($a + $b))
end

julia> @test_func((1,2)...)
3

但这只是某种程度的支持splatting。看看如果您尝试对变量进行操作会发生什么:

julia> @test_func(xs...)
ERROR: unsupported syntax (:(xs...),)

现在宏无法知道它应该将什么加在一起!

关于 Julia 宏飞溅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30948571/

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