在寻找使JavaScript库对Scala.js 交叉建造项目的交叉建造和JVM都可访问的方法时,请考虑以下实验:
假设Scala.js项目需要高级矩阵数学功能(如奇异值分解 )。虽然JavaScript世界有Numeric.js,而JVM世界有许多选项,但JAMA (尤其是其中的一个选项)在提出这个问题时不存在跨构建Scala.js解决方案。
我们有什么选择?
这个问题反映了备选案文4。
在修复用于JSweet转发器的JAMA、将已转换的JavaScript发布为通过npm实现CommonJS模块并为CommonJS模块编写Scala.js正面之后,Scala代码现在可以访问JVM端的Jama,并在JS端访问Jama的一个端口。
不幸的是,JVM端的核心数据结构有类型: double,Scala语法中的Array[ArrayDouble],但是JSweet将其转换为JavaScript数组类型,js.Array[js.ArrayDouble]在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和数组等同起来的窍门?
您会建议一种完全不同的方法让跨构建的Scala.js项目可以访问Java库吗?
发布于 2018-06-26 09:53:09
让我从一个简单的问题开始:
有没有把js.Array和数组等同起来的窍门?
不,没有这样的“诡计”。这些数据结构是从根本上不同的。js.Array的长度是可变的,可以用额外的属性进行修补。Array是Java的固定长度数组。如果有任何方法将它们等同,Scala.js就会这样做,就像对Double和number一样。
统一API的一种相对简单的方法是在Scala.js代码中重新构建JAMA的API,其中每个类都是来自j甜编译库的外观JS类的包装器。这使得JAMA的Scala级API在Scala/JVM和Scala.js之间完全等价。复制API确实需要编写一定数量的代码,但至少不需要重写方法的主体。
一种完全不同的方法,非常激进,并且需要大量的人工·工时,它将使JSweet编译器发出Scala.js IR (.sjsir)文件,而不是.js文件。这样,您就可以将用于JAMA的j甜生成的.sjsir文件与应用程序的Scala.js生成的.sjsir文件链接起来。这将提供最大的性能,因为Scala.js优化器可以跨越应用程序/库边界进行优化。
发布于 2018-07-01 04:14:59
将Java库移植到Scala.js的方法:
https://stackoverflow.com/questions/51033981
复制相似问题