2

我想编写一个宏来捕获程序片段并使其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]]

4

1 回答 1

0

这就是我最后是如何做到的。只需确保调用reify运行时 Universe 以获取Expr不依赖于Context.

class ErplMacro(val c: Context) {
  def lift[T:c.WeakTypeTag](exp: c.Expr[T]) = {
    import c.universe._
    q"""ErplRuntime.compile(scala.reflect.runtime.universe.reify($exp))"""
  }
}

object ErplRuntime {
  def compile[T](ctxElems: (scala.Symbol,Any)*)(exp: Expr[T]): Unit = // ...
}

trait ErplApi {
  def compile[T](exp: T): Unit = macro ErplMacro.lift[T]
}
于 2017-02-14T22:10:54.880 回答