Übereinstimmende XML-Literale in Scala-Makros

9

Ich möchte Scala-XML-Literale mit einem Makro transformieren. (Kein String-Literal mit XML, sondern tatsächliche XML-Literale). Soweit ich weiß, sind XML-Literale nicht auf AST-Ebene in die Sprache integriert, sondern im Parser entziffert. Interessanterweise funktioniert dies jedoch:

%Vor%

Aber das ist natürlich völlig nutzlos, weil es unmöglich ist, ein beliebiges xml auf diese Weise zu finden. Etwas wie

%Vor%

kann nicht funktionieren, weil wir dieselbe Variable zweimal in einem Muster binden müssten.

Das Ausdrucken der Struktur eines solchen XML-Literalausdrucks gibt die entartete Version. Zum Beispiel.

%Vor%

Aber der Versuch, dies zu erreichen, schlägt fehl:

%Vor%

Ich bin verwirrt! Meine Frage ist: Gibt es eine Möglichkeit, willkürliche XML-Literale in Scala-Makros zuverlässig anzupassen? Zusätzlich: Warum werden sie in Quasiquoten für konstante xml und nicht für den entzuckerten Wert immerhin unterstützt?

    
Martin Ring 21.03.2014, 12:31
quelle

2 Antworten

2

Das XML wird in Blöcke gehüllt, Makro wird als rename( <top><bottom>hello</bottom></top> ) aufgerufen. Ich bemerkte das, indem ich auf den ankommenden Baum schaute, nicht darauf, was aus Quasiquoten konstruiert wurde.

Ich hatte dieses Problem eingereicht, als ich Ihre Frage zuvor angesehen habe. Ich weiß nicht, ob meine SO das ist; Ich habe versucht, SS in sbt zu stoßen. Es gibt ein anderes SO-Problem , das wahrscheinlich nicht zusammenhängt.

%Vor%     
som-snytt 02.04.2014 07:46
quelle
2

Leider unterstützen Quasiquotes nativ nicht das Abgleichen von XML-Literalen und bis heute war der einzige Weg, dies zu tun, die Übereinstimmung mit entzuckertem Baum, wie von @ som-snytt . Aber es ist sehr einfach, es falsch zu verstehen, und solche Manipulationen können so viele AST-Knoten erfordern, dass sie explodieren. der Mustervergleicher .

Um diese Schwachstelle zu beheben, haben wir gerade einen ersten Meilenstein von scalacrocos / xml veröffentlicht, eine Bibliothek, die dieses Problem umgeht: Anstatt mit AST of XML zu arbeiten, können Sie stattdessen mit reinen XML-Knoten arbeiten:

%Vor%

Hier verwenden wir unlifting , um Code in Wert zu konvertieren und dann können wir ihn einfach als XML verarbeiten. Am Ende nach der Verarbeitung werden Sie es wahrscheinlich durch Heben zurück in AST konvertieren wollen:

%Vor%

Falls Ihre ursprüngliche AST-Version einige Code-Snippets enthält, werden sie in einen speziellen Unquote -Knoten umgewandelt, der solche Snippets enthält:

%Vor%

Es ist auch einfach, alle unquote-Knoten durch Projektion zu filtern:

%Vor%

Sie könnten auch daran interessiert sein, ein Beispiel für ein sbt-Projekt mit einem einfachen Makro zu lesen, das diese Bibliothek verwendet oder einen genaueren Blick darauf wirft in unserer Testsuite .

    
Denys Shabalin 09.04.2014 21:13
quelle