2013-08-29 52 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包含所有必要的信息,以恢復類型。

相關問題