gpt4 book ai didi

scala - 是否可以使用 scala 宏来构造类型?

转载 作者:行者123 更新时间:2023-12-02 01:45:18 25 4
gpt4 key购买 nike

我知道可以在生成的函数内部构造类型,但是否可以在外部返回它们?

我需要一个生成 Parser[T] 的宏——其中 parser 和 T 都是从外部语法构造的,用简化的语法描述语言为图书馆用户编写。 T 是经过解析的 AST,其中包含相互嵌套的案例类。这些案例类应该生成并在外部可见。

语法:

RootType {
member1: {
member11: TypeB
member12: String
member13: TypeB
}
member2: String
TypeB {
member3: String
}
}

使用:

//Somewhere in my library:
trait ASTNode
def parser: Parser[ASTNode] = macro ... //interpret types from grammar-file

//On the client side:
val input = ... //reads unparsed string from some script-file
val parsed = parse(parser, input)
parsed.member1.member11.member3 //so ASTNode should be replaced with RootType
//case class TypeB and synthetic case class for member1 should be also generated

我正在考虑解决方案:

  • 黑盒宏(如何定义可以在生成函数之外使用的类型?)
  • 解决方法:从我的语法生成成员的宏注释类型(我不知道我有多少类型,所以我需要通过注释生成子类,这可能吗?)
  • 编写编译器插件或单独的 sbt-task 或查看 macroparadise
  • 在运行时生成类不是一个选项,因为我需要检查类型

最佳答案

是的,这是可能的。您可以毫无问题地生成包括 ClassDefModuleDef 等在内的 AST,并且如果您使用宏注释(来自 macro-paradise),它们将对外部代码可见(在一个普通的 def 宏,比如你想要的代码中的 parser 它们是本地的)。请参阅 http://docs.scala-lang.org/overviews/macros/typeproviders.html 中的“公共(public)类型提供商”和 https://github.com/travisbrown/type-provider-examples .您的库代码看起来会略有不同:

@Grammar("path/to/file") trait ASTNode // reads grammar, and generates subclasses, parser, etc.

关于scala - 是否可以使用 scala 宏来构造类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26007855/

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