如何在Scala AST中获取带下划线的lambda函数参数的类型



不深入了解DSL的细节,我可以写(基于该示例):

def InputLine = rule { Number ~ zeroOrMore("+" ~ Number ~> ((x: Int, y: Int) => x + y)) ~ EOI }

我需要从宏调用lambda函数。它的Scala AST表示如下:

List(
   ValDef(Modifiers(PARAM), newTermName("x"), TypeTree().setOriginal(Select(Ident(scala), scala.Int)), EmptyTree), 
   ValDef(Modifiers(PARAM), newTermName("y"), TypeTree().setOriginal(Select(Ident(scala), scala.Int)), EmptyTree))

需要注意的是,xy都有AST类型。这很好用。

下一步是使用类型推断,并将lambda简化如下:

def InputLine = rule { Number ~ zeroOrMore("+" ~ Number ~> ((_:Int) + _)) ~ EOI }

lambda的Scala AST:

List(
    ValDef(Modifiers(PARAM | SYNTHETIC), newTermName("x$1"), TypeTree().setOriginal(Select(Ident(scala), scala.Int)), EmptyTree), 
    ValDef(Modifiers(PARAM | SYNTHETIC), newTermName("x$2"), TypeTree(), EmptyTree))

请注意,x$2参数没有显式类型。我需要它来调用函数。我应该在哪里拿到它?解决方案"只将Any类型的参数传递给函数"将不满足scalac,因为它需要Int

这个问题后面是那个问题。

代码可在parboled2@gihub.

Number ~> ((_:Int) + _)

转化为类似的东西

pimpActionOp[...](rule).~>.apply[...](function)

CCD_ 1和CCD_。

相关内容

  • 没有找到相关文章

最新更新