不深入了解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))
需要注意的是,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参数没有显式类型。我需要它来调用函数。我应该在哪里拿到它?解决方案"只将Any类型的参数传递给函数"将不满足scalac,因为它需要Int。
这个问题后面是那个问题。
代码可在parboled2@gihub.
Number ~> ((_:Int) + _)
转化为类似的东西
pimpActionOp[...](rule).~>.apply[...](function)
CCD_ 1和CCD_。