Uso de archivos adjuntos con macros en Scala 2.10

Actualizar: Sospecho que lo que quiero podría no ser posible, y escribí una publicación de blog con mi razonamiento (y algunas alternativas)aquí. Me encantaría que me dijeran que me equivoco.

Supongamos que quiero crear una instancia de un rasgo usando un método de fábrica con una implementación macro. Este método tomará como argumento una ruta a un recurso que la macro leerá y analizará (en tiempo de compilación) en un mapa de cadenas a cadenas.

Esa parte es bastante sencilla. Ahora suponga que quiero asociar el mapa resultante con la instancia que estoy creando para poder usarla en las llamadas de macro posteriores que involucren esa instancia.

Yo crucialmenteno haga desea que el mapa sea un miembro de la instancia, o que exista en cualquier forma en tiempo de ejecución. Tampoco quiero analizar el mismo recurso más de una vez. Aquí hay un bosquejo del tipo de cosas a las que apunto:

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. */ ???
}

Este parece ser el tipo de cosa quearchivos adjuntos están diseñados para ayudar con (gracias aEugene Burmako parael puntero), y tengo una implementación basada en adjuntos que me permite escribir lo siguiente:

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

Dóndeapply_impl adjunta el mapa al árbol ylookup_impl lee ese archivo adjunto del mismo árbol, que ve como su prefijo. Desafortunadamente, esto es más o menos inútil, sin embargo, ya que no funciona en elfoo.lookup("x") caso, donde el árbol de prefijo es solo la variablefoo.

(Tenga en cuenta que en mi caso de uso realFoo se extiendeDynamic, y estoy tratando de dar una macro implementacion paraselectDynamic en lugar delookup, pero eso no debería ser relevante aquí, estoy interesado en el caso general.)

¿Hay alguna forma en que pueda usar los archivos adjuntos para obtener lo que quiero? ¿Hay algún otro enfoque que sería más apropiado?

Respuestas a la pregunta(1)

Su respuesta a la pregunta