有人可以解释Scala,Groovy和Clojure之间的主要区别.我知道这些编译中的每一个都在JVM上运行,但我想在它们之间进行简单的比较.
是否可以在Scala或Java中在运行时将scala代码编译为字符串?
我的想法是使用Scala构建DSL,然后让Java程序员在Java中使用DSL.
我听说类scala.tools.nsc.Interpreter可以做类似的事情,但当我在scala文件中导入它时,我得到"对象工具不是包scala的成员".
所以有人能给我一个暗示吗?
我希望我的Scala代码将Scala类作为输入,编译并执行该类.如何以编程方式调用Scala编译器?我将使用最新的Scala版本,即2.10.
我想设计一个Scala程序,它接受Scala文件作为参数,可以自定义程序的执行.特别是,我想在运行时提供包含将由程序调用的方法的实现的文件.如何正确依赖外部文件并在运行时动态调用其方法?理想情况下,我还希望这些文件能够依赖于我的程序中的方法和类.
示例场景:我有一个包含该行的函数val p: Plant = Greenhouse.getPlant(),并且Greenhouse该getPlant方法的类在将在运行时提供的其中一个文件中定义.在该文件中,该方法getPlant返回a Rose,where Rose <: Plant和Plant在原始程序中定义.假设文件仅在运行时加入而不是在编译时加入,我如何实现(或近似)这种相互依赖性?
可能重复:
Scala中的"eval"
我知道scala是一种编译语言,但我也知道我可以动态地将类加载到jvm中,我可以在运行时调用scala编译器,最后但并非最不重要的是我也有一个很棒的repl,所以让scala作为一个脚本语言应该是可能的.
所以我需要运行一些任务:
简单解释:
val src = """ println("Hello World") """
interpret(src)
Run Code Online (Sandbox Code Playgroud)
调用外部函数:
object A{
def foo =
println("Hello World")
}
val src = """ A.foo """
interpret(src)
Run Code Online (Sandbox Code Playgroud)
实现功能:
trait T{
def foo:String
}
val src = """ class A extends T{ def foo = "Hello World" } """
interpret(src)
val t = loadClassAndCreatInstance.asInstanceOf[T]
println(t.foo)
Run Code Online (Sandbox Code Playgroud)
能够解决我所有的问题会很棒.
正如Scala邮件列表中的这个帖子所要求的那样,我如何创建一个继承父程序类路径的嵌入式Scala REPL?假设父Scala程序是使用启动的scala -cp <classpath> ...; 可以<classpath>作为字符串访问并用于初始化嵌入的REPL?(可用的Java类路径System.getProperty("java.class.path")似乎与Scala类路径不同.)
或者,也许嵌入式Scala REPL可以从父进程继承或构造其ClassLoader(MichaelDürig的ScalaDays 2010谈话可能是相关的).这是推荐的方法吗?
我想使用 Scala3 编译并执行在运行时以字符串形式给出的 Scala 代码。例如在 Scala 2 中我会使用 Reflection
import scala.reflect.runtime.universe as ru
import scala.tools.reflect.ToolBox
val scalaCode = q"""println("Hello world!")"""
val evalMirror = ru.runtimeMirror(this.getClass.getClassLoader)
val toolBox = evalMirror.mkToolBox()
toolBox.eval(scalaCode) //Hello world!
Run Code Online (Sandbox Code Playgroud)
如果我尝试在 Scala3 中运行这段代码,我会得到
Scala 2 macro cannot be used in Dotty. See https://dotty.epfl.ch/docs/reference/dropped-features/macros.html
To turn this error into a warning, pass -Xignore-scala2-macros to the compiler
Run Code Online (Sandbox Code Playgroud)
我如何在 Scala3 中翻译这段代码?
将代码片段注入 Scala 的最佳方法是什么?类似于 javascript 和 GroovyScriptEngine 中的 eval 。我想将我的规则/计算/公式保留在实际数据处理类之外。我有将近 100 多个公式要执行。所有数据流都是相同的,只是公式发生了变化。在 Scala 中最好的方法是什么?并且公式的数量会随着时间的推移而增长。
我有以下代码,我想即时编译并运行它。
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, world!")
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试过如下所示:
import scala.reflect.runtime.currentMirror
import scala.tools.reflect.ToolBox
object MainScala {
def main(args: Array[String]): Unit = {
val toolbox = currentMirror.mkToolBox()
val source =
"""
|object HelloWorld {
| def main(args: Array[String]): Unit = {
| println("Hello, world!")
| }
|}
|""".stripMargin
val tree = toolbox.parse(source)
val binary = toolbox.compile(tree)
var c = binary.getClass
val m = c.getMethod("main", classOf[Array[String]])
val params = Array("Apple", "Banana", "Orange")
m.invoke(null, null)
}
} …Run Code Online (Sandbox Code Playgroud) scala ×9
interpreter ×2
classloader ×1
clojure ×1
dsl ×1
eval ×1
groovy ×1
java ×1
macros ×1
reflection ×1
scala-3 ×1
scala-macros ×1
scalatest ×1
scripting ×1