복붙노트

[SCALA] "동적"매크로의 경우 클래스를 생성

SCALA

"동적"매크로의 경우 클래스를 생성

나는 밀봉 추상적이고 경우 클래스의 매크로 생성 된 계층 구조를 만들고 싶습니다. 이 http://docs.scala-lang.org/overviews/macros/typemacros.html이 유사한 예는했지만 이제 사용되지이다. 이것이 가능 아직인가?

나는 어떤 특정 문법 유형 안전 AST를 생성 할 매우 강력한 것 같아요. 이상적으로 모든 클래스를 해결할 수는 IDE와.

해결법

  1. ==============================

    1.일부 뻔뻔한 자기 홍보를위한 첫 번째 : 유진 Burmako 그리고 2014 년 내일 스칼라에서 입력 제공, 밀접하게 관련 주제에 대한 이야기를주고있다, 그리고 나는 우리가 당신이 경우 대화를 위해 함께 넣어 예제 프로젝트를 살펴 보시기 바랍니다 '은 이런 종류의 일에 관심이.

    일부 뻔뻔한 자기 홍보를위한 첫 번째 : 유진 Burmako 그리고 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의 구현을 생성하는 데 사용할 수있는 외부 리소스를 구문 분석 할 수 있도록, 컴파일시에 사용할 수 있습니다 주석에 인수를 추가 할 수 있습니다.

    매크로 주석이 매우 실험하고 자신의 상태가 최대에 아직 공기가 그들이 예를 들어, 스칼라 2.12와 함께 제공됩니다된다는 보장은 없습니다. (비록 꽤 깨끗하지 않은) 평범한 구식 데프 매크로 및 구조 사용 가능하다 비슷한 자세한 내용과 일부 시위에 대한 위의 링크 된 예제 프로젝트를 유형을-참조하십시오. 어떤 경우, 장치의이 종류는 너무 매크로 주석이 길 아래에 어떤 시점에서 사라하더라도, 당신은 여기에 기술 한 내용을 달성 할 수있는 방법이 될 가능성이있어, 스칼라의 매크로 시스템의 개발을 포함하여 많은 사람들의 관심입니다 .

  2. from https://stackoverflow.com/questions/22850340/dynamically-creating-case-classes-with-macros by cc-by-sa and MIT license