3

我认为埋没列出语言的源代码对我来说太多了。但是有没有人能够简单地解释事情是如何发生的?

我的意思是,最终不可变数据仍将是 javascript 的数据。或者编译的代码是否包含非标准数据结构,例如不可变数组的'a,b,c'字符串

4

2 回答 2

6

我会回答有关 PureScript 的问题,因为我更熟悉这种语言。

PureScript By Example [2.7]关于 PureScript 到 JavaScript 生成:

  • 每个模块都变成一个对象,由包装函数创建,其中包含模块的导出成员。
  • PureScript 会尽可能地保留变量的名称。
  • PureScript 中的函数应用程序变成了 JavaScript 中的函数应用程序。
  • main 方法在所有模块都被定义后运行,并且生成为一个没有参数的简单方法调用。
  • PureScript 代码不依赖任何运行时库。编译器生成的所有代码都源自代码所依赖的 PureScript 模块。

这些点很重要,因为它们意味着 PureScript 生成简单易懂的代码。事实上,代码生成过程总的来说是一个相当浅层的转换。对语言的了解相对较少即可预测将为特定输入生成哪些 JavaScript 代码。

因此,是的,正如您所写:“最终,不可变数据仍将是 javascript 的数据”。编译后,PureScript 模块的包装函数在更高级别上保证了不变性。

于 2018-08-30T00:45:11.520 回答
3

PureScript 具有 JavaScript 的 String、Number 和 Boolean,它们已经是不可变的。最重要的是,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 绑定时必须小心。

于 2018-08-30T12:15:47.193 回答