如何使用scala宏打印变量名和值?

如何使用scala宏打印变量名和值?,scala,scala-macros,Scala,Scala Macros,我相信有一种更优雅的方式来编写以下宏,它打印变量的名称和值: def mprintx(c: Context)(linecode: c.Expr[Any]): c.Expr[Unit] = { import c.universe._ val namez = (c.enclosingImpl match { case ClassDef(mods, name, tparams, impl) => c.universe.reify(c.li

我相信有一种更优雅的方式来编写以下宏,它打印变量的名称和值:

def mprintx(c: Context)(linecode: c.Expr[Any]): c.Expr[Unit] = {
    import c.universe._

    val namez = (c.enclosingImpl match {
        case ClassDef(mods, name, tparams, impl) =>
            c.universe.reify(c.literal(name.toString).splice)
        case ModuleDef(mods, name, impl) =>
            c.universe.reify(c.literal(name.toString).splice)
        case _ => c.abort(c.enclosingPosition, "NoEnclosingClass")
    }).toString match {
        case r_name(n) => n
        case _         => "Unknown?"
    }

    val msg = linecode.tree.productIterator.toList.last.toString.replaceAll("scala.*\\]", "").replaceAll(namez+"\\.this\\.", "").replaceAll("List", "")
    reify(myPrintDln(c.Expr[String](Literal(Constant(msg))).splice+" ---> "+linecode.splice))
}

def myPrintIt(linecode: Any) = macro mprintx
由以下程序调用:

object Zabi2 extends App {
val l = "zab"
val kol = 345
var zub = List("2", 89)
val zubi = List(zub,l,kol)

printIt(l)
printIt(l, kol, (l, zub),zubi)
}
其中打印:

l ---> zab
(l, kol, (l, zub), zubi) ---> (zab,345,(zab,List(2, 89)),List(List(2, 89), zab, 345))

提前感谢您的帮助。

这里有一个用于打印表达式及其值的宏:

包mymacro
仅导入scala.annotation.compileTimeOnly
导入scala.language.experimental.macros
导入scala.reflect.macros.whitebox
@compileTimeOnly(“调试打印仅在编译时可用”)
类DebugPrint(val c:whitebox.Context){
导入c.universe_
def impl(args:c.Expr[Any]*):c.Tree={
val sep=“,”
val colon=“=”
val trees=args.map(expr=>expr.tree).toList
val ctxInfo=s“${c.internal.enclosuringowner.fullName}:${c.enclosuringposition.line}:”
val treeLits=trees.zipWithIndex.map{
大小写(树,i)=>Literal(常量((如果(i!=0)sep else ctxInfo)+树+冒号))
}
q”“”
System.err.println(StringContext(..$treeLits,“”).s(..$trees))
"""
}
}
@compileTimeOnly(“调试打印仅在编译时可用”)
对象调试打印{
def apply(args:Any*):Any=macro DebugPrint.impl
}
例如:

package myapp

import mymacro.DebugPrint

case class Person(name: String, age: Int)

object Main extends App {
  val x = 5
  val y = "example"
  val person = Person("Derp", 20)

  DebugPrint(x, y, person, person.name, person.age)

  def func()  = {
    val x = 5
    val y = "example"
    val person = Person("Derp", 20)
    DebugPrint(x, y, person, person.name, person.age)
  }

  func()
}
输出:

myapp.Main.<local Main>:12: Main.this.x=5, Main.this.y=example, Main.this.person=Person(Derp,20), Main.this.person.name=Derp, Main.this.person.age=20
myapp.Main.func:18: x=5, y=example, person=Person(Derp,20), person.name=Derp, person.age=20
myapp.Main.:12:Main.this.x=5,Main.this.y=example,Main.this.person=person(Derp,20),Main.this.person.name=Derp,Main.this.person.age=20
myapp.Main.func:18:x=5,y=example,person=person(Derp,20),person.name=Derp,person.age=20

scala 2.12.12可以很好地使用。

您是否找到一个已经实现此功能的库?