在Scala中编写宏时,Quasiquotes简化了许多操作.但是我注意到,每次触发SBT中的编译时都可以重新编译包含quasiquotes的宏,即使宏实现和任何调用站点都没有更改并且需要重新编译.
这似乎不会发生,如果quasiquotes中的代码相当简单,它似乎只有在依赖于另一个类时才会发生.我注意到用"reify"重写所有内容似乎解决了重新编译的问题,但我没有设法在没有quasiquotes的情况下重写最后一部分...
我的宏通过在编译期间创建包装函数来避免启动时的反射.
我有以下课程:
object ExportedFunction {
def apply[R: Manifest](f: Function0[R], fd: FunctionDescription): ExportedExcelFunction = new ExcelFunction0[R] {
def apply: R = f()
val functionDescription = fd
}
def apply[T1: Manifest, R: Manifest](f: Function1[T1, R], fd: FunctionDescription): ExportedExcelFunction = new ExcelFunction1[T1, R] {
def apply(t1: T1): R = f(t1)
val functionDescription = fd
}
... and so on... until Function17...
}
Run Code Online (Sandbox Code Playgroud)
然后,我object使用所描述的接口分析和导出任何成员函数,如下所示:
def export(registrar: FunctionRegistrar,
root: Object,
<...more args...>) = macro exportImpl
def exportImpl(c: Context)(registrar: c.Expr[FunctionRegistrar],
root: c.Expr[Object], …Run Code Online (Sandbox Code Playgroud)