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

在中缀位置的Scala无类型宏

发布时间:2020-12-16 18:35:23 所属栏目:安全 来源:网络整理
导读:为了回应 this question,我一直在使用宏天堂分支在Scala中实现Haskell风格的“where”表达式.代码可在 scala-where获得.我现在可以编写如下内容: val result = where ( f1(1) * f2(2),{ def f1(x : Int) = x + 1 def f2(x : Int) = x + 2}) 但是,我真正想做
为了回应 this question,我一直在使用宏天堂分支在Scala中实现Haskell风格的“where”表达式.代码可在 scala-where获得.我现在可以编写如下内容:

val result = where ( f1(1) * f2(2),{
  def f1(x : Int) = x + 1
  def f2(x : Int) = x + 2
})

但是,我真正想做的是能够在中缀位置调用它:

val result = ( f1(1) * f2(2)) where {
  def f1(x : Int) = x + 1
  def f2(x : Int) = x + 2
}

通常情况下,这种事情很容易,但我看不到如何使用宏调用.表达式(f1(1)* f2(2))将不会在宏应用程序之前键入,因此构建隐式值类的操作不起作用.有没有办法获得这种语法呢?

如果做不到这一点,只需要两个参数列表即可:

val result = where (f1(1) * f2(2)) {
  def f1(x : Int) = x + 1
  def f2(x : Int) = x + 2
}

会很好,但这似乎很难.可以用两个参数列表调用一个宏吗?

解决方法

对于第一个选项:我认为你可以将隐式转换本身设为无类型宏,不是吗?

对于第二个选项:您可以使用多个参数列表调用宏,是的.呼叫站点上的多个列表将转换为定义站点上的多个列表,例如:

def myMacro(a: _)(b: _) = macro myMacro_impl

def myMacro_impl(c: Context)(a: c.Tree)(b: c.Tree): c.Tree = { ... }

将被称为:

myMacro(...)(...)

(编辑:李大同)

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

    推荐文章
      热点阅读