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

标签 javascript coffeescript

对于我们中的一些人来说,使用 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 编译器可以在其中优化掉添加的杂物。

想法?

最佳答案

你真的确定你需要你的大数字才能被用普通数字编写的旧函数(使用传统运算符)使用吗?如果您只是为了自己的方便而需要重载您无法控制的函数,您可以通过对 bignums 使用不同的自定义运算符来实现。

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

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

进入

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

或者,如果您想要自动转换...

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

我真的不认为您能够在没有大麻烦的情况下强制对现有实现进行重载。虽然理论上您可以将所有出现的 + 替换为 <+> 等等,但当前的 Javascript 实现并未为此进行优化,我什至不想开始思考如果您尝试将 bignum 传递给 native 之一会发生什么幕后的 C++ 函数。


编辑: 不需要覆盖基础整数类是这里的重点(请注意在您提供的链接中,覆盖是这个人想要的第一件事......)。我认为您无法找到某种“神奇”的优化,因为您无法控制客户端使用的是众多 JS 实现中的哪一个。

如果你真的不喜欢像 <+> 这样的自定义运算符,那么区分普通 + 运算符(你不应该插手)和花哨的 + 运算符(你想做 bignum 的东西)的唯一方法是在 Javascript 之上强制使用某种特殊的打字系统,可能是通过注释、自定义语法或(如注释中所述)匈牙利符号。 IMO,仅仅满足于一个你不太讨厌的自定义运营商名称就不会那么骇人听闻。

关于javascript - 通过转译器在 Javascript 中实现运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7463324/

相关文章:

javascript - 仅在 Dartium 中调试我的 Dart 编写的客户端 Web 应用程序是否足够?

javascript - 如何使用 CoffeeScript 模拟现有代码?

javascript - 如何评估编译表达式?

javascript - 使用 js2coffee 将整个项目转换为 CoffeeScript

callback - 如何在 Coffeescript 中制作回调函数

javascript - 在 HTML 中使用 JavaScript 在文本框中输入值

javascript - 为什么我的 JavaScript 不被认为是安全的?

javascript - 在文档中的所有元素完全加载后,触发 JS 事件的最可靠方法是什么?

macos - 在 Mac OSX 中安装 Node.js 和 CoffeeScript 有困难

javascript - HapiJS 路由问题