最近我开始学习 Julia,并且研究了很多例子。@我几次注意到这个符号/语法。这是一个例子:
using DataFrames
using Statistics
df = DataFrame(x = rand(10), y = rand(10))
@df df scatter(:x, :y)
Run Code Online (Sandbox Code Playgroud)
这将简单地创建一个散点图。您也可以scatter(df[!, :x], df[!, :y])不使用@并获得相同的结果。我找不到有关此语法的任何文档。所以我想知道这个语法是什么以及什么时候应该使用它Julia?
朱莉娅中的@是什么?
宏在 Julia 的语法中具有专用字符:@(at 符号),后跟在宏 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))
Run Code Online (Sandbox Code Playgroud)
当您不知道某些内容是如何工作时,请尝试?在 Julia REPL 中输入您想知道的内容。
例如,键入?@并按 ENTER 键会产生:
at 符号后跟宏名称标记宏调用。宏提供了将生成的代码包含在程序的最终主体中的能力。宏将参数元组(表示为空格分隔的表达式或类似函数调用的参数列表)映射到返回的表达式。生成的表达式直接编译到周围的代码中。有关更多详细信息和示例,请参阅元编程。
宏是一个非常高级的语言概念。它们通常将代码作为参数并生成可编译的新代码。考虑这个宏:
macro myshow(expr)
es = string(expr)
quote
println($es," = ",$expr)
end
end
Run Code Online (Sandbox Code Playgroud)
可以用作:
julia> @myshow 2+2
2 + 2 = 4
Run Code Online (Sandbox Code Playgroud)
要了解真正发生的事情,请尝试@macroexpand:
julia> @macroexpand @myshow 2+2
quote
Main.println("2 + 2", " = ", 2 + 2)
end
Run Code Online (Sandbox Code Playgroud)
您可以看到一个 Julia 命令 (2+2) 已包含了额外的 Julia 代码。您可以尝试@macroexpand使用您正在使用的其他宏。
有关详细信息,请参阅Julia 手册的元编程部分。
| 归档时间: |
|
| 查看次数: |
218 次 |
| 最近记录: |