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]。
我不确定我完全理解你在问什么,但是你有没有尝试用'c.typeCheck'来检查树(或者只是那部分)? –
@TravisBrown我试了一下。我不确定我是否正确使用它。如果只是'c.typeCheck(tree))'其中'tree'是包含下划线lambda的Scala AST,那么这没有帮助。 'println(s“$ {showRaw(c.typeCheck(tree))}”)'显示我没有'x $ 2'类型。 我可以通过'macros.Context'获得某种特定的函数的参数类型吗? –
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) ($()()()()()()()() –