1

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

4

1 回答 1

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

被转换成这样的东西

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

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

于 2013-08-30T12:46:14.323 回答