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