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

可以在javascript中添加一些新语法吗?,javascript,python,operator-overloading,Javascript,Python,Operator Overloading,可以在javascript中添加一些新语法吗?如果我想让它有一个synatx,比如: mul>10>20结果是200,或者如果说mul(2)(3)结果是6?有可能吗?我在某个地方看到了类似的问题?所以我不确定这是否可能?如果不是在JS中,那么在其他语言(如C、Java、Python)中是否有可能?我的理解是,所有这些语言只能为新对象添加一些功能,甚至那些新对象也只能具有语言本身已经具有的运算符和语法?那么,我是对的,还是可以在这些语言中添加新的语法?您更广泛的问题的答案是用您正在使用的语言书写,

可以在javascript中添加一些新语法吗?如果我想让它有一个synatx,比如:


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

您更广泛的问题的答案是用您正在使用的语言书写,这意味着您可以使用可用的工具来解决您的问题

然而,您给出的第二个示例实际上已经是一种相当常见的模式,称为咖喱。您可以通过以下方式扩展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;
}
您可以使用多种咖喱(2)(3)

这里有一个


有关此设计模式的更深入解释,请查看

您更广泛问题的答案是用您正在使用的语言书写,这意味着您可以使用可用的工具解决您的问题

然而,您给出的第二个示例实际上已经是一种相当常见的模式,称为咖喱。您可以通过以下方式扩展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;
}
您可以使用多种咖喱(2)(3)

这里有一个


有关此设计模式的更深入解释,请查看Currying将允许您执行以下操作:

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

mul(2)(3); // 6
多参数版本(需要使用空参数指定参数的结尾):


咖喱将允许您执行以下操作:

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

mul(2)(3); // 6
多参数版本(需要使用空参数指定参数的结尾):

用Python

mul(2)(3)
表示使用参数
2
调用
mul
,然后使用参数
3
调用
返回值(假设它是一个函数)。您不能重新定义该语法,但可以让函数使用它:

def mul(arg):
    return lambda x: x * arg
要允许链接(即
mul(2)(3)(4)
),我将选择

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
)。这只是假装返回一个数字;我把实现其余必要的部分留给读者作为练习

除了返回
x>y
True
False
),您不能让
mul>x>y
执行任何操作,因为函数对象
mul
的计算结果将大于任何整数

Python中的

mul(2)(3)
表示使用参数
2
调用
mul
,然后使用参数
3
调用
返回值(假设它是一个函数)。您不能重新定义该语法,但可以让函数使用它:

def mul(arg):
    return lambda x: x * arg
要允许链接(即
mul(2)(3)(4)
),我将选择

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
)。这只是假装返回一个数字;我把实现其余必要的部分留给读者作为练习



除了返回
x>y
True
False
),您不能让
mul>x>y
执行任何操作,因为函数对象
mul
的计算结果将大于任何整数

你可以用本机(currying)来做第二个,而不是第一个,除非你做了一些不必要的
eval
解析。如果你试图以某种方式解析它,它看起来会很难看。但是检查Coffeescript或其他使JavaScript具有新语法的语言。你可以分叉和扩展。我相信你可以用Lisp宏来完成…:-)看看一本好的lisp书。我想你会喜欢你所看到的。你可以用本机(咖喱)来做第二个,而不是第一个,除非你做一些不必要的
eval
解析。如果你试图以某种方式解析它,它看起来会很难看。但是检查Coffeescript或其他使JavaScript具有新语法的语言。你可以分叉和扩展。我相信你可以用Lisp宏来完成…:-)看看一本好的lisp书。我想你会喜欢你所看到的。很抱歉挑剔,但是部分应用!=如果有人想知道Array.prototype.slice.call()是如何工作的,那么可以在上看到它,但它怎么能独立于参数范围呢?意味着我不知道是
mul(2)(3)
还是
mul(2)(3)(1)(9)
很抱歉挑剔,但是部分应用!=如果有人想知道Array.prototype.slice.call()是如何工作的,那么可以在上看到它,但它怎么能独立于参数范围呢?意思是我不知道它是
mul(2)(3)
还是
mul(2)(3)(1)(9)
我已经这样做了,但它永远不知道它是最后一个参数,所以永远不能做最后需要做的事情。:)你的意思是你想有两个以上的参数吗?如果是这样的话,我做了一个编辑来展示如何做到这一点。我已经做了,但它永远不会知道这是最后一个参数,所以永远不会做最后需要做的任何事情。:)你的意思是你想有两个以上的参数吗?如果是这样的话,我做了一个编辑来展示如何做到这一点。如果我希望这些参数是递归的,而不仅仅是两个呢?好问题;答案已编辑。请注意,这意味着您需要做更多的工作,并且更难阅读代码!它说super()至少有一个参数0如果我的代码是针对Python3.x的,你可能需要对2.x做一些调整。2.x只需要一个更改(在
mul.\uu init\uuu_()
),我现在已经做了,如果我希望这些参数是递归的,而不仅仅是两个呢?好问题;答案编辑