Как неизменные языки, такие как ClojureScript, Elm, PureScript, GHCJS, компилируются в изменяемый JavaScript? - PullRequest
0 голосов
/ 30 августа 2018

Я думаю, что похоронить исходный код перечисленных языков - это слишком много для меня. Но может ли кто-нибудь объяснить простыми словами, как это происходит?

Я имею в виду, что в конечном итоге неизменными будут данные javascript. Или скомпилированный код содержит не стандартные структуры данных, например Строка 'a, b, c' для неизменяемого массива

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

PureScript имеет строковые, числовые и логические значения JavaScript, которые уже являются неизменяемыми. Кроме того, PureScript имеет Array и Object, но предоставляет только определенные операции.

Когда вы обновляете объект в PureScript, вы копируете поля, кроме того, которое вы обновляете.

Конкатенация массивов выглядит примерно так:

function concatArray (xs) {
  return function (ys) {
    if (xs.length === 0) return ys;
    if (ys.length === 0) return xs;
    return xs.concat(ys);
  };
};

В PureScript есть дополнительные способы определения данных, которые (обычно) компилируются в Object, но также не раскрывают способы их изменения.

Но используя FFI можно написать код, который изменяет все ваши данные PureScript. Вы должны быть осторожны при написании привязок FFI.

0 голосов
/ 30 августа 2018

Я отвечу о PureScript, так как я более знаком с этим языком.

Из PureScript в примере [2.7] о создании PureScript для JavaScript:

  • Каждый модуль превращается в объект, созданный функцией-оберткой, которая содержит экспортированные элементы модуля.
  • PureScript пытается сохранить имена переменных везде, где это возможно.
  • Приложения функций в PureScript превращаются в приложения функций в JavaScript.
  • Основной метод запускается после определения всех модулей и генерируется как простой вызов метода без аргументов.
  • Код PureScript не зависит от каких-либо библиотек времени выполнения . Весь код, сгенерированный компилятором, возник в модуле PureScript, где-то, от чего зависел ваш код.

Эти пункты важны, поскольку они означают, что PureScript генерирует простой, понятный код. На самом деле процесс генерации кода в целом является довольно поверхностным преобразованием. Требуется относительно мало понимания языка, чтобы предсказать, какой код JavaScript будет сгенерирован для конкретного ввода.

Следовательно, ДА, как вы написали: "в конце неизменные данные все равно будут данными javascript" . После компиляции неизменность гарантируется на более высоком уровне с помощью функций-оболочек модулей PureScript.

...