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;
};

このコードは速度の点ではより効率的ですが、それでも私は満足できませんでした。基本的に、同じ関数を2回定義しました。

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

そして、関数を次のように一度だけ定義できる言語があるかどうか疑問に思いました。

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

$this.append次に、引数をfromからvalueに置き換えて操作し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など)。ただし、プログラムの一部が別の部分を変更している場合は、関心の分離の問題があります。;callbackを返すだけのデフォルト値を設定できます。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

...それを念頭に置いて、Mathematicaでは特別な意味はthisありundefinedません。詳細に立ち入ることなく、この式は最初に無条件にを呼び出す関数を定義しますcallback。次に、その関数の本体を変換して、値がのvalue場合にのみ使用するようにします。慣用的なMathematicaでは、そのような単純なケースを処理する簡単な方法がありますが、それは要求された機能を示しており、より複雑な状況で役立つツールです。callbackundefined

于 2011-03-02T06:38:12.087 に答える
1

「発信者と着信者の間に機能をプラグイン」したいというあなたの願望について:

たとえば、(Emacs)Lispのアドバイスや、アスペクト指向プログラミングの概念を見てください。

于 2011-03-03T14:19:52.510 に答える
0

私があなたが探しているものを理解しているなら、おそらくファンクターが解決策を提供します。ファンクターの状態/パラメーターを操作することにより、関数が操作するオブジェクト/情報を変更することにより、説明した動作を実現できます。

于 2011-03-02T10:51:10.653 に答える