1

我编写了以下函数作为我正在开发的 jQuery 插件的一部分:

$.fn.append2 = function(collection, callback) {
    var $this = this;

    $.each(collection, function(key, value) {
        $this.append(callback ? callback(key, value) : value);
    });

    return this;
};

在测试了一个高度依赖的高度递归函数后.append2,我优化.append2为:

$.fn.append2 = function(collection, callback) {
    var $this = this;

    $.each(collection, callback
        ? function(key, value) { $this.append(callback(key,value)); }
        : function(key, value) { $this.append(value); }
    );

    return this;
};

虽然这段代码在速度方面效率更高,但它仍然让我不满意。本质上,我已经两次定义了相同的函数:

function(key, value) { $this.append(callback(key,value)); }
function(key, value) { $this.append(value); }

我想知道是否有任何语言可以让我只定义一次函数:

function(key, value) { $this.append(value); }

然后通过将参数替换为$this.appendfrom valueto 对其进行操作callback(key, value)。(而且,不,不是通过操纵字符串。通过操纵函数本身。)

有没有这样的编程语言?

4

6 回答 6

5

任何谐音语言都可以让你在某种程度上做到这一点。所有的 Lisp 语言都允许你在程序上从零碎的东西中构建函数,然后像往常一样调用它们。Io语言很少见,因为我相信它会让你走另一条路:给定一个函数,你可以拆开它的源代码并对其进行操作

于 2011-02-28T02:29:37.577 回答
4

嗯……答案是肯定的和否定的。如果您想修改函数本身,那么我认为这是不可能的,因为该函数只是二进制数据。但是您可能想研究一下 Scheme: Scheme 中的所有内容都是一个“列表”(包括函数的主体),只要您没有评估主体,您可以随意更改它。查看eval了解更多信息。

于 2011-02-27T06:21:10.377 回答
2

许多语言都反映了它们允许替换参数等的水平(包括 Java、C#、Smalltalk 和 Ruby,我相信)。但是,当您让程序的一部分改变另一部分时,就会出现关注点分离问题。您可以为其设置一个默认值callbackreturn value; 这将是一个更优雅的解决方案,它将删除条件表达式。

于 2011-02-27T06:15:46.057 回答
1

问题的症结在于这句话:

callback
    ? function(key, value) { $this.append(callback(key,value)); }
    : function(key, value) { $this.append(value); }

在 Mathematica 中,您可以(大致)将其重新表达如下:

Function[{key, value}, Append[this, callback[key, value]]] /.
  HoldPattern[callback[_, v_]] /; callback === undefined :> v

...牢记这一点,this并且undefined在 Mathematica 中没有特殊含义。在不深入细节的情况下,这个表达式首先定义了一个无条件调用的函数callback。然后,它将该函数的主体转换为value仅在callback具有值的情况下使用undefined。在惯用的 Mathematica 中,有更简单的方法来处理这种简单的情况,但它说明了所要求的能力,并且在更复杂的情况下是一个有用的工具。

于 2011-03-02T06:38:12.087 回答
1

至于您希望“在调用者和被调用者之间插入一个函数”

看看(Emacs)Lisp 中的建议,以及面向方面编程的概念。

于 2011-03-03T14:19:52.510 回答
0

如果我了解您正在寻找的内容,则仿函数可能会提供解决方案。通过操纵函子状态/参数,您可以通过更改函数操作的对象/信息来实现您描述的行为。

于 2011-03-02T10:51:10.653 回答