gpt4 book ai didi

scala - 避免使用准引号重新编译

转载 作者:行者123 更新时间:2023-12-01 10:50:10 25 4
gpt4 key购买 nike

在 Scala 中编写宏时,Quasiquotes 简化了很多事情。但是我注意到,每次触发 SBT 中的编译时,都可以重新编译包含准引号的宏,即使宏实现及其任何调用站点都没有更改并且需要重新编译。

这似乎不会发生,如果 quasiquotes 中的代码相当简单,它似乎只有在依赖于另一个类时才会发生。我注意到用“reify”重写所有内容似乎可以解决重新编译问题,但我无法在没有准引号的情况下重写最后一部分...

我的宏通过在编译期间创建包装函数来避免启动时的反射。

我有以下类(class):

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

然后我分析一个对象并使用描述的接口(interface)导出任何成员函数,如下所示:

def export(registrar: FunctionRegistrar,
root: Object,
<...more args...>) = macro exportImpl

def exportImpl(c: Context)(registrar: c.Expr[FunctionRegistrar],
root: c.Expr[Object],
<...>): c.Expr[Any] = {

import c.universe._

<... the following is simplified ...>
root.typeSignature.members.flatMap {
case x if x.isMethod =>
val method = x.asMethod

val callee = c.Expr(method))

val desc = q"""FunctionDescription(<...result from reflective lookup...>)"""
val export = q"ExportedFunction($callee _, $desc)"
q"$registrar.+=({$export})"

我可以用 reify 重写第一行和最后一行,但我无法重写第二行,我最好的办法是使用准引号:

val export = reify {
...
ExportedFunction(c.Expr(q"""$callee _"""), desc)
...
}.tree

但这会导致:

overloaded method value apply with alternatives... cannot be applied to (c.Expr[Nothing], c.universe.Expr[FunctionDescription])

我认为编译器缺少隐式函数,或者这段代码可能只适用于具有固定数量参数的函数,因为它需要在宏编译时知道该方法有多少参数?但是,如果所有内容都使用准引号编写,它就可以工作...

最佳答案

根据对 SBT 问题的描述,我可以假设您正在使用 2.10.x 的宏天堂并且面临 https://github.com/scalamacros/paradise/issues/11 .我计划在本周解决这个问题,所以修复应该很快就会到来。同时,您可以使用问题页面上描述的解决方法。

关于reify问题,并不是所有的quasiquotes都可以用reify重写。诸如您在此处遇到的限制是将我们的注意力转移到 Scala 2.11 中的准引号的强大动力。

关于scala - 避免使用准引号重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21260909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com