gpt4 book ai didi

scala - "dynamically"使用宏创建案例类

转载 作者:行者123 更新时间:2023-12-03 21:30:03 25 4
gpt4 key购买 nike

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

我认为为某些指定的语法生成类型安全的 AST 会非常强大。理想情况下,IDE 能够解析所有类。

最佳答案

先来一些无耻的自我宣传:Eugene Burmako我在 type providers 上发表演讲,一个密切相关的主题,在 Scalar 2014明天,我鼓励你看看 the example project如果你对这种事情感兴趣,我们会聚在一起讨论。

虽然不再支持类型宏,但您可以使用 macro annotations 完成基本相同的事情。来自 macro paradise (可作为 Scala 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 可以实现类似的(虽然不是很干净)。宏和结构类型—见 the example project有关更多详细信息和一些演示,请在上面链接。无论如何,这种机制对很多人都很感兴趣,包括 Scala 宏系统的开发人员,因此即使宏注释在 future 的某个时刻消失了,也可能有某种方法来完成您在此处描述的内容.

关于scala - "dynamically"使用宏创建案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22850340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com