嘿,所有。我想弄清楚在運行時如何使用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