我正在阅读有关宏的文档,并在“阻止:为什么宏”部分下遇到了以下内容。使用宏的理由如下:
宏是必需的,因为它们在解析代码时执行,因此,宏允许程序员在运行完整程序之前生成并包含自定义代码的片段
这让我想知道为什么有人想要使用“在运行完整程序之前生成并包含自定义代码的片段”。有人可以提供有关为什么这对宏有益和/或其他良好用例的上下文吗?
crs*_*nbr 11
让我给你我对宏的看法。
宏基本上是一个code -> code
函数。它接受代码(一个 Julia 表达式)作为输入并输出代码(一个不同的 Julia 表达式)。
为什么这很有用?它有多种用途:
编译时复制和粘贴:您不必多次编写同一段代码,而是可以定义一个简短的宏,在您放置的任何地方为您编写它。(例子)
领域特定语言 (DSL):您可以创建特殊语法,在宏code -> code
转换后由纯 Julia 构造替换。这在许多包中用于定义特殊语法,例如here和here。
代码生成:想象一下,你想写一段很长的代码,虽然很长,但很简单,因为它有某种模式,可以很简单地重复自己。手动编写代码可能会很痛苦(甚至几乎不可能)。宏可以以编程方式为您生成代码。一个示例是 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 上的精彩演讲: