Program Club

Scala 2.10 매크로 문서화

proclub 2020. 10. 27. 23:43
반응형

Scala 2.10 매크로 문서화


예부터 시작하겠습니다. 다음 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 , Slick , 여기에 나열된 다른 )는 여전히 메서드 수준에서 상대적으로 문서화되지 않았습니다 . 유사한 매크로 시스템을 사용하는 다른 언어의 예제를 포함하여 모든 예제 또는 포인터가 인정 될 것입니다.


Miles가 그의 실험적인 매크로 기반 의 형태없는 브랜치 에서 해왔 기 때문에 이것을 문서화하는 가장 좋은 방법은 예제 코드를 사용하는 것입니다 .

참고 URL : https://stackoverflow.com/questions/13840784/documenting-scala-2-10-macros

반응형