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

获取对运算符后面的JavaScript函数对象的引用,javascript,functional-programming,lisp,scheme,Javascript,Functional Programming,Lisp,Scheme,下面是一个lisp过程,它简单地将“a”添加到“b”的绝对值中: (define (a-plus-abs-b a b) ((if (> b 0) + -) a b)) 我认为这很漂亮,我正在努力找到用JavaScript编写这篇文章的最佳方法。但我的JavaScript代码并不漂亮: var plus = function(a,b) { return a + b; }; var minus = function(a,b) { return a - b; }; va

下面是一个lisp过程,它简单地将“a”添加到“b”的绝对值中:

(define (a-plus-abs-b a b)
  ((if (> b 0) + -) a b))
我认为这很漂亮,我正在努力找到用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);
}
主要的问题是我不能像使用lisp一样使用
+
-
符号作为它们真正表示的函数的引用。有没有人能想出一个更优雅的方式来做这样的事情,或者我已经达到了语言的界限

显然,我可以做到:

var aPlusAbsB = function(a,b) {
    return a + Math.abs(b);
}
,但这更多的是一个思维实验,而不是一个实际问题


有什么方法可以让我像用户定义一样引用JavaScript语言中的核心函数吗?

这是一个非常酷的想法-这对于计算数学表达式非常有用,但您不能简单地将运算符(或其背后的逻辑)设置为变量。抱歉:-)

这比您的建议稍微漂亮一点,尽管远不及您的lisp概念表达的漂亮:

var aPlusAbsB = function(a, b) {
    var plus = function(a, b) {
      return a + b;
    };
    var minus = function(a, b) {
      return a - b;
    };
    return (b > 0 ? plus : minus)(a, b);
}
这相当于计划中的以下内容:

(define a-plus-abs-b
  (lambda (a b)
    (let ((plus (lambda (a b) (+ a b))) (minus (lambda (a b) (- a b))))
      (cond ((> b 0) (plus a b))
      (else (minus a b))))))

虽然不像LISP代码那样优雅,但您可以动态创建一个函数,其行为类似于运算符(在数字上),但事实并非如此

function op(o) {
    return new Function("a", "b", "return a " + o + " b");
}


function aPlusAbsB(a, b) {
    return (b > 0 ? op('+') : op('-'))(a, b);
}

此外,我们可以在if包装器中隐藏生成这些代码的复杂性,但这是我能得到的最接近的结果:)


我想其他人都是第一个想到这一点的,但是JS的纯功能性比lisp稍差一点,运算符不是函数或对象,而是运算符。

这取决于您认为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))

是的,严格来说这是不可能的,你能做的最接近的事情就是在里面嵌套加法和减法函数

var aPlusAbsB = function(a, b) {
    return (function(a, b) { b > 0 ? a + b : a - b })(a, b);
}

不完全相同,但它以一种非常间接的方式完成了任务。

您看过Functional.js及其将简单函数表示为字符串的奇特可爱语法吗?此外,我不知道内置算术运算符是否真的存在真正意义上的函数实例。我看过Functional library,而且看起来很酷。我只是想知道是否有任何方法可以只用CoreJS来实现这一点。而@Pointy我也在想同样的事情。它们可能不是函数对象,但有一种逻辑,它的执行方式与函数的执行方式类似。我对这个问题很感兴趣,从学术角度来说,但我从未见过任何参考文献会让我认为在某个地方存在这样的函数对象。然而,Javascript令人无限惊讶。@Pointy:我一直认为大多数算术运算符都是在CPU级别运行的。但JavaScript可能不是这样。我不想为了操作而给你+1,但这是真的,你对此无能为力。@musicfreak:lol谢谢;-)我经常想到这一点,因为有时我不得不检查变量的状态,以决定是
+
还是
-
,但是如果我只传递
+
-
语句,它会保存一整条
,如果
语句!除非一些流氓JavaScript专家证明了这一点,否则这似乎就是答案:(。
var aPlusAbsB = function(a, b) {
    return (function(a, b) { b > 0 ? a + b : a - b })(a, b);
}