В Юлии есть big123 макрос, функция или что-то еще?

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

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

У меня вопрос: что большого в большом «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: приведенное выше является началом ответа, но принятый ниже ответ намного более полный.


person Julia Learner    schedule 12.09.2018    source источник
comment
docs.julialang.org/en/v1 / руководство / метапрограммирование /   -  person Tasos Papastylianou    schedule 12.09.2018
comment
Кроме того, «@» не является стилистическим выбором, афаик. Символ @ обнаруживается интерпретатором / компилятором, и этот объект интерпретируется как макрос. Кроме того, я бы не стал называть "!" это тоже стилистический выбор, это настоятельно рекомендуемое соглашение об именах, поскольку нет другого способа передать важную информацию о том, изменяет ли функция свой аргумент или нет.   -  person Tasos Papastylianou    schedule 12.09.2018
comment
@TasosPapastylianou, Спасибо за разъяснения.   -  person Julia Learner    schedule 12.09.2018


Ответы (1)


Это нестандартные строковые литералы. Они сообщают компилятору, что 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

person hckr    schedule 12.09.2018
comment
Я все время больше люблю Джулию. Спасибо за отличный ответ! - person Julia Learner; 12.09.2018