如ClojureScript,Elm,PureScript,GHCJS等不可变语言如何编译成可变的javascript?

问题描述 投票:2回答:2

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

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

immutability elm purescript ghcjs
2个回答
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绑定时必须小心。


6
投票

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

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

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

这些要点很重要,因为它们意味着PureScript生成简单易懂的代码。实际上,代码生成过程通常是一个非常浅薄的转换。对于预测为特定输入生成哪些JavaScript代码,对语言的理解相对较少。

因此,你写的是:“最终不可变数据仍将是一个javascript的数据”。在编译之后,PureScript模块的包装函数可以保证更高级别的不变性。

© www.soinside.com 2019 - 2024. All rights reserved.