【发布时间】:2017-08-08 15:49:42
【问题描述】:
大家好。我想弄清楚如何在运行时使用 Scala.js 工具将 Scala 表达式编译为 Javascript。以下是一个简化的设置,作为示例。
比如说,我们有一个简单的 DSL,它由 Ctx => Boolean 函数和对它们的布尔运算组成,如下所示:
implicit class Simple[Ctx](f: Ctx => Boolean) {
def &&(g: Ctx => Boolean): Ctx => Boolean = ctx => f(ctx) && g(ctx)
def ||(g: Ctx => Boolean): Ctx => Boolean = ctx => f(ctx) || g(ctx)
def unary_!: Ctx => Boolean = ctx => !f(ctx)
}
假设我们有一些“构建块”硬编码、编译成 Javascript 并导出,如下所示:
@ExportJSTopLevel("foo") def foo[Ctx](ctx: Ctx): Boolean = ???
@ExportJSTopLevel("bar") def bar[Ctx](ctx: Ctx): Boolean = ???
// and so on
现在可以将这些构建块组合成简单的布尔表达式,例如:foo && bar 或foo || !bar 等。
假设一些持久实体是在运行时创建的,它们的主体是这样的表达式。我希望能够将它们编译为 Javascript,作为与上面的构建块具有相同签名的函数,这些构建块调用这些构建块。
我在网上找到了几个关于 Scala.js 工具中某个名为 ScalaJSOptimizer 的神秘类的引用。但是,提供给该类的链接总是被破坏或显示它属于最新版本的“scalajs-tools”工件甚至没有的包。
完成我想做的事情的最佳方法是什么?
【问题讨论】:
-
我不明白你想要达到的目标的一半,但是(长死的)
ScalaJSOptimizer的替代品是StandardLinker,它是Linker的工厂,它的重要方法是link。 -
您正在寻找的东西被称为(至少在 Scala 研究环境中)“深度嵌入”(或其变体)。这是一个活跃的研究课题,而不是“解决”的问题。对于您的具体问题,我能想到的最好方法是自己编写一个小的 JavaScript 编译器,然后
eval结果。
标签: javascript scala scala.js runtime-compilation