[英]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
以獲取不依賴於Context
的Expr
。
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.