我想在THEN部分中打印IF条件的Scala源代码。
例子: IF{ 2 + 2 < 5 } THEN { println("I am in THEN because: " + sourceCodeOfCondition) }
现在让我们跳过THEN部分,问题是:如何在IF之后获取块的源代码?
我认为IF应该是一个宏...
注意:此问题是Macro的重新定义版本,用于在运行时访问功能源代码,在此我描述了{ val i = 5; List(1, 2, 3); true }.logValueImpl
对我有用的功能(根据其他问题Macro可以在运行时访问源代码文本)。
即席实施,因为我只有一分钟的时间:
import scala.reflect.macros.Context
import scala.language.experimental.macros
case class Conditional(conditionCode: String, value: Boolean) {
def THEN(doIt: Unit) = macro Conditional.THEN_impl
}
object Conditional {
def sourceCodeOfCondition: String = ???
def IF(condition: Boolean) = macro IF_impl
def IF_impl(c: Context)(condition: c.Expr[Boolean]): c.Expr[Conditional] = {
import c.universe._
c.Expr(q"Conditional(${ show(condition.tree) }, $condition)")
}
def THEN_impl(c: Context)(doIt: c.Expr[Unit]): c.Expr[Unit] = {
import c.universe._
val rewriter = new Transformer {
override def transform(tree: Tree) = tree match {
case Select(_, TermName("sourceCodeOfCondition")) =>
c.typeCheck(q"${ c.prefix.tree }.conditionCode")
case other => super.transform(other)
}
}
c.Expr(q"if (${ c.prefix.tree }.value) ${ rewriter.transform(doIt.tree) }")
}
}
接着:
object Demo {
import Conditional._
val x = 1
def demo = IF { x + 5 < 10 } THEN { println(sourceCodeOfCondition) }
}
最后:
scala> Demo.demo
Demo.this.x.+(5).<(10)
这是原始资料的简略代表,但我想不到的是,这是您所能获得的最好的结果。
有关此技术的一些讨论,请参见我的博客文章。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句