Scala宏:定义顶级对象

时间:2013-06-26 17:26:37

标签: scala scala-macros

我看了type macros scala。但是,当我想从示例中创建对象时,我得到了错误:

Example.scala:7: `=', `>:', or `<:' expected
type Test(url: String) = macro impl

Example.scala:12: illegal start of simple expression
val clazz = ClassDef(..., Template(..., generateCode()))

代码:

//Example.sbt
object Example {

  type Test(url: String) = macro impl

  def impl(c:Context)(url: c.Expr[String]):c.Tree = {
    import c.universe._
    val name = c.freshName(c.enclosingImpl.name).toTypeName
    val clazz = ClassDef(..., Template(..., generateCode()))
    c.introduceTopLevel(c.enclosingPackage.pid.toString, clazz)
    val classRef = Select(c.enclosingPackage.pid, name)
    Apply(classRef, List(Literal(Constant(c.eval(url)))))
  }
} 

Scala版本:2.10.2

来自:type macros

1 个答案:

答案 0 :(得分:3)

如果只是那么容易!从the documentation链接到:

  

类型宏是所谓的宏中包含的预发布功能   天堂,官方Scala存储库中的实验分支。   按照“Macro Paradise”页面上的说明下载和   使用我们的夜间构建。

  

请注意,由于二进制兼容性限制,宏   2.10.x的天堂不包括宏观天堂的任何特征   2.11.x除了quasiquotes。

如果你想让它发挥作用,你将不得不转移到Macro Paradise分支2.11。

另请注意,类型宏文档中的...旨在表示省略的代码 - 您不能只复制和粘贴代码。