我想知道是否有可能在Scala 3中编写一个宏,该宏接受一组字符串并将其转换为枚举类型,并以这些字符串为例?
例如,我想编写一个具有从输入元素生成的内部类型的类:
import scala.quoted.*
class Example(myEnumElements:Seq[String]) {
inline def buildEnum(inline elts:Seq[String]): Unit = ${ buildEnumType('elts) }
def buildEnumType(e: Expr[Seq[String]])(using Quotes, Type[Seq]): Expr[Unit] = '{
enum MyEnum:
???
}
}
...
// Possibly in another file?
val example = Example(Seq("A","B","C"))
def someConvenienceFunction(e:example.MyEnum) = e match
case A => "apple"
case B => "banana"
case C => "cranberry"
...
// Possibly in another file?
someConvenienceFunction(example.A) // "apple"
someConvenienceFunction(example.D) // compile error发布于 2021-09-25 19:40:54
Scala 3宏目前仅为def宏。它们不用于生成类、枚举等。即使在buildEnumType中定义枚举,也只能在buildEnum调用扩展到的块{...}中看到。
尝试使用代码生成代替。
How to generate a class in Dotty with macro?
https://users.scala-lang.org/t/macro-annotations-replacement-in-scala-3/7374
How to create variables with macros in Scala (Scala 2)
Resolving variables in scope modified by Scala macro (Scala 2)
https://stackoverflow.com/questions/69227772
复制相似问题