Документирование макросов Scala 2.10 [закрыто]
Начну с примера. Вот'S эквивалентList.fill
для кортежей в качестве макроса в Scala 2.10:
import scala.language.experimental.macros
import scala.reflect.macros.Context
object TupleExample {
def fill[A](arity: Int)(a: A): Product = macro fill_impl[A]
def fill_impl[A](c: Context)(arity: c.Expr[Int])(a: c.Expr[A]) = {
import c.universe._
arity.tree match {
case Literal(Constant(n: Int)) if n < 23 => c.Expr(
Apply(
Select(Ident("Tuple" + n.toString), "apply"),
List.fill(n)(a.tree)
)
)
case _ => c.abort(
c.enclosingPosition,
"Desired arity must be a compile-time constant less than 23!"
)
}
}
}
Мы можем использовать этот метод следующим образом:
scala> TupleExample.fill(3)("hello")
res0: (String, String, String) = (hello,hello,hello)
Этот парень странная птица в двух отношениях. Во-первых,arity
Аргумент должен быть буквальным целым числом, так как мы должны использовать его во время компиляции. В предыдущих версиях Scala у метода не было (насколько я знаю) способа даже определить, был ли один из его аргументов литералом времени компиляции или нет.
Во-вторых,Product
тип возвратаэто ложь-статический тип возвращаемого значения будет включать конкретную арность и тип элемента, определенные аргументами, как показано выше.
Так как бы я задокументировал эту вещь? Я'Я не ожидаю поддержки Scaladoc на данный момент, но яЯ хотел бы иметь представление о соглашениях или передовых практиках (помимо простой проверки того, что сообщения об ошибках во время компиляции понятны), которые позволили бы запустить макрос-метод -с его потенциально странными требованиямименее удивительно для пользователей библиотеки Scala 2.10.
Самые зрелые демонстрации новой макросистемы (например,ScalaMock,скользкийостальные перечисленыВот) все еще относительно недокументированы на уровне метода. Любые примеры или указатели будут приветствоваться, в том числе из других языков с аналогичными макросистемами.