/ / Existuje nejaký spôsob, ako použiť kód makrimplementácií pre interpolátor reťazca „f“ v mojom makre? - scala, makra, scala-2.10

Existuje nejaký spôsob, ako použiť kód makra pre reťazec interpolátora "f" v mojom makre? - scala, makrá, scala-2.10

V súčasnosti som sa pokúsil urobiť niečo ako toto:

def macroImpl(cx: Context)(...) = {
new MacroImplementations { val c = cx }
}

ale sťažuje sa to c v MacroImplementations je typu scala.reflect.macros.runtime.Context, zatiaľ čo cx je typu scala.reflect.macros.Context.

Aký je rozdiel medzi týmito dvoma kontextmi?

odpovede:

0 pre odpoveď č. 1

Nakoniec som skončil s nasledujúcim riešením - je to dosť škaredé, ale funguje to:

import scala.language.experimental.macros
import scala.reflect.macros.Context
import scala.reflect.macros.runtime.{Context => ContextR}
import scala.tools.reflect.MacroImplementations


def putfImpl(cx: Context)(args: cx.Expr[Any]*): cx.Expr[Unit] = {
val cx2 = cx.asInstanceOf[ContextR]
val args2 = args.toList.asInstanceOf[List[cx2.Expr[Any]]]
import cx2.universe._
val Apply(_, List(Apply(_, partsE))) = cx2.prefix.tree
val mi = new { val c : cx2.type = cx2 } with MacroImplementations
val res = mi.macro_StringInterpolation_f(partsE, args2.map(_.tree), cx2.enclosingPosition)
reify(println(cx2.Expr[String](res).splice)).asInstanceOf[cx.Expr[Unit]]
}