Можно ли идентифицировать / использовать Scala макросы, используя отражение или подобное? - PullRequest
1 голос
/ 06 февраля 2020

Я знаю, что на макросы Scala нельзя ссылаться в коде, который компилируется в том же прогоне компиляции, что и сам макрос.

Я также знаю из эмпирического тестирования, что если у кого-то есть кодовая база, которая делает что (обратитесь к макросу в том же проекте), если ссылка на макрос удаляется, код компилируется, ссылка на макрос повторно вставляется, и код компилируется снова, вторая компиляция завершится успешно, и сгенерированный макросом код будет работать правильно. Я предполагаю, что это потому, что компилятор видит файл .class для макроса с первого запуска компиляции и использует его.

Есть ли способ написания кода (с использованием отражения или аналогичного), который определяет, будет ли код сгенерирован макрос существует, а если так его называет? Я думаю о чем-то похожем на Как вызвать метод на объекте-компаньоне с помощью отражения? , но вместо вызова обычного метода, вызова кода, сгенерированного макросом.

Моя цель состоит в том, чтобы код, который выполняет одно, когда компилируется в первый раз, и другое, когда компилируется каждый раз после первого, без каких-либо изменений в исходном коде между двумя запусками компиляции. Я понимаю, что это не очень хорошая практика. Сборки должны быть детерминированными c в большинстве случаев. Меня интересует, возможно ли создать Scala код, подобный этому, в качестве технического любопытства.

1 Ответ

1 голос
/ 07 февраля 2020

Я знаю, что на макросы Scala нельзя ссылаться в коде, который компилируется в том же прогоне компиляции, что и сам макрос.

В Dotty произошли некоторые изменения. Теперь на макросы нельзя ссылаться в одном и том же файле, но можно ссылаться на один и тот же прогон компиляции.

https://github.com/lampepfl/dotty/pull/7324

http://dotty.epfl.ch/docs/reference/metaprogramming/macros.html#defining - a-macro-and-using-it-in-a-single-project

Цитата оттуда:

Идея состоит в том, чтобы приостановить вызовы макроса ( и их исходные зависимости), скомпилируйте исходный файл (файлы), содержащий макрос (ы), а затем скомпилируйте приостановленные файлы во втором запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...