【发布时间】:2020-02-06 20:16:30
【问题描述】:
我知道不能在与宏本身在同一编译运行中编译的代码中引用 Scala 宏。
我还从经验测试中知道,如果有一个代码库可以做到这一点(引用同一项目中的宏),如果删除了对宏的引用,则编译代码,对宏的引用重新-inserted,再次编译代码,第二次编译成功,宏生成代码正常运行。我认为这是因为编译器从第一次编译运行中看到宏的 .class 文件并使用它。
有没有办法编写代码(使用反射或类似方法)来确定宏生成的代码是否存在,如果存在则调用它?我正在考虑类似于How to invoke method on companion object via reflection? 的东西,但不是调用普通方法,而是调用宏生成的代码。
我的目标是让代码在第一次编译时做一件事,而在第一次编译后每次编译时做不同的事情,在两次编译运行之间不对源代码进行任何更改。我知道这不是一个好习惯。在大多数情况下,构建应该是确定性的。我的兴趣在于是否有可能创建这样的 Scala 代码作为技术好奇心。
【问题讨论】:
-
到目前为止你尝试了什么?
-
我尝试使用普通反射来获取定义宏的对象中可用的方法列表。我不认为这会奏效,也没有。通过这种方法,[macro]_impl 函数始终可见,但 [macro] 函数永远不可见。
标签: scala reflection macros scala-macros