繁体   English   中英

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

[英]How to write a Scala macro that evaluates to a Tree similar to “reify”

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

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转换为c.Expr[Expr[Unit]]

这是我最终如何做到的。 只需确保在运行时Universe上调用reify以获取不依赖于ContextExpr

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]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM