最近我开始学习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))