使用scala宏注释在同一级别创建类型和方法定义

时间:2015-11-11 19:52:32

标签: scala-macros

我创建了一个宏注释,与另一个宏一起使用,将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

感谢任何指针。 塞德里克

0 个答案:

没有答案