在浏览器中构建一个scala解释器

时间:2013-03-13 13:49:38

标签: scala

我与Scala的第一次接触是通过SimplyScala tutorial:你不需要安装任何东西,只能开始编码。几个小时后我爱上了这门语言......

多年以后,我为Scala库编写了一个Web文档作为Play应用程序。构建像SimplyScala这样的东西并将其集成到文档中会很酷,这样用户就可以在浏览器中输入Scala命令并获得结果。

SimplyScala在Google App Engine上的工作方式类似于LotREPLS(只有少数LOC的旧开源Java项目)。

也可以在我自己的服务器上创建这样的东西而不会出现安全漏洞(例如,用户不应该从服务器读取文件......)

我只需要Scala语言的“基础”而不需要像SimplyScala那样的任何导入。

我的第一个想法是编写一个自己的SecurityManager并处理超时,这样用户就不会消耗太多的服务器时间。有没有更简单的方法或现有的开源项目?

或者建议用户安装Scala并使用终端而不是浏览器更合理? ; - )

在Scala主页上有Summer of Code 2012 Scala Projects类似的Play项目创意:但我找不到任何结果。

4 个答案:

答案 0 :(得分:7)

到目前为止,最安全的可能是http://www.scala-js-fiddle.com/code on GitHub),因为它甚至不在服务器上运行代码,而是在客户端运行!

问题是:它不是真正的Scala代码,它是Scala.js,这是Scala的方言,仍然是实验性的等等。但可能足够为您的用例。

答案 1 :(得分:6)

回答我自己的问题:

Scala控制台,不关心安全性(?):

一个处理某种安全性的网络界面:

令人印象深刻的Scalakata project,来源位于GitHub

这是一个Lift项目,它定义了一个自己的安全管理器(参见src/main/scala/com.github.masseguillaume/security)并处理超时(参见src/main/scala/com.github.masseguillaume/service/KateEval.scala)。现在我必须考虑,如果这足够安全......

答案 2 :(得分:2)

https://codebrew.io/似乎与Scala REPL一样好用

代码可在https://github.com/CodeBrew-io

获取

答案 3 :(得分:2)

with:libraryDependencies += "org.scala-lang" % "scala-compiler" % scalaVersion.value

编译器(scala.tools.nsc.Global

这是评估scala代码的最准确方法。 compileSources将在类加载器中添加一个新类 usage

REPL

IMAIN

usage

JSR-223

import javax.script.ScriptEngineManager
val e = new ScriptEngineManager().getEngineByName("scala")
e.put("n", 10)
e.eval("1 + n") // 11

反射工具箱

import scala.reflect.runtime.{currentMirror => cm}
import scala.reflect.runtime.universe._
import scala.tools.reflect.ToolBox
val tb = cm.mkToolBox()
tb.eval(tb.parse("1+1"))
// res0: Any = 2

演示文稿(交互式)编译器(scala.tools.nsc.interactive.Global

这适用于自动完成和其他互动功能。 doc

usage