Скажем, у меня есть выражение, дерево которого я хочу записать (не оценивая его!), А затем передать его в другой макрос через некоторое время:
// capture a tree from some arbitrary expression
val capturedTree = captureMacro( some(expression(tree())) )
// plug the tree into here
val result = processMacro(capturedTree, otherStuff)
Есть ли способ сделать это?Я попытался сделать capturedTree
усовершенствованным типом, надеясь, что это сохранит исходное дерево, но этого не произошло:
trait WithCapturedTree { def tree:Any }
class ReturnTreeMacro(val c:MacroContext) {
import c.universe._
def run(expression: Tree) =
q"new WithCapturedTree {val tree = ${expression}}"
}
def returnTree(expression:String):WithCapturedTree = macro ReturnTreeMacro.run
reify { returnTree("foo"+"bar") }
// returns Expr[WithCapturedTree{val tree: java.lang.String}](returnTree("foobar"))
// I.e. the result of "foo"+"bar" has already been evaluated!
Есть ли способ заставить этот подход работать?Есть ли лучшая оценка для этой проблемы?