봉인 된 추상 및 케이스 클래스의 매크로 생성 계층을 만들고 싶습니다. http://docs.scala-lang.org/overviews/macros/typemacros.html에 이와 유사한 예제 가 있었지만 이제는 더 이상 사용되지 않습니다. 여전히 가능합니까?
특정 문법에 대해 형식 안전 AST를 생성하는 것이 엄청나게 강력하다고 생각합니다. 이상적으로는 모든 클래스를 해결할 수있는 IDE를 사용합니다.
먼저 뻔뻔한 자기 홍보를 위해 : Eugene Burmako 와 저는 내일 Scalar 2014 에서 밀접하게 관련된 주제 인 유형 공급자에 대해 강연 할 예정입니다. 만약 여러분이 강연을 위해 모아 놓은 예제 프로젝트를 살펴 보시기 바랍니다. 이런 종류의 것에 관심이 있습니다.
형 매크로는 더 이상 지원되지 않는 동안, 당신은 본질적으로 같은 일을 수행 할 수있는 매크로 주석 에서 매크로 낙원 (스칼라 2.10와 2.11에 대한 플러그인으로 가능) :
import scala.annotation.StaticAnnotation
import scala.language.experimental.macros
import scala.reflect.macros.Context
// Add constructor arguments here.
class expand extends StaticAnnotation {
def macroTransform(annottees: Any*) = macro Expander.expand_impl
}
object Expander {
def expand_impl(c: Context)(annottees: c.Expr[Any]*) = {
import c.universe._
annottees.map(_.tree) match {
case List(q"trait $name") => c.Expr[Any](
// Add your own logic here, possibly using arguments on the annotation.
q"""
sealed trait $name
case class Foo(i: Int) extends $name
case class Bar(s: String) extends $name
case object Baz extends $name
"""
)
// Add validation and error handling here.
}
}
}
그리고:
scala> @expand trait MyADT
defined trait MyADT
defined class Foo
defined class Bar
defined module Baz
예를 들어 ADT 구현을 생성하는 데 사용할 수있는 외부 리소스를 구문 분석 할 수 있도록 컴파일 타임에 사용할 수있는 주석에 인수를 추가 할 수 있습니다.
매크로 주석은 매우 실험적이며 상태가 여전히 공중에 있습니다. 예를 들어 Scala 2.12와 함께 제공된다는 보장은 없습니다. 일반 def
매크로 및 구조 유형을 사용하여 유사한 (매우 깨끗하지는 않지만) 가능합니다 . 자세한 내용과 일부 데모는 위에 링크 된 예제 프로젝트를 참조하십시오 . 어쨌든 이러한 종류의 메커니즘은 Scala의 매크로 시스템 개발자를 포함하여 많은 사람들에게 흥미 롭습니다. 따라서 매크로 주석이 길의 어느 시점에서 사라지더라도 여기에서 설명한 것을 달성 할 수있는 방법이있을 것입니다. .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다