我想编写一个宏来捕获程序片段并使其Tree
在运行时可用。基本上,我想要的功能,reify
但将其嵌入到不同的语法中。我想调用apply
一个Workload
伴随对象,提供一些代码并将Tree
提供的代码存储在一个新创建的 Workload 对象的成员中。
val wl = Workload {
// some code ...
}
wl.tree // Tree of 'some code'
不幸的是,我不能只转发,reify
因为它是一个宏。我想,我必须编写自己的类似于reify
. 但是我不知道如何Tree
从宏中返回 a ,并且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
变成c.Expr[Expr[Unit]]