文字列として与えられたコードを動的に解釈しようとしています。例えば:
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 からキャストバックする必要があるため、これは大きな問題の 1 つです。リフレクション、型システムなどについて読んだことがありますが、グーグルで調べた後、このポイントに到達しました。また、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 の方法をテストするために文字列関数を定義したときに使用した型にキャストしたためだけに機能します。動作します。
この機能を実現する方法を知っていますか?
初心者ですので、書き間違い等ありましたらお許しください。
ありがとう