2011-12-22 15 views
4

親モジュールだけで使用される小さなタスクを行う独自のローカルシンボルを持つ(親モジュール内の)ローカルモジュールを作成できることが時々役立つことがあります。これは、モジュールが大きくなり、そのヘルパー関数が実際に必要とされ、その1つの親モジュールだけで使用されるので、モジュールの外側に小さなヘルパー関数を作成する正当な理由はありません。ここで同じローカルシンボルを使用して、別のモジュール内にモジュールを作成することは安全ですか?

1つのモジュールと愚かな例であり、内部のヘルパーモジュール何か

foo[x_] := Module[{r}, 

    r = Module[{y, sol}, 
    sol = [email protected][y^2 + 3 y + 2 == 0]; 
    y /. sol 
    ]; 

    x^r 

    ] 

にしかし、上記の問題点は、内部モジュールのローカル変数は、ローカル変数と競合するかもしれないということです親モジュールでは、以下のようにするとMノートブックが内部モジュールのローカル変数を赤にしてしまうので、私は何もしていないことを私に伝えています。(私はいつでもチェックして心配したくありません親モジュールのローカルシンボルとして使用されている固有のローカルシンボルとは異なる固有のローカルシンボルを使用します。結局、ローカルであるはずです。また、これがthのときに別のシンボル名Eケース)

foo[x_] := Module[{r, y=0}, 

    r = Module[{y, sol}, 
    sol = [email protected][y^2 + 3 y + 2 == 0]; 
    y /. sol 
    ]; 

    x^r 

    ] 

注意ヘルプによれば、ローカルスコープの競合または複数のコンテキストでシャドウイングである赤色着色、。

enter image description here

(Mは、より優れた色を使用するために多くの色、赤のすべての色合いの違いを作るのは難しい必要があります)。

enter image description here

(私はそれがシャドウイングwarniongだと思います)いずれにしても、それは私が、私はそれを使用したとき、私は、このような構造に問題を見ていないにもかかわらず、これを行うことになっておりませんと言われます。

この例では、親モジュールのローカル変数 'y'の値が、内部モジュール 'r'の呼び出しによって上書きされませんでした。

この小さなタスクはfoo []によってのみ使用され、グローバルコンテキストに移動する必要はないので、fooの外部で関数を作りたいとは思わなかった。

foo[x_] := Module[{r, y, sol}, 

    sol = [email protected][y^2 + 3 y + 2 == 0]; 
    r = y /. sol; 

    x^r 

    ] 

しかし、私はちょうど例を挙げていますが、これはそれがさらにいくつかの小さなタスクにモジュール自体の内部の作業を中断することができます大規模なモジュールのためのものです:

勿論、私はいつもちょうど書くことができます。内部関数、内部関数は、私がAda/Pascalなどの他の言語でこれまで使用していたもので、この構造を持ち、大規模なプログラムに役立ちます。

私の質問は:Mが私にこの赤色の警告メッセージを表示するにもかかわらず、私が上記を使用するのが安全かどうかをここでは専門家に確認したいのですか?私は私の知る限り、この

おかげで、

+1

btwでは、構文とエラーの強調表示の色を変更できます。色をクリックするだけで色の選択が可能なカラーパレットが表示されます。私は私の色を違う色に変えました。 – abcd

+0

MathGroupを検索すると、スコープが間違っていることに関するいくつかの苦情があります。これは、私がいつもそうしたことに対処するときには自信がないように感じさせています(ここで示した単純な例は完全に安全であるとは言えません)。 – Szabolcs

答えて

8

はい、同じ変数をネストしたModulesに入れておけば、のトラックを失わない限り安全です。MathematicaはModuleに定義されている各変数をローカルでモジュールに扱います。ローカル変数はTemporaryであり、番号はvariable$ModuleNumberです。次の例で確認できます。

Module[{x = 1}, 
Print[[email protected], " = ", x] 
    Module[{x = 2}, 
    Print[[email protected], " = ", x] 
    Module[{x = 3}, 
    Print[[email protected], " = ", x] 
    ]; 
    Print[[email protected], " = ", x] 
    ]; 
Print[[email protected], " = ", x] 
] 

(*Output 
x$4576 = 1 
x$4577 = 2 
x$4578 = 3 
x$4577 = 2 
x$4576 = 1 
*) 
2

をすることを心配する必要があるものがある場合、これは検出の小さな問題です。

+0

どのような検出ですか? –

+0

スコープはOKです。 –

+2

Mathematicaの構文ハイライトでは、間違いがある可能性のある事項を強調表示します。私は、この場合の強調表示が設計どおりに完全に動作していることを確信しています。 –