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

在Scala中匹配函数字面量和quasiquotes

发布时间:2020-12-16 09:48:04 所属栏目:安全 来源:网络整理
导读:这个问题是类似的动机我的 previous question(虽然它是一个问题,我在一个 different context遇到)。 我可以很容易地模式匹配函数字面量没有quasiquotes: import scala.reflect.macros.Contextimport scala.language.experimental.macrosobject QQExample {
这个问题是类似的动机我的 previous question(虽然它是一个问题,我在一个 different context遇到)。

我可以很容易地模式匹配函数字面量没有quasiquotes:

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

object QQExample {
  def funcDemo(f: Int => String) = macro funcDemo_impl
  def funcDemo_impl(c: Context)(f: c.Expr[Int => String]) = {
    import c.universe._

    f.tree match {
      case Function(ps,body) => List(ps,body) foreach println
      case _ => c.abort(
        c.enclosingPosition,"Must provide a function literal."
      )
    }

    c.literalUnit
  }
}

其工作原理如下:

scala> QQExample.funcDemo((a: Int) => a.toString)
List(val a: Int = _)
a.toString()

现在假设我想使用quasiquotes做同样的匹配更灵活。下面也将匹配该函数,并打印我们期望的。

case q"($x: $t) => $body" => List(x,t,body) foreach println

但是如果我想在模式中指定类型,它不匹配:

case q"($x: Int) => $body" => List(x,body) foreach println

并且没有以下甚至编译:

case q"$p => $body"      => List(p,body) foreach println
case q"($p) => $body"    => List(p,body) foreach println
case q"..$ps => $body"   => List(ps,body) foreach println
case q"(..$ps) => $body" => List(ps,body) foreach println

是否可以在与quasiquotes匹配的函数文本上指定参数的类型,或者在未知数量的参数上匹配?

解决方法

有了最新的天堂插件2.10和在香草2.11你可以这样做:

val q"(..$args) => $body" = f.tree

我刚刚测试了它与paradise example project与以下Macros.scala:

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

object Macro {
  def apply(f: Any): Any = macro impl
  def impl(c: Context)(f: c.Expr[Any]) = { import c.universe._
    val q"(..$args) => $body" = f.tree
    println(s"args = $args,body = $body")
    c.Expr(q"()")
  }
}

和Test.scala:

object Test extends App {
  Macro((x: Int) => x + 1)
}

您可以阅读更多关于在corresponding chapter of quasiquote guide中处理quasiquotes的函数树。

(编辑:李大同)

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

    推荐文章
      热点阅读