Scala 是否可以在宏包中展开给定给宏的ast?

Scala 是否可以在宏包中展开给定给宏的ast?,scala,scala-macros,Scala,Scala Macros,假设我有两个文件 package a; private[a] class A {} object Macro { def apply[T](t: T): T = macro apply_impl } 及 我很好奇这样的事情能不能成功?我认为Macro.apply将在呼叫站点进行扩展。。。但是,是否可以在程序包a中生成代码?您希望宏生成的代码能够访问在callsite中通常无法访问的程序包?是的。我希望能够生成无需反射即可访问私有包的代码。这是因为库中的糟糕决定,我对它将带来的维护负担感到欣

假设我有两个文件

package a;
private[a] class A {}
object Macro {
  def apply[T](t: T): T = macro apply_impl
}


我很好奇这样的事情能不能成功?我认为Macro.apply将在呼叫站点进行扩展。。。但是,是否可以在程序包a中生成代码?

您希望宏生成的代码能够访问在callsite中通常无法访问的程序包?是的。我希望能够生成无需反射即可访问私有包的代码。这是因为库中的糟糕决定,我对它将带来的维护负担感到欣慰。请注意,只有当两个包分别编译时,Macro.apply才会在调用站点进行扩展。这意味着新的A被卡在包b中,并且在编译完宏项目后无法返回到宏项目,因此我们必须考虑另一种方法。我看到您已将宏代码添加到包a中,这是否意味着您可以修改包,只要不破坏任何内容?实际使用情况是:我有一个依赖的库(spark)。许多有用的开发项目都标记为私有。所以我不能更改spark(当然,我可以通过必要的更改来修改我的本地版本,但希望尽量减少漂移)。我希望有一个项目能够解决这个问题,并在其他项目中使用它,但我可以改变以适应实施。该死,有趣的问题,但我没有好主意。你考虑过烫伤吗?我开玩笑,我开玩笑。为了避免反射,
A
必须在Spark的字节码中公开。如果Spark是本地构建的,最简单的方法似乎是
s/package[a]//g
。如果这太“焦土”,那么给
一个带有apply方法的
公共伙伴对象当然会起作用,但这似乎是一种痛苦。或者,我考虑在运行时修改字节码(就像你的问题一样,但要使用像javassist这样的字节码工程库),但是我们必须重新加载该类,然后我们必须重新使用反射。
package b;
object CallMacro {
  Macro(new A)
}