如何编写一个评估为类似于“reify”的树的Scala宏

时间:2016-11-10 20:30:32

标签: scala scala-reflect

我想编写一个捕获程序片段的宏,并在运行时将其作为Tree提供。基本上,我想要reify的功能,但将其嵌入到不同的语法中。我想在apply伴随对象上调用Workload,提供一些代码并将所提供代码的{​​{1}}存储在新创建的Workload对象的成员中。

Tree

不幸的是,我不能只转发到val wl = Workload { // some code ... } wl.tree // Tree of 'some code' ,因为它是一个宏。我想,我必须编写类似于reify的宏。但是我不知道如何从宏中返回reifyTree的来源只是提到了一些硬连线的实现。

如何实现这一目标?

更新

我写了一个小例子来强调我的观点

reify

唯一缺少的是将import scala.reflect.runtime.universe._ object MacroFun { import scala.reflect.macros.blackbox.Context import scala.language.experimental.macros def getSomeTree: Expr[Unit] = macro getTreeImpl def getTreeImpl(c: Context): c.Expr[Expr[Unit]] = { import c.universe._ val expr = reify { println("Hello World!") } ??? } } 变为expr

的方法

1 个答案:

答案 0 :(得分:0)

这是我最终如何做到的。只需确保在运行时Universe上调用reify即可获得不依赖于Expr的{​​{1}}。

Context