这是一个简化的示例,但问题仍然存在。
我想使用宏(基于scala的伪代码)来实现这一点:
(a: Int) => {
val z = "toShort"
a.z
}
如果我具体化它,我会得到类似的东西:
Function(
List(
ValDef(
Modifiers(Flag.PARAM),
newTermName("a"),
Ident(scala.Int),
EmptyTree
)
),
Block(
List(
ValDef(
Modifiers(),
newTermName("z"),
TypeTree(),
Literal(Constant("toShort"))
)
),
Apply(
Select(
Ident(newTermName("a")),
newTermName("toShort")
),
List()
)
)
)
我不知道如何访问一个值,然后将其用作 TermName。
我尝试替换newTermName("toShort")
为,newTermName(c.Expr[String](Select(Ident(newTermName("z")))).splice)
但编译器似乎不喜欢:
宏展开时出现异常:java.lang.UnsupportedOperationException:你调用的函数没有被>编译器拼接。这意味着涉及跨阶段评估,需要显式调用。如果您确定这不是疏忽,请将 scala-compiler.jar 添加到类路径中,然后导入
scala.tools.reflect.Eval
并调用<your expr>.eval
。
我也按照编译器的建议尝试了“eval”:newTermName(c.eval(c.Expr[String](...))
但都没有奏效。
我怎样才能将树Select(Ident(newTermName("z")))
(这是对本地 val 的值的访问)之类的树转换为 Name一个可以用作参数的字符串newTermName
?可能吗?
更新:
这里真正的问题给你带来了一个要点!
提前致谢,