【问题标题】:In Julia is big"123" a macro, function, or something else?在 Julia 中,大“123”是一个宏、函数还是其他东西?
【发布时间】:2018-09-12 20:59:28
【问题描述】:

作为 2018 年 9 月这个月的 Julia 新手,我刚刚习惯了最初不熟悉的用于宏的“@”符号和“!”具有可变输入的函数的符号。我是否可以假设这些只是供人类阅读的风格符号,并且它们并没有真正向编译器提供任何信息?

我在以下代码的上下文中提出了这一点,该代码似乎与我所知道的 Julia 中的宏、函数或其他任何东西的样式不匹配。我在下面专门询问 big"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”中有什么大的?

编辑:我想我的答案是基于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" 是一个“大字符串文字”。

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

【问题讨论】:

  • 另外,'@' 不是风格选择,afaik。 @ 被解释器/编译器发现,并且该对象被解释为宏。另外,我不会打电话给'!这也是一种风格选择,这是一个强烈鼓励的命名约定,因为没有其他方法可以传达函数是否改变其参数的重要信息。
  • @TasosPapastylianou,感谢您的澄清。

标签: julia arbitrary-precision


【解决方案1】:

这些是非标准字符串文字。他们告诉编译器 xyz"somestring" 应该通过一个名为 @xyz_str 的宏函数来解析。

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

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

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

【讨论】:

  • 我越来越喜欢 Julia。感谢您的精彩回答!
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2011-08-19
  • 1970-01-01
  • 2017-05-22
  • 2020-02-27
  • 1970-01-01
  • 2012-09-30
相关资源
最近更新 更多