通过转译器在Javascript中实现运算符重载

对于我们中的一些人来说,使用Javascript的问题之一是缺少运算符重载。 这使书写数字图书馆变得尴尬。 例如,我们可能想写一些如下所示的内容:

var a = new BigInteger(5);
var b = new BigInteger(10);
var c = a + b;

一种可能的解决方案是将运算符重载的语言转换为Javascript。 虽然可行 - 通过函数调用和类型检查来取代操作符 - 但共识似乎是,如果不杀死性能,这是不可能的。 CoffeeScript由于这个原因已经拒绝了这个想法:

https://github.com/jashkenas/coffee-script/issues/846

但是真的没有聪明的解决方案吗?

举例来说,可能是提升类型检查出紧密循环,或者使用其他管道,其中现代JS编译器可以在类型为数字时优化添加的垃圾。

想法?


你真的确定你需要你的大数字能够被用正常数字编写的旧函数(使用传统的运算符)来使用吗? 如果你只是为了自己的便利而需要重载,那么你可以通过使用不同的自定义操作符来控制你的功能。

例如,你可以编写一个编译器来安全转换

var d = a <+> b <*> c;

var d = (a).add((b).multiply(c));

或者,如果你想自动转换...

var d = toBignum(a).add(toBignum(b).multiply(toBignum(c)));

我真的没有看到你可以在现有的实现中强制重载而没有很大的麻烦。 虽然你可以通过<+>等替代所有+的出现,但是目前的Javascript实现并没有为此优化,我甚至不想开始思考如果你试图将一个bignum传递给本地C ++的功能在底层。


编辑:不需要重写基本整数类是重要的一点在这里(请注意,你给的链接是如何的,覆盖是人想要的第一件事......)。 我不认为你能够找到某种“神奇”的优化,因为你无法控制客户端正在使用哪些JS实现。

如果你真的不喜欢象<+>这样的自定义操作符,那么区分一个正常的+操作符(你不应该插手)和一个花哨的+操作符(你想要做什么)会迫使某种类型在Javascript之上的特设输入系统,可能通过评论,自定义语法或(如评论中提到的)匈牙利符号。 只是为了定制一个自定义的运营商名称而不愿意讨厌,IMO。


看看Scala如何实现操作符重载:

他们定义每个操作符都是对象的方法调用,所以你的例子是:

var c = a["+"](b);

如果你在这里停下来,你可以简单地实现方法重载,函数将不得不检查param传递的值。 如果你想开发一个更好的解决方案,请使用Odersky的Scala程序设计书,并花些时间阅读他们的想法,以解决问题(这是一个非常好的解决方案!)

链接地址: http://www.djcxy.com/p/9155.html

上一篇: Implementing operator overloading in Javascript via a transpiler

下一篇: How to persist an entity from an non