可以使用反射或类似方法识别/使用 Scala 宏吗?



我知道不能在与宏本身相同的编译运行中编译的代码中引用 Scala 宏。

我还从实证测试中知道,如果一个人有一个代码库来做到这一点(引用同一项目中的宏(,如果删除对宏的引用,编译代码,重新插入对宏的引用,并再次编译代码,第二次编译将成功,宏生成的代码将正常运行。我认为这是因为编译器从第一次编译运行中看到宏的.class文件并使用它。

有没有办法编写代码(使用反射或类似方法(来确定宏生成的代码是否存在,如果存在,则调用它?我正在考虑类似于如何通过反射在配套对象上调用方法?的东西,但不是调用普通方法,而是调用宏生成的代码。

我的目标是让代码在第一次编译时做一件事,在第一次编译后每次编译时做另一件事,而不会在两次编译运行之间对源代码进行任何更改。我知道这不是一个好的做法。在大多数情况下,生成应该是确定性的。我感兴趣的是是否有可能出于技术好奇心创建这样的 Scala 代码。

我知道

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

从那里引用:

这个想法是挂起宏的调用方(及其上游( 依赖项(,编译包含宏的源文件,以及 然后在第二次运行中编译挂起的文件。

有什么技巧可以在定义的同一文件中使用宏吗?

最新更新