Während der Arbeit mit Makros habe ich den Punkt erreicht (ich habe mich bemüht, es zu vermeiden), wo ich jene Knoten im AST aktualisieren muss, die bestimmte Bedingungen erfüllen. Zum Beispiel, sagen wir, ich möchte jeden Knoten aktualisieren:Was ist der einfachste Weg, um eine unveränderliche AST zu aktualisieren?
Literal(Constant(1))
mit dem Wert:
Literal(Constant(2))
Diese AST-Knoten irgendwo im Ausdrucksbaum sein könnte, so kann ich nicht eine Ad-hoc verwenden Mustervergleicher. Offensichtlich ist das letzte, was ich tun möchte, einen vollständigen Muster-Matcher zu programmieren, der alle Compiler-Primitive abdeckt. Ich habe in der API Suche, aber ich habe den Eindruck, dass Methoden wie sammeln und die traversable Familie sind nicht gut genug, um meine Bedürfnisse zu erfüllen, da sie den Baum als eine lineare Sache behandeln, und ich will das ganze aktualisiert Baum als Ergebnis. Ist es also möglich, einen unveränderlichen Ausdrucksbaum auf intelligente Weise zu aktualisieren? Warum existiert solch eine "Update" -Operation nicht in der Standard-API?
Für Plugins ein TreeTransformer ist. Ich nehme an, dass es für Makros ein ähnliches gibt, vielleicht sogar dasselbe. – pedrofurla
Wahrscheinlich wirst du [zippers] (http://anti-xml.org/zippers.html) –
@NikitaVolkov auschecken, würde ich sagen, wenn er nicht im Zusammenhang mit Makros gefragt. – pedrofurla