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
'Program Club' 카테고리의 다른 글
| 선택을 통한 Onchange 오픈 URL-jQuery (0) | 2020.10.27 |
|---|---|
| 무작위로 테스트를 다시 시작하는 phpunit (0) | 2020.10.27 |
| TemplateHaskell을 사용하여 네임 스페이스의 모든 이름 나열 (0) | 2020.10.27 |
| Python 3.x에는 어떤 SOAP 라이브러리가 있습니까? (0) | 2020.10.27 |
| Python C-API에서 파생 된 형식을 동적으로 만드는 방법 (0) | 2020.10.27 |