【问题标题】:Possible to identify/use Scala macros using reflection or similar?可以使用反射或类似方法识别/使用 Scala 宏吗?
【发布时间】: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


【解决方案1】:

我知道在编译的代码中不能引用 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

从那里引用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多