gpt4 book ai didi

macros - 如何将变量值传递给 julia 中的宏?

转载 作者:行者123 更新时间:2023-12-03 23:17:20 24 4
gpt4 key购买 nike

我想将变量的值传递给 julia 中的宏?我尝试了以下但没有奏效:

macro m(a,b)
@show a,b
ex = quote
$a = eval($b)
end
@show ex
esc(ex)
end

b = 1
@m a $b

输出:
(a, b) = (:a, :($(Expr(:$, :b))))
ex = quote # REPL[20], line 4:
a = eval($(Expr(:$, :b)))
end
ERROR: unsupported or misplaced expression $

最佳答案

你非常接近! :)

宏也可以有类型注解,它们是在编译时工作的函数,但它们的输入只能是 Expr s, Symbol s 或常量值,即:Int ,宏在被调用之前不会评估它们的输入,就像函数在被调用之前一样,宏在语法上起作用。

julia> macro m(a::Symbol, b)  # in ths method a should allways be a symbol
# use spaces and parens as needed to delimit and
# group args as needed, not commas in this case
@show a b # or use this: @show(a, b) notice comma here
ex = quote # there is no need to use eval here a macro
$a = $b # will compile and evaluate the returning
end # expression when invoked
@show ex
return esc(ex) # esc will use surrounding scope instead of gensyms
end
@m (macro with 1 method)

请勿使用 eval在宏的主体内部,在这种情况下,它位于返回表达式的主体中(有些情况下可能需要这样做,但这不是其中之一)。

julia> x = 2
2

老实说,我还不知道如何进行类似于 @eval 等宏的插值或 BenchmarkTools.@btime工作(应该在手册中解释,我必须研究那些宏的代码),但你不需要 $在此处为您的简单示例调用宏时。

julia> @m y (x + 1)  # parens for grouping, or @m(y, x + 1)
a = :y # :y is a symbol
b = :(x + 1)
ex = quote
#= REPL[17]:4 =#
y = x + 1
end
3

如果您不使用 esc它将卫生地创造 gensym s,在这种情况下,它使用周围的范围变量代替。

julia> @m z rand(x, y)
a = :z
b = :(rand(x, y))
ex = quote
#= REPL[17]:4 =#
z = rand(x, y)
end
2×3 Array{Float64,2}:
0.817233 0.623775 0.277464
0.421573 0.443654 0.296359
gensym s 看起来像这样:

julia> gensym(:foo)
Symbol("##foo#924")

关于macros - 如何将变量值传递给 julia 中的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47977414/

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