Dokumentowanie makr Scala 2.10 [zamknięte]

Zacznę od przykładu. Oto odpowiednikList.fill dla krotek jako makro w 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!"
      )
    }
  }
}

Możemy użyć tej metody w następujący sposób:

scala> TupleExample.fill(3)("hello")
res0: (String, String, String) = (hello,hello,hello)

Ten facet to dziwny ptak w kilku aspektach. Po pierwszearity argument musi być literalną liczbą całkowitą, ponieważ musimy go użyć w czasie kompilacji. W poprzednich wersjach Scali nie było sposobu (o ile wiem) na metodę, która nawet określałaby, czy jeden z jej argumentów był dosłownym kompilatorem.

Po drugieProduct typ powrotujest kłamstwem—Temat statycznego powrotu będzie zawierać określony typ arity i elementu określony przez argumenty, jak pokazano powyżej.

Jak mam to udokumentować? W tym momencie nie oczekuję wsparcia ze strony Scaladoc, ale chciałbym mieć poczucie konwencji lub najlepszych praktyk (poza tylko upewnianiem się, że komunikaty o błędach podczas kompilacji są jasne), co sprawiłoby, że uruchomienie systemu byłoby metodą makro potencjalnie dziwne wymagania - mniej zaskakujące dla użytkowników biblioteki Scala 2.10.

Najbardziej dojrzałe demonstracje nowego systemu makro (np.ScalaMock, Przysiek, pozostałe wymienionetutaj) są nadal stosunkowo nieudokumentowane na poziomie metody. Wszelkie przykłady lub wskaźniki będą mile widziane, w tym z innych języków z podobnymi systemami makro.

questionAnswers(1)

yourAnswerToTheQuestion