是否可以在javascript中添加一些新语法?

时间:2013-12-30 00:19:07

标签: javascript python operator-overloading

是否可以在javascript中添加一些新语法?就像我希望它有一个类似的synatx:

mul>10>20,结果为200或者说mul(2)(3),结果为6?有可能的?我在某个地方看到了类似的问题吗?所以我不确定它是否可能?如果不是在JS中,它可以在其他语言中使用,如C,Java,Python吗?我的理解是,所有这些语言只能为新对象添加一些功能,甚至那些新对象只能拥有语言本身已有的运算符和语法?我是正确的还是可以为这些语言添加新语法?

3 个答案:

答案 0 :(得分:12)

您更广泛的问题的答案是将写入您正在使用的语言,意味着旨在通过您可以使用的工具解决您的问题。

但是,您提供的第二个示例实际上已经是一种相当常见的模式,称为 currying 。您可以通过以下方式扩展Javascript以实现此目的:

Function.prototype.curry = function() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function() {
      return fn.apply(this, args.concat(
        Array.prototype.slice.call(arguments)));
    };
  };

所以假设mul(a, b)是:

function mul(a, b) {
    return a * b;
}

您可以使用mul.curry(2)(3)

这是Fiddle

有关此设计模式的更深入说明,请查看http://ejohn.org/blog/partial-functions-in-javascript/

答案 1 :(得分:1)

在Python中

mul(2)(3)

表示使用参数mul调用2,然后使用参数return (假设它是函数)调用3值)。您无法重新定义该语法,但您可以使用它来运行:

def mul(arg):
    return lambda x: x * arg

要允许链接(即mul (2)(3)(4)),我会选择class

import operator

class op(object):

    def __init__(self, op, arg):
        self.op = op
        self.value = self._get_val(arg)

    def _get_val(self, arg):
        try:
            return arg.value
        except AttributeError:
            return arg

    def __repr__(self):
        return str(self.value)

    def __call__(self, arg):
        self.value = self.op(self.value, 
                             self._get_val(arg))
        return self

    def __getitem__(self, key):
        self.value = self.op(self.value, 
                             -1 * self._get_val(key))
        return self


class mul(op):

    def __init__(self, arg):
        super(mul, self).__init__(operator.mul, arg)

我添加了奖励功能,方括号使参数为负(mul(2)[3] == -6)。这只是假装return一个数字;我将剩余的必要magic methods留给读者作为练习。

除了返回mul>x>yx > yTrue)之外,你无法让False做任何事情,因为函数对象mul会评估为更大比任何整数。

答案 2 :(得分:0)

Currying将允许您这样做:

function mul(num1) {
  return function (num2) {
    return num1 * num2;
  }
}

mul(2)(3); // 6

多个参数版本(需要指定带有空parens的args的结尾):

function mul (num1) {
  var vals = [num1];
  var fn = function (num2) {
    if (num2) {
      vals.push(num2);
      return fn;
    }else{
      var res = 1;
      vals.forEach(function (el) {
        res *= el;
      });
      return res;
    }
  }

  return fn;
}

console.log(mul(2)(3)(4)()); // 24