Wie bekomme ich ein Scala-Makro, um einen Methodenaufruf zu ersetzen?

8

Wie bekomme ich ein Scala-Makro, um einen Methodenaufruf zu ersetzen?

Mein Ziel ist es, ein Merkmal namens ToStringAdder zu erstellen. Angenommen, ich habe ein Objekt x mit diesem Merkmal, dann möchte ich, wenn ich x.add(any) aufrufe, dass das Makro tatsächlich x.add(any, string) aufruft, wobei die Zeichenkette eine Zeichenkette des AST ist. (Dies ist so, dass ich nette tostring haben kann, wenn 'any' eine Funktion ist).

  • Ich habe die in der Dokumentation angegebenen Makros geschrieben Ссылка ,
  • Lesen Ссылка
  • Lesen Sie die pdfs Ссылка .
  • Ich habe mir den Code in Ссылка
  • Und der Code in Ссылка , aber ich bin traurig zu sagen, dass ich nicht alles gemocht habe
  • Ich habe mir das scaladoc angesehen, aber ... woo..das ist komplex ... Ich vermute, dass ich etwas Zeit brauchen würde, um mit der Funktionsweise des Compilers Schritt zu halten.

Mit Ausnahme von Expecty verwenden alle diese Beispiele, die ich gesehen habe, effektiv statische Methodenaufrufe: das Objekt, auf dem das Makro aufgerufen wird, wird nicht verwendet. Expecty hat die folgende Methode, die mir einen Hinweis darauf gibt, wie man das 'implizite Dies' erkennen kann, aber ich konnte keinen Weg finden, es in einem Anruf von retify zu referenzieren.

%Vor%

Wie gehe ich vor, den Aufruf des Objekts zu ersetzen, an dem das Makro aufgerufen wurde. Der Code, den ich im Moment habe, ist unten, und es ist der Code im Rufify-Aufruf, der sortiert werden muss

%Vor%     
Stave Escura 07.05.2013, 09:54
quelle

1 Antwort

4

Sie könnten Tree für Ihre ToStringAdder -Instanz als c.prefix erhalten.

Versuchen Sie Folgendes:

%Vor%

Beweis, dass es funktioniert:

%Vor%     
senia 07.05.2013, 10:13
quelle

Tags und Links