В поисках способов сделать библиотеки Java доступными для сторон JavaScript и JVM в Scala.js кросс-построенных проектов, пожалуйста, рассмотрите следующий эксперимент:
Представьте, чтоПроект Scala.js нуждается в расширенных математических возможностях, таких как Разложение по сингулярным значениям .Хотя в мире JavaScript есть Numeric.js , а в мире JVM есть много вариантов, JAMA , что немаловажно, среди них, на момент постановки этого вопроса не существовало перекрестного решения Scala.js.
Какие у нас есть варианты?
- Пишите заново или переносите библиотеку матриц для Scala.js.
- Оберните фасады Numeric.js и JAMA в общий ScalaИнтерфейс .js.
- Напишите фасады для Numeric.js, затем скомпилируйте его с помощью Nashorn для поддержки JVM.
- Транспортируйте JAMA в JavaScript с помощью JSweet и модные фасады Scala.js.
Этот вопрос отражает вариант 4.
После восстановления JAMA для транспортера JSweet , опубликовав перенесенный JavaScript как Модуль CommonJS через npm и запись фасадов Scala.js для модуля CommonJS, код Scala теперь может обращаться к Jama на стороне JVM и к его порту на стороне JS.
К сожалению,Базовая структура данных на стороне JVM имеет тип: double [] [], Array [Array [Double]] в синтаксисе Scala, но JSweet преобразует его в тип массива JavaScript, js.Array [js.Array [Double]] в ScalaСинтаксис .js.
Теперь, с точки зрения кросс-сборки Scala.js, существуют две идентично названные, эквивалентно функциональные, но совершенно разные и отдельные библиотеки.
Из синтаксиса Scala мы можем построить3D-матрица идентичности на стороне JS выглядит следующим образом:
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?