scala – 用于在运行时访问源代码文本的宏
发布时间:2020-12-16 09:25:37 所属栏目:安全 来源:网络整理
导读:是否已经或者是否可以使用Scala宏来访问源文本?例如,我想写这样的代码: val list = List(1,2,3)val (text,sum) = (list.sum).withSource{(source,sum) = (source,sum)}// would return ("list.sum",6)(list.sum).withSource{(source,sum) = println(s"$sou
是否已经或者是否可以使用Scala宏来访问源文本?例如,我想写这样的代码:
val list = List(1,2,3) val (text,sum) = (list.sum).withSource{(source,sum) => (source,sum)} // would return ("list.sum",6) (list.sum).withSource{(source,sum) => println(s"$source: $sum"} // prints list.sum: 6 解决方法
你真的想要一个源代码或Tree就够了吗?
对于Tree,您可以使用Context的前缀,如下所示: import scala.language.experimental.macros import reflect.macros.Context implicit class WithSourceHelper[T](source: T) { def withSource[R](f: (String,T) => R): R = macro withSourceImpl[T,R] } def withSourceImpl[T,R](c: Context)(f: c.Expr[(String,T) => R]): c.Expr[R] = { import c.universe.{reify,Apply} val source = c.prefix.tree match { case Apply(_,List(s)) => s case _ => c.abort(c.enclosingPosition,"can't find source") } reify{ f.splice.apply(c.literal(source.toString).splice,c.Expr[T](source).splice) } } 用法: scala> val (x,y) = (1,2) x: Int = 1 y: Int = 2 scala> {x + y}.withSource{ (s,r) => s"$s = $r" } res15: String = x.+(y) = 3 scala> val list = List(1,3) list: List[Int] = List(1,3) scala> val (text,sum)} text: String = list.sum[Int](math.this.Numeric.IntIsIntegral) sum: Int = 6 scala> (list.sum).withSource{(source,sum) => println(s"$source: $sum")} $line38.$read.$iw.$iw.$iw.list.sum[Int](math.this.Numeric.IntIsIntegral): 6 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |