为什么要在 Julia 中使用宏?

log*_*ick 8 julia

我正在阅读有关宏的文档,并在“阻止:为什么宏”部分下遇到了以下内容。使用宏的理由如下:

宏是必需的,因为它们在解析代码时执行,因此,宏允许程序员在运行完整程序之前生成并包含自定义代码的片段

这让我想知道为什么有人想要使用“在运行完整程序之前生成并包含自定义代码的片段”。有人可以提供有关为什么这对宏有益和/或其他良好用例的上下文吗?

crs*_*nbr 11

让我给你我对宏的看法。

宏基本上是一个code -> code函数。它接受代码(一个 Julia 表达式)作为输入并输出代码(一个不同的 Julia 表达式)。

为什么这很有用?它有多种用途:

  • 编译时复制和粘贴:您不必多次编写同一段代码,而是可以定义一个简短的宏,在您放置的任何地方为您编写它。(例子)

  • 领域特定语言 (DSL):您可以创建特殊语法,在宏code -> code转换后由纯 Julia 构造替换。这在许多包中用于定义特殊语法,例如herehere

  • 代码生成:想象一下,你想写一段很长的代码,虽然很长,但很简单,因为它有某种模式,可以很简单地重复自己。手动编写代码可能会很痛苦(甚至几乎不可能)。宏可以以编程方式为您生成代码。一个示例是 for 循环展开(请参阅此处此处)。但即使是@time宏也只是Base.time_ns()在提供的 Julia 表达式周围放置一堆函数调用。

  • 特殊字符串解析:如果您3.2在 Julia 中键入文字,它将被解析并解释为Float64. 现在,假设您想要提供一个超出Float64精度但适合BigFloat. 打字big(3.123124812498124812498)不起作用,因为文字数字首先被解释为 aFloat64然后传递给big函数。相反,您需要一种方法在解析时告诉 Julia 这应该成为BigFloat. 这由一个@big_str 3.2宏处理(为方便起见)也可以写为big"3.2". 后者只是语法糖。

宏的应用可能还有很多,但这些对我来说是最重要的。

最后让我引用 Steven G. Johnson 在 JuliaCon 2019 上的精彩演讲:

大多数时候,不要进行元编程:)