簡體   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