Verwenden von Anhängen mit Makros in Scala 2.10

Aktualisieren: Ich vermute, dass das, was ich will, möglicherweise nicht möglich ist, und ich habe einen Blog-Beitrag mit meinen Überlegungen (und einigen Alternativen) verfasst.Hier. Es würde mich sehr freuen, wenn ich erfahren würde, dass ich falsch liege.

Angenommen, ich möchte eine Instanz eines Merkmals mithilfe einer Factory-Methode mit einer Makroimplementierung erstellen. Diese Methode verwendet als Argument einen Pfad zu einer Ressource, die vom Makro gelesen und (zur Kompilierungszeit) von Zeichenfolge zu Zeichenfolge in eine Zuordnung analysiert wird.

Dieser Teil ist alles ziemlich einfach. Angenommen, ich möchte die resultierende Zuordnung mit der von mir erstellten Instanz verknüpfen, damit ich sie in nachfolgenden Makroaufrufen mit dieser Instanz verwenden kann.

Ich entscheidendunterlassen Sie Die Map soll ein Mitglied der Instanz sein oder zur Laufzeit in einer beliebigen Form vorliegen. Ich möchte dieselbe Ressource auch nicht mehr als einmal analysieren. Hier ist eine Skizze der Art von Dingen, die ich anstrebe:

import scala.language.experimental.macros
import scala.reflect.macros.Context

trait Foo {
  def lookup(key: String): String = macro Foo.lookup_impl
}

object Foo {
  def parseResource(path: String): Map[String, String] = ???

  def apply(path: String): Foo = macro apply_impl

  def apply_impl(c: Context)(path: c.Expr[String]): c.Expr[Foo] = {
    import c.universe._

    val m = path.tree match {
      case Literal(Constant(s: String)) => parseResource(s)
    }

    val tree = reify(new Foo {}).tree
    // Somehow associate the map with this tree here.
    c.Expr(tree)
  }

  def lookup_impl(c: Context)(key: c.Expr[String]): c.Expr[String] =
    /* Somehow read off the map and look up this key. */ ???
}

Das scheint so etwas zu seinAnlagen sollen helfen bei (danke anEugene Burmako zumder Zeiger) und ich habe eine anhangsbasierte Implementierung, mit der ich Folgendes schreiben kann:

Foo("whatever.txt").lookup("x")

Woherapply_impl hängt die Karte an den Baum an undlookup_impl Liest diesen Anhang von demselben Baum, den er als Präfix sieht. Leider ist dies jedoch mehr oder weniger nutzlos, da es im Internet nicht funktioniertfoo.lookup("x") In diesem Fall ist der Präfixbaum nur die Variablefoo.

(Beachten Sie, dass in meinem realen AnwendungsfallFoo erweitertDynamic, und ich versuche eine Makroimplementierung für zu gebenselectDynamic anstattlookup, aber das sollte hier nicht relevant sein - ich interessiere mich für den allgemeinen Fall.)

Gibt es eine Möglichkeit, mit Anhängen das zu bekommen, was ich will? Gibt es einen anderen Ansatz, der angemessener wäre?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage