2

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

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)))))
  }
} 

斯卡拉版本:2.10.2

来自:类型宏

4

1 回答 1

3

如果真那么容易就好了!从您链接到的文档中:

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

和:

请注意,由于二进制兼容性限制,2.10.x 的宏天堂不包括宏天堂 2.11.x 的任何功能,除了准引号。

所以如果你想让它工作,你将不得不搬到 2.11 的Macro Paradise分支。

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

于 2013-06-26T18:10:09.083 回答