加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读