Erstellen eines Methodendefinitionsbaums aus einem Methodensymbol und einem Body

8

Gibt es eine bequeme Möglichkeit, ein MethodSymbol in die linke Seite eines Methodendefinitionsbaums (dh ein DefDef ) in Scala 2.10?

Angenommen, ich möchte ein Makro erstellen, das eine Instanz eines Merkmals übernimmt und alle Methoden dieses Merkmals mit Debugging-Funktionen umschließt. Ich kann folgendes schreiben:

%Vor%

Ich habe das langweilige Geschäft, diese Methoden in einer neuen anonymen Klasse zu kleben, die das Merkmal implementiert und dann diese Klasse instanziiert, beseitigt. Sie können ein vollständiges funktionierendes Beispiel finden hier wenn Sie interessiert sind.

Jetzt kann ich das schreiben, zum Beispiel:

%Vor%

So funktioniert es, aber nur in sehr einfachen Fällen - es wird nicht, wenn das Merkmal Methoden mit Parameterlisten, mit Zugriffsmodifizierern, Anmerkungen usw. hat.

Was ich wirklich will, ist eine Funktion, die ein Methodensymbol und einen Baum für den neuen Körper übernimmt und ein DefDef zurückgibt. Ich habe angefangen, eines von Hand zu schreiben, aber es beinhaltet eine Menge kniffliger Sachen wie dieses:

%Vor%

Was nervig, wortreich und fehleranfällig ist. Fehle ich eine bessere Möglichkeit, dies in der neuen Reflection-API zu tun?

    
Travis Brown 07.12.2012, 16:59
quelle

2 Antworten

4

Nach meinem besten Wissen gibt es keinen Standardweg von einem Symbol zu einem definierenden Baum.

Ihre beste Wette wäre wahrscheinlich, durch c.enclosingRun.units zu iterieren und in jedem der unit.body -Bäume wiederzukommen, während Sie gehen. Wenn Sie ein DefDef sehen, dessen symbol gleich Ihrem Symbol ist, haben Sie Ihr Ziel erreicht. upd. Vergiss nicht, duplicate den definierenden Baum vor der Wiederverwendung zu verwenden!

Diese Technik ist bei weitem nicht die bequemste Sache der Welt, aber sie sollte funktionieren.

    
Eugene Burmako 07.12.2012, 18:07
quelle
2

Sie können Folgendes versuchen. Dies funktioniert mit mehreren Parametern und Curry-Funktionen und Typparametern;)

%Vor%     
Leo 08.12.2012 02:28
quelle