我创建了一个宏注释,与另一个宏一起使用,将case类转换为带有动态类型方法调度的记录。
https://github.com/DeliteEPFL/virtualization-lms-core/blob/macrovirt/src/common/RecordsAnnot.scala
trait T {
@mRecord
case class Region(key: Int)
}
将转变为
trait T {
type Region = Record {
val r_regionkey: Rep[Int]
}
def Region(key: Rep[Int], name: Rep[String], comment: Rep[String]): Rep[Region] =
Record (r_regionkey = key) //another macro, but does not really matter
}
问题在于,这些是两个定义,必须放在一个我没有设法做到的地方。当你这样做时:
q"$typedef ; $metdef"
你最终得到一个Block()
因此定义是本地的,我现在做的解决方法是:
q"object O {$typedef ; $metdef}"
然后
@mRecord
case class Region(key: Int)
import O._
这不是最干净的,因为您需要唯一的对象名称,IDE会将O._
突出显示为不存在和其他问题。
拼接只有在您知道周围的上下文时才有效,而宏观注释则不然...
val body = q"$typedef ; $metdef"
q"""trait T { $body }""" //created a block inside the body
q"""trait T { ..$body }""" //this will lift the block and add the defintions to the body directly
感谢任何指针。 塞德里克