62

ジェイミー・ザウィンスキーは、彼の(1997)の記事「javasucks」でその用語を、それが何を意味するのかを知っている必要があるかのように使用しています。

私は下向きのfunargsの欠如を本当に嫌いです。匿名のクラスは不完全な代用です。(私は長命のクロージャなしで生きることができますが、関数ポインターの欠如は大きな苦痛を感じます。)

Lisperの俗語のようで、ここで次の簡単な定義を見つけることができましたが、どういうわけか、私はまだそれを理解していないと思います:

多くのクロージャは、それらが参照するバインディングの範囲内でのみ使用されます。これらは、Lisp用語では「下向きのfunargs」として知られています。

スティーブ・エッゲがいなかったら、今はバカになっていると思いますが、質問しても大丈夫かもしれません。

ジェイミー・ザウィンスキーはヒーローです。生きている伝説。[...] 「下向きのfunargs」という用語を使用して、それを説明するように大胆に頼むだけであなたを睨みつけることができる男、あなたはバカです。

--XEmacsは死んでいて、長生きするXEmacs

それで、私のようなCスタイルのプログラマーのためにこれをコンパイルできるLisperはここにありますか?

4

4 に答える 4

58

下向きのfunargsは、返されないか、宣言スコープを離れないローカル関数です。それらは、現在のスコープから他の関数​​にのみ下向きに渡すことができます。

2つの例。これは下向きのfunargです:

function () {
    var a = 42;
    var f = function () { return a + 1; }
    foo(f); // `foo` is a function declared somewhere else.
}

これはそうではありませんが:

function () {
    var a = 42;
    var f = function () { return a + 1; }
    return f;
}
于 2009-02-24T10:12:35.700 に答える
16

Common Lisp では:

(let ((a 3))
  (mapcar (lambda (b) (+ a b))
          (list 1 2 3 4)))

->  (4 5 6 7)

上記の形式では、ラムダ関数が DOWNWARD に渡されます。高階関数 MAPCAR (引数として関数と値のリストを取得し、リストの各要素に関数を適用して結果のリストを返す) によって呼び出された場合、ラムダ関数は引き続き変数を参照します。 LET 式の 'a'。しかし、それはすべて LET 式の中で起こります。

上記をこのバージョンと比較してください。

(mapcar (let ((a 3))
          (lambda (b) (+ a b)))
        (list 1 2 3 4))

ここでは、ラムダ関数が LET から返されます。少し上向き。その後、MAPCAR に渡されます。MAPCAR がラムダ関数を呼び出すと、その周囲の LET は実行されなくなります - それでも関数は LET から変数 'a' を参照する必要があります。

于 2009-02-24T15:45:02.513 に答える
12

WikiにはFunarg問題と呼ばれるかなり説明的な記事があります

「下向きのfunargは、その関数が実際に実行されていないときの関数の状態を指す場合もあります。ただし、定義上、下向きのfunargの存在は、それを作成する関数の実行に含まれているため、関数のアクティブ化レコードです。通常はスタックに保存できます。」

于 2009-02-24T10:11:36.247 に答える