标签: scala-macros

Scala 3 宏中的“tq”等效项

使用 Scala2,我可以实现宏并使用tq准引用语法生成类型,例如:

q"""        
new Foo {
  type Bar = ${tq"(..$params)"}
}
"""
Run Code Online (Sandbox Code Playgroud)

我可以用这种语法做两件事 -

  1. 能够Bar基于params.
  2. 能够将 作为元组传播params

如何使用 Scala 3 实现这一目标?

scala scala-macros scala-quasiquotes scala-3

1
推荐指数
1
解决办法
293
查看次数

使用 Scala 反射获取构造函数参数值

在带有 Scala 的代码库中工作,它希望您为某些类定义一种“制作新版本” - 例如,如果您有一个类 x(a :int, b:String, c:double).. . 它会有这样的功能:

class x( a: Integer, b : String, c : Double) extends CanMakeNew
{
    def newValue() = x( a, b, c)
}
Run Code Online (Sandbox Code Playgroud)

我无法控制它 - 但不想每次都实现它。或者,嗯……永远。在 Scala 中有一种方法可以通过反射来迭代构造函数参数值吗?我可以使用反射来查看参数类型- 但由于该模块的参数名称尚未打开,我无法打开它 - 我无法将这些与类中存储的值相关联。从根本上说,我正在寻找实现以下特征的方法:

trait CanMakeNewDoneForMe extends CanMakeNew {
    def newValue()  {I need the code that goes here}
Run Code Online (Sandbox Code Playgroud)

那么scala反射有没有办法检查构造函数或检查对象并看到“啊,这是构造函数中的第三个参数”?

reflection scala scala-macros scala-reflect

0
推荐指数
1
解决办法
477
查看次数

Def 宏,从一个值传递参数

我有一个工作宏,即:

object Main extends App {

  println("Testing assert macro...")
  val result = Asserts.assert(false, "abc")

}
Run Code Online (Sandbox Code Playgroud)

import scala.reflect.macros.blackbox.Context
import scala.language.experimental.macros

object Asserts {
  val assertionsEnabled: Boolean = true

  def assert(cond: Boolean, msg: String): Unit = macro assertImpl

  def assertImpl(c: Context)(cond: c.Expr[Boolean], msg: c.Expr[String]) : c.Expr[Unit] = {
    import c.universe._
    cond.tree match {
      case Literal(Constant(cond: Boolean)) =>
        if (!cond) c.abort(c.enclosingPosition, "Fix the code, whatever.") else c.Expr(q"()")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但问题是:我怎样才能做到这一点?:

  val cond: Boolean = false
  val result = Asserts.assert(cond, "abc")
Run Code Online (Sandbox Code Playgroud)

现在我有一个错误: …

scala scala-macros

0
推荐指数
1
解决办法
106
查看次数

获取作为类型参数传递的文字类型的值

我正在尝试编写一个宏,它返回作为类型参数传递的文字类型的值,如果参数不是文字类型,则无法编译。这里有些例子:

def literalValue[SC <: String] = //...

literalValue["AB"] // returns "AB"
literalValue["C"] // returns "C"
literalValue[String] // compile error
Run Code Online (Sandbox Code Playgroud)

所以我从常规的宏样板开始,遇到了以下问题:

def implStringLiteral[SC <: String: c.WeakTypeTag](c: blackbox.Context): c.Expr[SC] = {
  import c.universe._
  val symbol = weakTypeOf[SC].typeSymbol //It is String
  //...
}
Run Code Online (Sandbox Code Playgroud)

看起来文字类型本身是作为常规传递的String,因此无法通过其 获得精确的类型信息WeakTypeTag

有什么解决方法可以解决这个问题吗?

scala metaprogramming scala-macros

0
推荐指数
1
解决办法
295
查看次数