Macros 如何在julia中将变量值传递给宏?

Macros 如何在julia中将变量值传递给宏?,macros,julia,Macros,Julia,我想把变量的值传递给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: uns

我想把变量的值传递给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>宏m(a::Symbol,b)#在方法a中应该始终是一个符号
#根据需要使用空格和括号来分隔和
#根据需要将参数分组,在本例中不使用逗号
@显示一个b#或使用这个:@show(a,b)注意这里的逗号
ex=quote#此处无需使用eval宏
$a=$b#将编译并评估返回的
调用时结束#表达式
@秀前
返回esc(ex)#esc将使用周围范围而不是gensyms
结束
@m(宏与1方法)
不要在宏体中使用
eval
,在这种情况下,它位于返回表达式的体中(有些情况下可能需要这样做,但这不是其中之一)

julia>x=2
2.
老实说,我还不知道如何进行类似于宏的插值,如
@eval
基准工具。@btime
工作(应该在手册中解释,我将不得不研究这些宏的代码),但是在调用宏时,您不需要
$
,只需在这里进行简单的示例

julia>@my(x+1)#用于分组的参数,或@m(y,x+1)
a=:y#:y是一个符号
b=:(x+1)
ex=报价
#=REPL[17]:4=#
y=x+1
结束
3.
如果不使用
esc
它将在卫生上创建
gensym
s,在这种情况下,它将使用周围的范围变量

julia>@mzrand(x,y)
a=:z
b=:(兰特(x,y))
ex=报价
#=REPL[17]:4=#
z=兰特(x,y)
结束
2×3数组{Float64,2}:
0.817233  0.623775  0.277464
0.421573  0.443654  0.296359
gensym
s如下所示:

julia>gensym(:foo)
符号(“##foo#924”)

感谢您提及
@eval
基准工具。@btime
。我想做类似的事情,但还没有理解他们的代码。也一定要检查