获取对运算符后面的JavaScript Function对象的引用

Mat*_*lor 7 javascript lisp scheme functional-programming

这是一个lisp过程,简单地将'a'添加到'b'的绝对值:

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
Run Code Online (Sandbox Code Playgroud)

我认为这很漂亮,我试图找到用JavaScript编写这个的最好方法.但我的JavaScript代码不漂亮:

var plus = function(a,b) {
    return a + b;
};

var minus = function(a,b) {
    return a - b;
};

var aPlusAbsB = function(a,b) {
    return (b > 0 ? plus : minus)(a,b);
}
Run Code Online (Sandbox Code Playgroud)

主要问题是我不能使用+-符号作为他们真正代表的函数的引用,因为我可以使用lisp.任何人都可以想出更优雅的方式来做这样的事情,或者我是否达到了语言界限?

显然,我可以这样做:

var aPlusAbsB = function(a,b) {
    return a + Math.abs(b);
}
Run Code Online (Sandbox Code Playgroud)

,但这更像是一个思想实验,而不是一个实用的问题.

有没有什么方法可以引用JavaScript语言中的核心函数,就像它们是用户定义的一样?

And*_*y E 5

这是一个非常酷的想法 - 对于评估数学表达式非常有用,但是你根本无法将一个运算符(或它背后的逻辑)设置为一个变量.对不起:-)


Kev*_*han 5

这取决于你发现的lisp实现的哪些方面特别漂亮.我会提出你的建议的另一个版本,我认为通过做一些肮脏的事情,最终会更接近你的lisp定义的语法.

// Give ourselves + and - functions to level the playing field with lisp.
Number.prototype['+'] = function(x)this+x;
Number.prototype['-'] = function(x)this-x;

// Now we can have some fun.
var aPlusAbsB = function(a,b) a [b > 0 ? '+' : '-'] (b);

// Some other notable language barrier differences, but not too dissimilar?
// (define (a-plus-abs-b a b) ((if (> b 0) + -) a b))
Run Code Online (Sandbox Code Playgroud)