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