マクロを使用して 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>" => ...
パターン内で同じ変数を 2 回バインドする必要があるため、機能しません。
このような 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 リテラルを確実に一致させる方法はありますか? さらに: 定数 xml の準引用符でサポートされているのに、desugared 値ではサポートされていないのはなぜですか?