首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写计算为类似于"reify“的树的Scala宏

如何编写计算为类似于"reify“的树的Scala宏
EN

Stack Overflow用户
提问于 2016-11-11 04:30:32
回答 1查看 209关注 0票数 2

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

代码语言:javascript
复制
val wl = Workload {
  // some code ...
}

wl.tree // Tree of 'some code'

不幸的是,我不能仅仅转发到reify,因为它是一个宏。我想,我必须编写自己的宏,类似于reify。但是我不知道如何从宏返回Tree,而reify的源代码只提到了一些硬连接的实现。

如何才能做到这一点?

更新

我写了一个小例子来强调我的观点。

代码语言:javascript
复制
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]]的方法

EN

回答 1

Stack Overflow用户

发布于 2017-02-15 06:10:55

这就是我最后是如何做到的。只需确保在运行时领域调用reify,以获得不依赖于ContextExpr

代码语言:javascript
复制
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]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40536469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档