5

私はこれを持っていると思いますが、確認したいと思います。

  1. 動的スコープでは、変数は単に呼び出しスタックに依存するため、ネストされた関数を使用するか、別の関数を使用するかは関係ありません。

  2. 純粋関数のみが含まれるため、ネストされた関数を使用するか、別の関数を使用するかは関係ありません。これは、スコープのタイプに関係なく当てはまります。

  3. 字句スコープを使用すると、ネストされた関数は、動的スコープを使用した関数の呼び出しをほぼ模倣します。

  4. 字句スコープを使用すると、純粋関数から完全に記述されたプログラム(おそらく、標準出力への単一の不純な印刷を可能にする)は、ガベージコレクションを必要としません。それが違いを生むのであれば、私はこの質問のために入れ子関数拡張を備えたGNUCを具体的に考えています。

注:純粋関数とは、完全に純粋関数を意味します。「読み取る」のはパラメーターだけであり、「書き込まれる」のは関数の戻り値だけです。

ありがとう

4

2 に答える 2

2

あなたはそれを正しく持っています。ただし、これをケースバイケースのニーモとして頭に入れようとはしません.理由を理解しようとすると、驚くことは少なくなります.

このトピックに関するドキュメント ( http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html ) はかなり優れています。C でスタックがどのように機能するかを知っていれば、すぐに理解できるはずです。

また、あなたの質問を考えると、役に立つかもしれないインターウェブで見つけた贈り物:

#define lambda(type, body) ({ \
    type __anon_func__ body \
    __anon_func__; \
})

int (*foo) (double) = lambda(int, (double x) { return (int) x; });
于 2012-05-23T16:30:26.023 に答える
1

これに C と Lisp のタグを付けたとしても、特定の言語を念頭に置いていると役立ちますが、2 つの言語はかなり異なるため、いくつかの具体的な例がないと非常に役に立ちません。私は、C が動的にスコープされているとはまったく考えていません。また、動的および字句スコープの多くの組み合わせとバリエーションをサポートする多数の Lisp が存在します。

  1. これは正しいのですが、一部の言語では動的スコープとレキシカル スコープの両方をサポートし、プログラマがどちらを使用するかを指定できるようにすることでこれを複雑にしています (Clojure と Common Lisp など)。

  2. これも正しいです。この場合、あなたが話しているのは、副作用がなく、自由変数のない関数です。

  3. これは正確には正しくありません。それよりも複雑です。ファーストクラスの関数とクロージャーをサポートするレキシカルスコープを持つ言語では、ネストされた関数は、それが定義されている環境にバインドされている自由変数を閉じ、その関数を外側のスコープに戻すことができ、それらの閉じられた変数アクセス可能で、それらが定義された元のスコープを参照します。繰り返しますが、これは特定のプログラミング言語の具体的な例がなければ要約で話すのは難しいため、何かを念頭に置いている場合は、コードサンプルで質問を編集する必要があります.

  4. 「ゴミ掃除」の意味がわからない?自動メモリ管理のようにガベージ コレクションを参照している場合、これは一般的に正しくありませんが、ネストされた関数を使用する GNU C の特定のケースについてはコメントしません。それがどのように機能するか正確にはわかりません。

于 2012-05-23T16:28:36.400 に答える