gpt4 book ai didi

scala - 在 Scala 宏中匹配 XML 文字

转载 作者:行者123 更新时间:2023-12-04 08:35:02 25 4
gpt4 key购买 nike

我想用宏转换 Scala XML 文字。 (不是带有 XML 的字符串文字,而是实际的 XML 文字)。据我了解,XML 文字实际上并没有在 AST 级别上内置到语言中,而是在解析器中脱糖。有趣的是,这确实有效:

case q"<specificTag></specificTag>" => ... // succeeds for specificTag with no
// attributes and children

但很明显,这完全没用,因为不可能以这种方式匹配任意 xml。就像是
case q"<$prefix:$label ..$attrs>$children</$prefix:$label>" => ...

不能工作,因为我们必须在一个模式中绑定(bind)同一个变量两次。

打印出这种 xml 文字表达式的树实际上给出了脱糖版本。例如。
new _root_.scala.xml.Elem(null,"specificTag",_root_.scala.xml.Null,$scope,false)

但试图匹配这个失败:
case q"new _root_.scala.xml.Elem(..$params)" => ... // never succeeds

我很困惑!我的问题是:有没有办法可靠地匹配 scala 宏中的任意 xml litarals?另外:为什么它们在 quasiquotes 中支持常量 xml 而不是脱糖值?

最佳答案

xml 包装在 block 中,宏调用为 rename( <top><bottom>hello</bottom></top> ) .我注意到通过查看传入的树,而不是 quasiquotes 构造的内容。

我已经提交了this issue当我之前看过你的问题时;我不知道我的 SO 是不是这样;我试过撞SS在 sbt.有another SO issue那可能是无关的。

  class Normalizer(val c: Context) {
import c.universe._
def impl(e: c.Tree) = e match {
case Block(List(), Block(List(), x)) => x match {
case q"new scala.xml.Elem($prefix, $label, $attrs, $scope, $min, $t)" =>
Console println s"Childed tree is ${showRaw(e)}"
val b = t match {
case Typed(b, z) => c.untypecheck(b.duplicate)
case _ => EmptyTree
}
val Literal(Constant(tag: String)) = label
val x = c.eval(c.Expr[NodeBuffer](b))
//q"""<${tag.reverse}>..$x</${tag.reverse}>""" // SO
e
case q"new scala.xml.Elem($prefix, $label, $attrs, $scope, $min)" =>
Console println s"Childless tree is ${showRaw(e)}" ; e
case _ => Console println s"Tree is ${showRaw(e)}" ; e
}
case _ => Console println s"Nonblock is ${showRaw(e)}" ; e
}
}

关于scala - 在 Scala 宏中匹配 XML 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22558856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com