В настоящее время это невозможно и, вероятно, никогда не будет. Макросы не могут вводить свой собственный синтаксис - они должны быть представлены через действительный код Scala (который может быть выполнен во время компиляции), а также они должны генерировать действительный код Scala (лучше сказать действительный Scala AST).
Оба показанных вами примера не являются допустимым кодом Scala, поэтому макросы не могут их обрабатывать. Тем не менее, текущая ночная сборка Macro Paradise включает нетипизированные макросы. Они позволяют писать код Scala, который проверяется по типу после расширения, это означает, что можно писать:
forM({i = 0; i < 10; i += 1}) {
println(i)
}
Обратите внимание, что фигурные скобки внутри первого списка параметров необходимы, потому что, хотя код не проверяется по типу при его записи, он должен представлять действительный Scala AST.
Реализация этого макроса выглядит так:
def forM(header: _)(body: _) = macro __forM
def __forM(c: Context)(header: c.Tree)(body: c.Tree): c.Tree = {
import c.universe._
header match {
case Block(
List(
Assign(Ident(TermName(name)), Literal(Constant(start))),
Apply(Select(Ident(TermName(name2)), TermName(comparison)), List(Literal(Constant(end))))
),
Apply(Select(Ident(TermName(name3)), TermName(incrementation)), List(Literal(Constant(inc))))
) =>
// here one can generate the behavior of the loop
// but omit full implementation for clarity now ...
}
}
Вместо выражения, которое уже проверено по типу, макрос ожидает только дерево, которое проверяется по типу после раскрытия. Сам вызов метода ожидает двух списков параметров, типы параметров которых могут быть отложены после фазы раскрытия, если используется символ подчеркивания.
В настоящее время доступно немного документации, но поскольку она находится в стадии бета-тестирования Возможно, в будущем многое изменится.
С макросами типа можно написать что-то вроде этого:
object O extends M {
// traverse the body of O to find what you want
}
type M(x: _) = macro __M
def __M(c: Context)(x: c.Tree): c.Tree = {
// omit full implementation for clarity ...
}
Это удобно для того, чтобы отложить проверку типов всего тела, потому что это позволяет охладить вещи ...
Макросы, которые могут изменить синтаксис Scalas, на данный момент не планируются и, вероятно, не являются хорошей идеей. Я не могу сказать, произойдут ли они когда-нибудь, только будущее может сказать нам это.
person
kiritsuku
schedule
30.01.2013