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

时间:2013-08-29 16:06:31

标签: scala scala-macros scala-quasiquotes

没有深入研究DSL的细节,我可以写(based on that example):

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))

需要注意的是, x y 都包含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 param没有明确的类型。我需要那个来调用这个函数。我应该在哪里买到它?解决方案“只是将任意类型的参数传递给函数”将不满足 scalac ,因为它需要 Int

此问题在逻辑上遵循that one

代码位于parboled2@gihub

1 个答案:

答案 0 :(得分:1)

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

转换为类似的东西

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

pimpActionOpapply的类型类包含恢复类型的所有必要信息。