2013-08-29 51 views
1

在DSL的细节不挖,我可以写(based on that example):如何获得强调lambda函数参数的Scala AST类型?

def InputLine = rule { Number ~ zeroOrMore("+" ~ Number ~> ((x: Int, y: Int) => x + y)) ~ EOI } 

我需要从宏观调用lambda函数。它斯卡拉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ÿ在AST类型。这工作正常。

下一步是使用类型推断,并简化拉姆达如下:

def InputLine = rule { Number ~ zeroOrMore("+" ~ Number ~> ((_:Int) + _)) ~ EOI } 

斯卡拉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。代码[email protected]

+0

我不确定我完全理解你在问什么,但是你有没有尝试用'c.typeCheck'来检查树(或者只是那部分)? –

+0

@TravisBrown我试了一下。我不确定我是否正确使用它。如果只是'c.typeCheck(tree))'其中'tree'是包含下划线lambda的Scala AST,那么这没有帮助。 'println(s“$ {showRaw(c.typeCheck(tree))}”)'显示我没有'x $ 2'类型。 我可以通过'macros.Context'获得某种特定的函数的参数类型吗? –

+0

I.e. (ValDef(修饰符(PARAM | SYNTHETIC),newTermName(“x $ 1”),TypeTree()。​​setOriginal(Select(Ident(scala),scala.Int)),EmptyTree),ValDef (选择(标识符合成),newTermName(“x $ 2”),TypeTree(),EmptyTree)),Apply(选择(类型(Ident(newTermName(“x $ 1”)),TypeTree()。​​setOriginal (函数)调用'c.inferTypes(function)'调用'c.inferTypes(function)'调用'c.inferTypes(function)'调用'c.inferTypes(function)'调用'c.inferTypes(function) ($()()()()()()()() –

回答

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

转化为这样的事情

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

pimpActionOp型类和apply包含所有必要的信息,以恢复类型。

相关问题