Dokumentieren von Scala 2.10-Makros [geschlossen]

Ich werde mit einem Beispiel beginnen. Hier ist ein Äquivalent vonList.fill für Tupel als Makro in 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!"
      )
    }
  }
}

Wir können diese Methode wie folgt anwenden:

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

Dieser Typ ist in mancher Hinsicht ein komischer Vogel. Zuerst diearity Das Argument muss eine Ganzzahl sein, da es zur Kompilierungszeit verwendet werden muss. In früheren Versionen von Scala gab es meines Wissens keine Möglichkeit, mit einer Methode festzustellen, ob eines der Argumente ein Literal zur Kompilierungszeit war oder nicht.

Zweitens dieProduct Rückgabetypist eine Lüge- Der statische Rückgabetyp enthält die spezifische Arität und den Elementtyp, die durch die oben gezeigten Argumente bestimmt werden.

Wie würde ich dieses Ding dokumentieren? An dieser Stelle erwarte ich keine Unterstützung für Scaladoc, aber ich hätte gerne ein Gespür für Konventionen oder bewährte Methoden (außer nur sicherzustellen, dass die Fehlermeldungen zur Kompilierungszeit klar sind), mit denen eine Makromethode ausgeführt werden kann potenziell bizarre Anforderungen - weniger überraschend für Benutzer einer Scala 2.10-Bibliothek.

Die ausgereiftesten Demonstrationen des neuen Makrosystems (z.B.ScalaMock, Glatt, die anderen aufgelistetHier) sind auf Methodenebene noch relativ undokumentiert. Beliebige Beispiele oder Hinweise sind erwünscht, auch solche aus anderen Sprachen mit ähnlichen Makrosystemen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage