gpt4 book ai didi

scala - 宏 : path dependent type inference confusion

转载 作者:行者123 更新时间:2023-12-01 09:04:03 24 4
gpt4 key购买 nike

我试图简化 AST 的创建,但收到一条奇怪的错误消息:

case class Box(i: Int)
object M {
import language.experimental.macros
import scala.reflect.makro.Context
case class meth(obj: String, method: String)(implicit val c: Context) {
import c.universe._

def apply(xs: Tree*) =
Apply(Select(Ident(obj), newTermName(method)), xs.toList)
}

def box(n: Int): Box = macro boxImpl

def boxImpl(c: Context)(n: c.Expr[Int]): c.Expr[Box] = {
import c.universe._
implicit val cc: c.type = c
n.tree match {
case arg @ Literal(Constant(_)) =>
meth("Box", "apply").apply(arg)
}
}
}

错误:

<console>:26: error: type mismatch;
found : c.universe.Literal
required: _2.c.universe.Tree where val _2: M.meth
possible cause: missing arguments for method or constructor
meth("Box", "apply").apply(arg)
^

是否可以将正确的类型推断到类 meth 中?或者是否有解决该问题的方法?

编辑:根据@retronyms 的回答,我得到了这个工作:

object M {
import language.experimental.macros
import scala.reflect.makro.Context

def meth(implicit c: Context) = new Meth[c.type](c)

class Meth[C <: Context](val c: C) {
import c.universe._

def apply(obj: String, method: String, xs: Tree*) =
Apply(Select(Ident(obj), newTermName(method)), xs.toList)
}

def box(n: Int): Box = macro boxImpl

def boxImpl(c: Context)(n: c.Expr[Int]): c.Expr[Box] = {
import c.universe._
implicit val cc: c.type = c
n.tree match {
case arg @ Literal(Constant(_)) =>
c.Expr(meth.apply("Box", "apply", arg))
}
}
}

最佳答案

目前不允许构造函数具有依赖方法类型 (SI-5712)。它正在被修复,希望是 2.10.1 或 2.11。

在此期间,您可以关注 the pattern I used in macrocosm在宏实现中重用代码。

关于scala - 宏 : path dependent type inference confusion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11612198/

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