小编Pet*_*ter的帖子

在运行时编译并执行Scala代码

是否可以在Scala或Java中在运行时将scala代码编译为字符串?

我的想法是使用Scala构建DSL,然后让Java程序员在Java中使用DSL.

我听说类scala.tools.nsc.Interpreter可以做类似的事情,但当我在scala文件中导入它时,我得到"对象工具不是包scala的成员".

所以有人能给我一个暗示吗?

dsl interpreter scala

21
推荐指数
2
解决办法
1万
查看次数

Scala - 方法优先级

我是Scala的新手.我想知道是否可以使用方法调用定义一些优先级.例如,如果我有方法调用链:

someObject method1 param1 method2 param2 method3 param3
Run Code Online (Sandbox Code Playgroud)

这可以等同于以下内容:

someObject.method1(param1).method2(param2.method3(param3))
Run Code Online (Sandbox Code Playgroud)

要么

someObject method1 param1 method2 (param2 method3 param3)
Run Code Online (Sandbox Code Playgroud)

所以我希望method3优先于method2 ...

我想这样做的原因是我想开发一个DSL,所以我想避免尽可能多地使用点和圆括号.如果你们为我找到另一种解决方案,请随时告诉我.

methods scala

17
推荐指数
2
解决办法
1594
查看次数

scala.tools.nsc.interpreter内存泄漏

我需要使用Scala实现DSL(域特定语言),并且此DSL将在Scala解释器(scala.tools.nsc.interpreter)中进行解释.问题是解释器使用的内存不断增加,直到抛出outOfMemory异常.每次我要执行一行DSL时,我都无法重新初始化解释器,因为解释器需要一段时间才能加载.我不能只调用reset(),因为我需要跟踪解释器执行环境中的一些数据.

即使我执行以下操作,也会发生内存泄漏:

while (true)
{
 interpreter.interpret("println(4 + 5)")
}
Run Code Online (Sandbox Code Playgroud)

过了一会儿,我会得到:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at ch.epfl.lamp.util.ByteArray.<init>(ByteArray.java:24)
    at ch.epfl.lamp.fjbg.JCode.<init>(JCode.java:47)
    at ch.epfl.lamp.fjbg.JExtendedCode.<init>(JExtendedCode.java:113)
    at ch.epfl.lamp.fjbg.FJBGContext.JCode(FJBGContext.java:122)
    at ch.epfl.lamp.fjbg.JMethod.<init>(JMethod.java:52)
    at ch.epfl.lamp.fjbg.FJBGContext.JMethod(FJBGContext.java:87)
    at ch.epfl.lamp.fjbg.JClass.addNewMethod(JClass.java:246)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genMethod(GenJVM.scala:755)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator$$anonfun$genClass$7.apply(GenJVM.scala:307)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at scala.tools.nsc.backend.jvm.GenJVM$BytecodeGenerator.genClass(GenJVM.scala:307)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase$$anonfun$run$4.apply(GenJVM.scala:86)
    at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
    at scala.collection.mutable.HashMap$$anon$2$$anonfun$foreach$3.apply(HashMap.scala:102)
    at scala.collection.Iterator$class.foreach(Iterator.scala:660)
    at scala.collection.mutable.HashTable$$anon$1.foreach(HashTable.scala:157)
    at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:190)
    at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:43)
    at scala.collection.mutable.HashMap$$anon$2.foreach(HashMap.scala:102)
    at scala.tools.nsc.backend.jvm.GenJVM$JvmPhase.run(GenJVM.scala:86)
    at scala.tools.nsc.Global$Run.compileSources(Global.scala:953)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compileAndSaveRun(IMain.scala:756)
    at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.compile(IMain.scala:731)
    at scala.tools.nsc.interpreter.IMain$Request.compile(IMain.scala:873)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:576)
    at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:543)
    at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50)
    at com.ericsson.ims_dsl.IMS_Interpreter$$anonfun$e$1.apply(IMS_Interpreter.scala:50) …
Run Code Online (Sandbox Code Playgroud)

dsl interpreter memory-leaks scala

6
推荐指数
1
解决办法
356
查看次数

标签 统计

scala ×3

dsl ×2

interpreter ×2

memory-leaks ×1

methods ×1