scala - 是否可以推迟宏扩展,直到抽象类型绑定(bind)到特定类型

标签 scala reflection macros

我可能使用了不正确的术语,但这里是我想要实现的示例。可以说我有以下宏:

def generateField[T]: AnyRef =
  macro generateFieldImpl[T]

def generateFieldImpl[T: c.AbsTypeTag](c: Context): c.Expr[AnyRef] = {
/**
 * here I'm looking at the type T by reflection to see now many members it has
 * and based on that I'm generating TupleN[Array[Byte], ...](null, ...)
 * where N is number of members in class represented by type T
 */
}

我打算只使用案例类作为 T。

当我将此宏与案例类一起使用时,效果很好,但现在我想添加一个抽象级别:
trait WithGeneratedField[T] {
  val _myField = generateField[T]
}

我遇到的问题是宏在声明特征时被扩展,此时 T 被称为抽象类型“T”。有什么方法可以推迟宏扩展,直到我将这个特性与具体的东西混合在一起?例如:
case class MyClass(a: String, b: Int) extends WithGeneratedField[MyClass]

最后,我的目标是使用宏将生成的字段添加到案例类中。也许有更好的方法来做到这一点?

最佳答案

如果这在 2.10.0 中成为可能,我会感到惊讶。

使用宏类型或宏注释( http://scalamacros.org/future.html )应该非常简单。我们将在发布 2.10.0-final 后立即着手处理这些新的宏风格,但很难预测 ETA。也许是 2012 年的冬天 - 2013 年的 Spring 。

关于scala - 是否可以推迟宏扩展,直到抽象类型绑定(bind)到特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165283/

相关文章:

macros - 如何匹配 Rust 宏中表达式的类型?

java - 我能从调试器信息中得到什么,而我不能通过反射得到?

function - 反射性地引用重载的顶级 Kotlin 函数

scala - 在求和结束时得到总数

scala - 为什么在某些情况下会忽略高阶隐式?

c# - 测试期间无法从 rhino 模拟界面检索 MethodInfo

Vim 说 "Not an editor command:..."

VBA Excel 2010 - 如何将宏分配给使用宏创建的命令按钮

scala - 如何使 SBT 不截断其输出?

java - 反射获取特定类中带注释的所有方法