Quasiquotes sind erstaunlich - sie machen das Schreiben von Makros in Scala sehr viel weniger schmerzhaft und in meinem Erfahrung, dass sie fast immer genau so funktionieren, wie ich es erwarte. Und das Beste ist, dass sie nun in Scala 2.10 als Plugin zur Verfügung stehen.
>Bei dieser Frage geht es um ein kleines Problem, mit dem ich beim Schreiben von diesem Blogpost . Es steht auf meiner Liste mit Dingen, in die ich schauen kann, wenn ich ein paar Minuten finde, aber ich dachte, ich würde es hier posten, falls jemand anderes mich dazu schlagen könnte und anderen Leuten zu helfen, die auf die gleiche Frage stoßen / p>
Angenommen, ich habe eine Liste von Listen mit Namenspaaren:
%Vor%Ich möchte diese in einen Baum verwandeln, der so aussieht:
%Vor%Folgendes funktioniert gut:
%Vor%Das heißt, es baut den folgenden Baum auf:
%Vor%Was darauf hindeutet, dass ich in der Lage sein sollte, so etwas zu schreiben:
%Vor%Oder etwas einfacher, mit mehreren Parametern in einer einzigen Parameterliste:
%Vor%Keine funktioniert - ich bekomme Fehler wie folgt:
%Vor% Schön genug - ich kann sehen, wie es für den Quasiquoter aussehen würde, als würde ich typisierte Ausdrücke erstellen, anstatt Parameter in quoted
zu definieren. Keines der offensichtlichen Dinge, die ich mir vorstellen konnte, funktionierte (Hinzufügen von = _
, explizites Eintippen der Quasiquote als ValDef
, etc.).
Ich weiß, dass ich die Parameterdefinitionen manuell erstellen kann:
%Vor% Und jetzt funktioniert die baz
Version (mit einer Parameterliste):
Aber nicht die foo
Version (die mit mehreren Parameterlisten).
Also, es gibt zwei Fragen hier. Erstens, wie kann ich Quasiquotes verwenden, um ein Name-Typ-Paar in einen Parameter ValDef
außerhalb des Kontextes einer in Anführungszeichen gesetzten Parameterliste umzuwandeln? Und zweitens, wie kann ich eine Liste von Listen mit Parameterdefinitionen in mehrere Parameterlisten umwandeln?
Es ist leicht genug, für das ganze verdammte Ding auf die manuelle AST-Konstruktion zurückzugreifen (siehe meine posten für ein Beispiel), aber ich möchte stattdessen Quasiquotes verwenden können.
Hier ist die schnelle Lösung für Ihr Problem:
%Vor%Wie Sie sehen können ... $ splice lässt Sie eine Funktion mit mehreren Argumentlisten definieren. Funktionsargumente selbst werden auf die gleiche Weise wie reguläre Werte dargestellt.
Ein anderes Beispiel, wo ... $ es nützlich sein könnte:
%Vor%Tags und Links scala macros scala-macros scala-quasiquotes