嘿,所有。我想弄清楚在运行时如何使用Scala.js工具将Scala表达式编译成Javascript。作为一个例子,这是一个简化的设置。Scala.js运行时编译为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'](https://www.scala- js.org/api/scalajs-tools/0.6.19/#org.scalajs.core.tools.linker.StandardLinker$),它是['Linker']的工厂(https://www.scala-js.org /api/scalajs-tools/0.6.19/#org.scalajs.core.tools.linker.Linker),其重要方法是'link'。 – sjrd
您正在寻找的是(至少在斯卡拉研究环境中)的“深嵌入”(或其变体)。这是一个活跃的研究课题,而不是“解决”的问题。 对于您的特定问题,我能想到的最好方法是自己编写一个JavaScript编译器,然后''评估'结果。 – gzm0