【发布时间】:2014-02-15 21:59:04
【问题描述】:
2.10.3 的 Scala API 文档说我可以“使用 refiy 生成表示给定 Scala 表达式的抽象语法树”。因此,我可以这样做:
scala> val uni = scala.reflect.runtime.universe
uni: scala.reflect.api.JavaUniverse = scala.reflect.runtime.JavaUniverse@4e42766
scala> uni reify { 1 to 3 }
res2: uni.Expr[scala.collection.immutable.Range.Inclusive] = Expr[scala.collection.immutable.Range.Inclusive](Predef.intWrapper(1).to(3))
在上面的示例中,我得到了我正在寻找的内容:Predef.intWrapper(1).to(3))(要执行的操作的方便扩展表示)。
但是,当我尝试具体化 1 + 3 时,我并没有表示我想要执行的操作。
scala> uni reify { 1 + 3 }
res5: uni.Expr[Int(4)] = Expr[Int(4)](4)
这是预期的行为吗? + 是原始操作,因此没有具体化吗?
Scala 文档显示了一个具体化示例,这意味着可以使用更有用的表示:
reify{ 2 + 4 } // Apply( Select( Literal(Constant(2)), newTermName("$plus")), List( Literal(Constant(4)) ) )
如何检查 1 + 3 的正确扩展表示(如果存在)以及如何检索任何表达式的详细表示(就在上面)?
编辑:我现在看到 Scala 文档中的表示形式是由 showRaw 生成的。但是,我仍然无法重现上面示例中 2 + 4 的原始表示形式。
【问题讨论】:
标签: scala abstract-syntax-tree reification