我想编写一个将案例类的实例作为参数的 Scala 宏。可以传递给宏的所有对象都必须实现特定的标记特征。
以下片段显示了标记特征和实现它的两个示例案例类:
trait Domain
case class Country( id: String, name: String ) extends Domain
case class Town( id: String, longitude: Double, latitude: Double ) extends Domain
现在,我想使用宏编写以下代码,以避免运行时反射的繁重及其线程不安全:
object Test extends App {
// instantiate example domain object
val myCountry = Country( "CH", "Switzerland" )
// this is a macro call
logDomain( myCountry )
}
该宏logDomain
在不同的项目中实现,类似于:
object Macros {
def logDomain( domain: Domain ): Unit = macro logDomainMacroImpl
def logDomainMacroImpl( c: Context )( domain: c.Expr[Domain] ): c.Expr[Unit] = {
// Here I would like to introspect the argument object but do not know how?
// I would like to generate code that prints out all val's with their values
}
}
宏的目的应该是生成代码 - 在运行时 - 输出给定对象的所有值 (id
和) 并打印它们,如下所示:name
id (String) : CH
name (String) : Switzerland
为此,我必须动态检查传递的类型参数并确定其成员(vals)。然后我必须生成一个代表创建日志输出的代码的 AST。无论将实现标记特征“域”的特定对象传递给宏,宏都应该工作。
在这一点上,我迷路了。如果有人能给我一个起点或指向我一些文档,我将不胜感激?我对 Scala 比较陌生,在 Scala API 文档或宏指南中没有找到解决方案。