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) ($()()()()()()()() –