是否可以在javascript中添加一些新语法?就像我希望它有一个类似的synatx:
mul>10>20
,结果为200
或者说mul(2)(3)
,结果为6?有可能的?我在某个地方看到了类似的问题吗?所以我不确定它是否可能?如果不是在JS中,它可以在其他语言中使用,如C,Java,Python吗?我的理解是,所有这些语言只能为新对象添加一些功能,甚至那些新对象只能拥有语言本身已有的运算符和语法?我是正确的还是可以为这些语言添加新语法?
答案 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>y
(x > y
或True
)之外,你无法让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