Wie unterscheidet man die vom Compiler abgeleitete implizite Konvertierung von der explizit aufgerufenen?

8

Stellen wir uns vor, diese beiden äquivalenten Ausdrücke an ein Scala-Makro zu übergeben:

  • mit vom Compiler abgeleiteter impliziter Konvertierung: 1+"foo"
  • mit explizit aufgerufener impliziter Konvertierung: any2stringadd(1)+"foo"

Gibt es eine Möglichkeit, zwischen diesen beiden im Makro zu unterscheiden?

    
ghik 19.03.2013, 19:26
quelle

2 Antworten

3

Zunächst wird der Fall 1 + "foo" schwierig sein, da dort keine implizite Konvertierung stattfindet: Int selbst hat wirklich diese Methode + ( leider ).

Sie haben also kein Glück, wenn das Ihr Anwendungsfall ist, aber es ist möglich, das zu tun, was Sie allgemein beschreiben. Ich nehme die folgende Konfiguration in meinen Beispielen an:

%Vor%

Zuerst für den eleganten Ansatz:

%Vor%

Was wie gewünscht funktioniert:

%Vor%

Leider erfordert dies untypisierte Makros, die derzeit nur in Macro Paradise verfügbar sind.

Sie können mit einfachen alten def -Makros in 2.10 bekommen, was Sie wollen, aber es ist ein bisschen wie ein Hack:

%Vor%

Und nochmal:

%Vor%

Der Trick besteht darin, in unserem abstrakten Syntaxbaum nach Stellen zu suchen, an denen wir Funktionsanwendungen sehen und dann zu überprüfen, ob die Positionen des Apply -Knotens und seines fun -Kinds die gleiche Spalte haben, die die Methode angibt Aufruf ist nicht explizit in der Quelle vorhanden.

    
Travis Brown 20.03.2013, 15:53
quelle
2

Das ist ein Hack, aber es könnte Ihnen helfen:

%Vor%     
Eugene Burmako 24.04.2013 06:31
quelle