我試圖以二進制方式解釋作爲字符串給出的代碼。 如:動態地解析一個字符串並使用反射和解釋器在scala中返回一個函數
val myString = "def f(x:Int):Int=x+1".
進出口尋找,將返回真正的功能在它外面的方法: 如:
val myIncrementFunction = myDarkMagicFunctionThatWillBuildMyFunction(myString)
println(myIncrementFunction(3))
將打印4
使用案例:我想用一些稍後在我的代碼中解釋代碼的簡單函數。例如,他們可以提供類似def fun(x:Int)的東西:Int = x + 1作爲字符串,然後我使用解釋器來編譯/執行代碼,然後我希望能夠使用這個fun(x )例如在地圖中。
問題是這個函數類型對我來說是未知的,這是一個很大的問題,因爲我需要從IMain退回。 我已經閱讀了關於反射,類型系統等的內容,並且經過一些Google搜索之後,我達到了這一點。我也檢查了twitter的util-eval,但是我不能從他們的測試中的文檔和示例中看到太多,這是非常相同的事情。
如果我知道我可以這樣做
val settings = new Settings
val imain = new IMain(settings)
val res = imain.interpret("def f(x:Int):Int=x+1; val ret=f _ ")
val myF = imain.valueOfTerm("ret").get.asInstanceOf[Function[Int,Int]]
println(myF(2))
其正常工作和印刷品3的類型,但我封鎖的問題,我上面說的,我不知道該函數的類型,而這這個例子的作用僅僅是因爲我在我定義字符串函數以測試IMain如何工作時使用的類型。
你知道我如何實現這個功能嗎?
我是新手,所以請原諒我,如果我寫了任何錯誤。
感謝
只是要添加。另外,很棒的答案,更多的上下文可以在http://docs.scala-lang.org/overviews/quasiquotes/usecases找到。要轉換爲可應用的函數,請使用以下內容:val data = tb.eval(q「$ functionSymbol.f _」)。asInstanceOf [Int => Int] –