Зачем использовать макросы в Юлии? - PullRequest
2 голосов
/ 27 сентября 2019

Я читал документацию по макросам и натолкнулся на следующее в разделе * Hold up: почему макросы ?Причины использования макросов таковы:

Макросы необходимы, потому что они выполняются при разборе кода, поэтому макросы позволяют программисту генерировать и включать фрагменты настроенного кода до запуска полной программы

Это заставляет меня задуматься, почему кто-то захочет использовать «генерировать и включать фрагменты настроенного кода до запуска полной программы».Может ли кто-то представить контекст относительно того, почему это было бы полезно и / или другие хорошие варианты использования макросов?

1 Ответ

2 голосов
/ 27 сентября 2019

Позвольте мне дать вам мой взгляд на макросы.

Макрос в основном является функцией 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:

Большую часть времени не выполняйте метапрограммирование :)

...