我认为埋没列出语言的源代码对我来说太多了。但是有没有人能够简单地解释事情是如何发生的?
我的意思是,最终不可变数据仍将是 javascript 的数据。或者编译的代码是否包含非标准数据结构,例如不可变数组的'a,b,c'字符串
我认为埋没列出语言的源代码对我来说太多了。但是有没有人能够简单地解释事情是如何发生的?
我的意思是,最终不可变数据仍将是 javascript 的数据。或者编译的代码是否包含非标准数据结构,例如不可变数组的'a,b,c'字符串
我会回答有关 PureScript 的问题,因为我更熟悉这种语言。
从PureScript By Example [2.7]关于 PureScript 到 JavaScript 生成:
- 每个模块都变成一个对象,由包装函数创建,其中包含模块的导出成员。
- PureScript 会尽可能地保留变量的名称。
- PureScript 中的函数应用程序变成了 JavaScript 中的函数应用程序。
- main 方法在所有模块都被定义后运行,并且生成为一个没有参数的简单方法调用。
- PureScript 代码不依赖任何运行时库。编译器生成的所有代码都源自代码所依赖的 PureScript 模块。
这些点很重要,因为它们意味着 PureScript 生成简单易懂的代码。事实上,代码生成过程总的来说是一个相当浅层的转换。对语言的了解相对较少即可预测将为特定输入生成哪些 JavaScript 代码。
因此,是的,正如您所写:“最终,不可变数据仍将是 javascript 的数据”。编译后,PureScript 模块的包装函数在更高级别上保证了不变性。
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 绑定时必须小心。