寻找使 Java 库可供 Scala.js 的 JavaScript 和 JVM 端访问的方法交叉构建 https://www.scala-js.org/doc/project/cross-build.html项目,请考虑以下实验:
想象一下 Scala.js 项目需要高级矩阵数学功能,例如奇异值分解 https://en.wikipedia.org/wiki/Singular-value_decomposition。尽管 JavaScript 世界有数值.js http://www.numericjs.comJVM 世界有很多选择,JAMA https://math.nist.gov/javanumerics/jama/其中最重要的是,在提出这个问题时,不存在跨构建 Scala.js 解决方案。
我们有什么选择?
- 为 Scala.js 重新编写或移植一个矩阵库。
- 将 Numeric.js 外观和 JAMA 包装到通用 Scala.js 接口中。
- 为 Numeric.js 编写外观,然后使用以下命令进行编译Nashorn http://www.oracle.com/technetwork/articles/java/jf14-nashorn-2126515.html用于 JVM 支持。
- 将 JAMA 转换为 JavaScriptJSweet http://www.jsweet.org/和时尚合适的 Scala.js 外观。
该问题反映了选项 4。
修复后JAMA 的 JSweet 转译器 https://github.com/dragonfly-ai/JamaJS,将转译后的 JavaScript 发布为通过 npm 的 CommonJS 模块 https://www.npmjs.com/package/jama,并写作Scala.js 外观 https://github.com/dragonfly-ai/matrix对于 CommonJS 模块,Scala 代码现在可以在 JVM 端访问 Jama,并在 JS 端访问它的端口。
不幸的是,JVM 端的核心数据结构在 Scala 语法中具有类型:double[][]、Array[Array[Double]],但 JSweet 将其转换为 JavaScript 数组类型,js.Array[js.Array[Double] ] 在 Scala.js 语法中。
现在,从 Scala.js 交叉构建的角度来看,存在两个名称相同、功能相同、但完全不同且独立的库。
根据 Scala 语法,我们可以在 JS 端构造 3D 单位矩阵,如下所示:
new Matrix(
js.Array[js.Array[Double]](
new js.Array[Double](1.0, 0.0, 0.0),
new js.Array[Double](0.0, 1.0, 0.0),
new js.Array[Double](0.0, 0.0, 1.0)
)
)
在JVM方面,我们这样写:
new Matrix(
Array[Array[Double]](
new Array[Double](1.0, 0.0, 0.0),
new Array[Double](0.0, 1.0, 0.0),
new Array[Double](0.0, 0.0, 1.0)
)
)
我们如何统一这两种实现?
有没有一个技巧可以将 js.Array 和 Array 等同起来?
您是否会建议一种完全不同的方法来使 Java 库可供交叉构建的 Scala.js 项目访问?