在 Julia 中 big"123" 是宏、函数还是其他东西?

In Julia is big"123" a macro, function, or something else?

作为 2018 年 9 月这个月 Julia 的新手,我刚刚开始习惯最初不熟悉的宏符号“@”和“!”具有可变输入的函数的符号。我是否认为这些仅仅是供人类阅读的文体符号,它们并没有真正向编译器提供任何信息?

我在以下代码的上下文中提出这个问题,这些代码似乎与我所知道的 Julia 中的宏、函数或任何其他内容的样式不匹配。我在下面专门询问大“1234”:

julia> big"1234"  # big seems to be neither a macro or a function.
1234

julia> typeof(big"1234")
BigInt

julia> typeof(BigInt(1234))
BigInt

我的问题是:big"1234"中的big是什么?

编辑:我想我根据 https://discourse.julialang.org/t/bigfloat-promotion-rules-and-constants-in-functions/14573/4

上的评论得到了答案

"请注意,因为十进制文字在解析时会转换为浮点数,BigFloat(2.1) 可能不会产生您期望的结果。您可能更喜欢通过解析或使用大字符串文字从字符串初始化常量。

julia> BigFloat(2.1)
2.100000000000000088817841970012523233890533447265625

julia> big"2.1"
2.099999999999999999999999999999999999999999999999999999999999999999999999999986"

因此,根据上面的评论,big in big"1234" 是 "big string literal."

编辑 2:以上是答案的开始,但下面接受的答案更完整。

这些是非标准字符串文字。他们告诉编译器 xyz"somestring" 应该通过名为 @xyz_str.

的宏函数进行解析

BigFloat(2.1)big"2.1" 之间的区别在于前者确实将 "numeric" 文字 2.1 的标准 Float64 表示形式转换为 BigFloat 但后者使用宏 @big_str 直接解析字符串 "2.1"(不将其解释为数字文字)以计算 BigFloat 表示形式。

您还可以定义非标准字符串文字。 LaTeXStrings.jl 例如,使用它可以更轻松地输入 LaTeX 方程式。

请看:https://docs.julialang.org/en/v1/manual/metaprogramming/#Non-Standard-String-Literals-1