Позвольте мне дать вам мой взгляд на макросы.
Макрос в основном является функцией code -> code
.Он принимает код (выражение Julia) в качестве входных данных и выплевывает код (другое выражение Julia).
Почему это полезно?Он имеет несколько целей:
время компиляции копирование-вставка : вам не нужно писать один и тот же фрагмент кода несколько раз, но вместо этого вы можете определитькороткий макрос, который пишет это для вас, куда бы вы ни положили.( пример )
язык домена (DSL) : можно создать специальный синтаксис, который после преобразования макроса code -> code
заменяется начистые конструкции Юлии.Это используется во многих пакетах для определения специального синтаксиса, например здесь и здесь .
генерация кода :Представьте, что вы хотите написать действительно длинный кусок кода, который хотя и длинный, но очень простой, потому что у него есть некий шаблон, который повторяется довольно тривиально.Написание этого кода вручную может быть болезненным (или даже практически невозможным).Макрос может программно сгенерировать код для вас.Одним из примеров является развертывание цикла (см. здесь и здесь ).Но даже макрос @time
не делает намного больше, чем просто помещает кучу вызовов функций Base.time_ns()
вокруг предоставленного выражения Julia.
- специальный анализ строки : есливы вводите литерал
3.2
в Julia, он будет проанализирован и интерпретирован как Float64
.Теперь представьте, что вы хотите ввести число буквально, которое выходит за пределы точности Float64
, но вписывается в BigFloat
.Ввод big(3.123124812498124812498)
не сработает, потому что литеральное число сначала интерпретируется как Float64
, а затем передается функции big
.Вместо этого вам нужен способ сказать Джулии во время разбора, что это должно стать BigFloat
.Это обрабатывается макросом @big_str 3.2
, который (для удобства) также можно записать как big"3.2"
.Последний является просто синтаксическим сахаром.
Возможно, есть еще много применений макросов, но они для меня наиболее важны.
Позвольте мне закончить ссылкой на великого Стивена Джонсона.говорите на JuliaCon 2019:
Большую часть времени не выполняйте метапрограммирование :)