scala – “动态”使用宏创建案例类

我想创建一个宏生成层次结构的密封抽象和案例类.有一个类似于http://docs.scala-lang.org/overviews/macros/typemacros.html的例子,但现在已经过时了.这还有可能吗?

我认为为一些指定的语法生成一个类型安全的AST将是非常强大的.理想情况下,IDE能够解决所有类.

首先对于一些无耻的自我推销:Eugene Burmako和我在type providers(一个密切相关的话题)上发表演讲,明天07:00,我鼓励你看看the example project,如果你对这个感兴趣之类的事情.

虽然不再支持类型宏,但您可以从macro paradise(可作为Scala 2.10和2.11的插件提供)中实现与macro annotations基本相同的功能:

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宏和结构类型 – 参见the example project以上链接更多的细节和一些示范.无论如何,这种机制对许多人来说是有兴趣的,包括Scala的宏观系统的开发人员,所以即使宏指令在某个时候消失,很可能有一些方法来完成你在这里描述的内容.

翻译自:https://stackoverflow.com/questions/22850340/dynamically-creating-case-classes-with-macros

转载注明原文:scala – “动态”使用宏创建案例类