У Юлии большой "123" - это макрос, функция или что-то еще? - PullRequest
0 голосов
/ 12 сентября 2018

Будучи новичком Юлии в этом месяце, сентябрь 2018 года, я только привыкаю к ​​изначально незнакомому символу "@" для макросов и "!" символ для функций с изменяемыми входами. Правильно ли я предположить, что это просто стилистические символы для чтения людьми и что они не предоставляют компилятору никакой информации?

Я поднимаю это в контексте следующего кода, который, кажется, не соответствует стилю макроса, функции или чего-либо еще в Джулии, о которой я знаю. Я специально спрашиваю о большом "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

Мой вопрос: что такое большой в большом "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"

Таким образом, исходя из вышеприведенного комментария, большое в большом «1234» является «литералом большой строки».

Редактировать 2: Вышеприведенное является началом ответа, но принятый ниже ответ является гораздо более полным.

1 Ответ

0 голосов
/ 12 сентября 2018

Это нестандартные строковые литералы. Они сообщают компилятору, что xyz"somestring" должен быть проанализирован с помощью макро-функции с именем @xyz_str.

Разница между BigFloat(2.1) и big"2.1" заключается в том, что первый действительно преобразует стандартное Float64 представление "числового" литерала 2.1 в BigFloat, но последний анализирует строку "2.1" напрямую (без ее интерпретации). как числовой литерал) с макросом @big_str для вычисления представления BigFloat.

Вы также можете определить свои нестандартные строковые литералы. Например, LaTeXStrings.jl использует его, чтобы упростить ввод уравнений LaTeX.

Пожалуйста, посмотрите на: https://docs.julialang.org/en/v1/manual/metaprogramming/#Non-Standard-String-Literals-1

...