没有深入研究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。
答案 0 :(得分:1)
Number ~> ((_:Int) + _)
转换为类似的东西
pimpActionOp[...](rule).~>.apply[...](function)
pimpActionOp
和apply
的类型类包含恢复类型的所有必要信息。