不挖掘 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 获得。