2

次のプロパティを持つ言語構造はどのように呼び出されますか?

  • 関数のように、始まりと終わりがあります
  • 名前を含むヘッダーがあります。これも関数のようですが、引数はありません
  • 関数のように、最初と最後の間に任意の数のステートメントが存在する可能性があります

  • 関数を使用して、どこからでも(それ自体でも)最初にジャンプでき、関数に含まれるステートメントが最後に到達するまで実行されます。

  • 関数を使用して、その内容の実行をすぐに停止し、元の場所に戻ることができます

  • そこに含まれるコードは他のすべてと同じスコープにあるため、外部のすべての変数にアクセスして、構成を離れるときに削除されない新しい変数を作成できます。

全体として、それはgoto終わりとそれが呼び出された場所に戻るオプションを備えたポイントのようなものです。

4

4 に答える 4

2

BASICにはこれがあり、呼び出されgosubました。適切な関数に対する唯一の利点は、すべての変数が同じスコープ内にある最後のポイントでした。それを超えてそれは吸いました。

オブジェクト指向言語では、必要な変数をオブジェクトにカプセル化し、異なるメソッドを相互に呼び出すことで、ほぼ同じ効果を得ることができます。複数のエントリポイントはほとんどの言語の機能ではありませんが、メソッドを小さな部分に分割することでそれを回避できます。

于 2010-04-06T10:33:16.233 に答える
1

クロージャの概念が関連している可能性があります。

クロージャは関数ですが、あるスコープ(たとえば、別の関数)で定義されており、そのスコープ内のすべての変数にアクセスできます。したがって、ヘッダーで宣言され、(通常は)名前が付けられていることを除いて、リストされているほとんどのプロパティがあります。ヘッダーは、いずれにせよ、そのような機能ではなく、言語実装の詳細です:-)。通常、クロージャーは、それらが定義されている関数から返すことができ、GC言語では、クロージャーは使用するローカル変数への参照を維持します。

また、Perlには2種類のスコープ変数(字句変数( "my")と動的変数( "local"))があることも考慮してください。字句変数は、C、Javaなどから慣れ親しんだローカル変数です。動的変数は、それらを宣言したブロックから呼び出されたすべての関数から表示されます。したがって、すべての変数がで宣言されている場合local、すべてのPerl関数には目的のプロパティがあります。

いずれの場合も、「関数を終了しても破棄されない新しい変数を作成する」ことを見逃していました。関数で宣言された変数がグローバルスコープを持っていることを前提としているため、これは非常にまれです。これは、ほとんどの言語では一般的なケースではありません。通常、グローバルオブジェクトを作成し、そこに何かをぶら下げることで偽造できますが、それが役立つことはめったにありません。

于 2010-04-06T10:49:22.690 に答える
0

subroutines質問には「言語に依存しない」というタグが付けられているので、の構成はの構成と同義であると付け加えproceduresます。

proceduresたとえばSQL実装には、言語に依存するニュアンスがいくつかあります。

  • スコープが分離されています(無実の待機変数を台無しにしないように)。
  • INOUTまたはINOUTパラメータを含むオプションの引数リストがあります。
  • またはパラメータreturnの値を変更するだけで、何もしません。OUTINOUT

@Steve JessopClosuresは、私の本ではまったく異なる種類のモンスターです。

それらは、の多くの機能を模倣しますが、独自の引数リストと呼び出しスタックを備えているため、 /procedureではなく外部スコープにアクセスできる関数になります。proceduresubroutine

于 2011-05-29T18:37:29.543 に答える
-1

プログラムの構造から、私はそれをスクリプトと呼びます。例:シェル/バッチスクリプト。

たぶん、タスクはその種の構造のより良い名前です、それはスクリプト自体を参照するだけでそのまま実行できるJavaScriptまたはPerlを使用するスクリプトである可能性があります。

于 2010-04-06T10:34:45.063 に答える