gpt4 book ai didi

中缀位置的Scala无类型宏

转载 作者:行者123 更新时间:2023-12-04 17:22:07 25 4
gpt4 key购买 nike

回复 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(...)(...)

关于中缀位置的Scala无类型宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15253608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com