在scala脚本运行期间,我希望它生成一些代码并执行这些代码。
我以为我在网上找到了两个可能有用的例子,但它们都不成功
import scala.reflect.runtime.universe._
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
import java.io.{File, FileWriter}
def runstuff() = {
val fileWriter = new FileWriter(new File("temporaryScalaFile.scala"))
fileWriter.write("println(\"hello\")")
fileWriter.close()
temporaryScalaFile.scala
val cm = scala.reflect.runtime.universe.runtimeMirror(getClass.getClassLoader)
val tb = cm.mkToolBox()
val str = tb.eval(tb.parse("new String(\"Yo\")"))
println(str)
}
这些可能是过时的例子。
有没有人有一个工作或修复?
1条答案
按热度按时间mkh04yzy1#
我将在Scala 2中采用我在How to compile and execute scala code at run-time in Scala3?中的答案
或
scala.tools.nsc.interpreter
scala.reflect.runtime.universe.Tree
q"..."
而不是普通字符串,那么你不需要解析scala.reflect.runtime.universe.Expr
reify {...}
(一个静态类型的树 Package 器)而不是普通字符串,那么你也不需要解析scala-compiler
还是scala3-compiler
,您将运行Scala 2或Scala 3(上述两个脚本引擎之一:Scala 2scala.tools.nsc.interpreter.shell.Scripted
或Scala 3dotty.tools.repl.ScriptEngine
)。如果同时添加了两个依赖项,则先添加的依赖项优先。如果您希望更好地控制所使用的依赖项(无需重新导入项目),则可以使用Coursier并指定类加载器
型
scala.meta.interactive.InteractiveSemanticdb.newCompiler()
,该方法返回在scala.tools.nsc.Global
之上扩展的scala.tools.nsc.interactive.Global
。Scala reflection: compile akka actor with protobuf
Dynamic compilation of multiple Scala classes at runtime
How to eval code that uses InterfaceStability annotation (that fails with "illegal cyclic reference involving class InterfaceStability")?显示器
Tensorflow in Scala reflection
Scala Presentation Compiler - Minimal Example
What is "Scala Presentation Compiler"?
"eval" in Scala