我想编写一个捕获程序片段的宏,并在运行时将其作为Tree
提供。基本上,我想要reify
的功能,但将其嵌入到不同的语法中。我想在apply
伴随对象上调用Workload
,提供一些代码并将所提供代码的{{1}}存储在新创建的Workload对象的成员中。
Tree
不幸的是,我不能只转发到val wl = Workload {
// some code ...
}
wl.tree // Tree of 'some code'
,因为它是一个宏。我想,我必须编写类似于reify
的宏。但是我不知道如何从宏中返回reify
而Tree
的来源只是提到了一些硬连线的实现。
如何实现这一目标?
我写了一个小例子来强调我的观点
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
答案 0 :(得分:0)
这是我最终如何做到的。只需确保在运行时Universe上调用reify
即可获得不依赖于Expr
的{{1}}。
Context