朱莉娅中的@是什么?

Qui*_*ten 4 syntax julia

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

Sha*_*yan 5

朱莉娅中的@是什么?

宏在 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)


Prz*_*fel 5

当您不知道某些内容是如何工作时,请尝试?在 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 手册的元编程部分。