Julia中的@是什么?



最近我开始学习Julia,并研究了很多例子。我注意到@符号/语法几次。下面是一个例子:

using DataFrames
using Statistics
df = DataFrame(x = rand(10), y = rand(10))
@df df scatter(:x, :y)

这将简单地创建散点图。你也可以使用scatter(df[!, :x], df[!, :y])而不使用@,得到相同的结果。我找不到关于这种语法的任何文档。所以我想知道这个语法是什么,什么时候你应该在Julia中使用它?

当你不知道某些东西是如何工作的时候,试着在Julia REPL中输入?,然后输入你想知道的东西。

例如,输入?@并按ENTER会产生:

@号后面跟宏名,表示宏调用。控件中包含生成的代码程序的最后主体。宏映射一个参数元组,表示为空格分隔的表达式或类函数调用的参数列表,转换为返回表达式。生成的表达式直接编译到周围的代码。有关更多细节和示例,请参阅元编程。

宏是非常高级的语言概念。它们通常将代码作为参数,并生成被编译的新代码。考虑这个宏:

macro myshow(expr)
es = string(expr)
quote
println($es," = ",$expr)
end
end

可以用作:

julia> @myshow 2+2
2 + 2 = 4

要了解实际情况,请尝试@macroexpand:

julia> @macroexpand @myshow 2+2
quote
Main.println("2 + 2", " = ", 2 + 2)
end

您可以看到一个Julia命令(2+2)被附加的Julia代码包围。您可以尝试@macroexpand与您正在使用的其他宏。

有关更多信息,请参阅Julia手册的元编程部分。

Julia中的@是什么?

宏在Julia的语法中有一个专用字符:@ (at-sign),后面跟着宏中声明的唯一名称name…块结束。

因此,在您注意到的示例中,@df是一个宏,df是它的名称。请在这里阅读有关宏的内容。这个概念属于Julia的元编程特性。我猜你使用了StatsPlots.jl包,因为@df是它的一个重要工具;使用@macroexpand,您可以调查给定宏的功能:

julia> using StatsPlots
julia> @macroexpand @df df scatter(:x, :y)
:(((var"##312"->begin
((var"##x#313", var"##y#314"), var"##315") = (StatsPlots).extract_columns_and_names(var"##312", :x, :y)
(StatsPlots).add_label(["x", "y"], scatter, var"##x#313", var"##y#314")
end))(df))

最新更新