斯卡拉 3 : Create Expr[ Int => Int ]

标签 scala scala-macros scala-3

我在一个项目中使用 Scala3 宏,但我一直在创建函数的 Expr(和 ToExpr)。

我有这样的东西:

case class Foo(f : Int => Int)

given ToExpr[Foo] with {
    def apply(foo : Foo) = foo match {
        case Foo(f) => '{Foo(???)} // <-- here
    }
}

我不知道如何用 Expr[Int => Int] 来替换上面的 ???


编辑:这是@GaelJ 的一些失败尝试

1)首先尝试

def apply(foo : Foo) = foo match {
  case Foo(f) =>
    val ff: Expr[Int => Int] = '{ (x: Int) => f.apply(x) }
    '{Foo($ff)}
}

给予:

|        val ff: Expr[Int => Int] = '{ (x: Int) => f.apply(x) }
|                                                  ^
|                             access to value f from wrong staging level:
|                              - the definition is at level 0,
|                              - but the access is at level 1.

2) 第二次尝试

def apply(foo : Foo) = foo match {
  case Foo(f) =>
    val ff: Expr[Int => Int] = '{ (x: Int) => ($f).apply(x) }
    '{Foo($ff)}
}

给予:

|        val ff: Expr[Int => Int] = '{ (x: Int) => ($f).apply(x) }
|                                                    ^
|                                              Found:    (f : Int => Int)
|                                              Required: quoted.Expr[Any]

最佳答案

这里是给定的“构建 block ”来构造新的ToExpr:scala3 docs ToExpr .据我所知,不可能为函数构造 ToExpr

关于斯卡拉 3 : Create Expr[ Int => Int ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67870834/

相关文章:

scala - 如何在编译时要求类型参数是特征(而不是类或其他类型值)?

scala - 在运行时将 Scala 3 代码从字符串解析为 Scala 3 AST

scala - 从 Any 到 Dynamic 的隐式转换

scala - scala:将match语句转换为模式匹配匿名函数-具有值

java - Joda Time : Formatting with multiple formats with single Formatter

scala 类成员宏实现

scala - 什么是 "polymorphism a la carte"以及我如何从中受益?

scala - 无法在宏生成的类中访问方法

scala - Scala 3 中的宏注释

scala - 为什么协变枚举的匹配行为与密封特征的行为不同?