Я пытаюсь написать макрос, который бы обернул функцию и вычитал параметр из значения, которому будет назначен его вызов.Получить имя значения a Макро-вызов Scala будет назначен
object TestMacros {
def foo(name: String): String = name.toUpper
def bar = macro barImpl
def barImpl(c: Context): c.Expr[String] = {
import c.universe._
//TODO extract value name (should be baz)
c.Expr[String](Apply(
Select(newTermName("TestMacros"), newTermName("foo")), // Probably wrong, just typed it quickly for demonstration purposes
List(Literal(Constant("test"))))) // Should replace test by value name
}
}
object TestUsage {
val baz = bar // should be BAZ
}
Я не знаю, достаточно ли это достаточно. Я изучил как c.prefix, так и c.macroApplication без успеха. Я использую Scala 2.10.2 без плагинов компилятора макро-рая.
Я не думаю, что это возможно, по крайней мере, не со стандартными 'def' макросов. Макро может только проверять и изменять свой собственный вызов. – ghik
@ghik: Он также знает свое собственное положение и может проверять позиции в своем классе. См. Мой ответ ниже для деталей. –
@TravisBrown Ugh, это правда, макрос имеет доступ к его окружающему методу и деревьям классов. Я был не прав. Каким-то образом это показалось мне слишком опасным. – ghik