4

大規模な Mathematica プロジェクトでの数値と解析の「モード」の切り替えに関する以前の質問に対する解決策を考えてContextいたとき、スコープ構造として を使用するというアイデアについて考えました。

基本的な考え方は、すべての数値の割り当てを独自のコンテキストで行うことです。たとえば、

Begin["Global`Numerical`"]
par1 = 1;
par2 = 2;
...
End[]

そして、すべての複雑な分析機能、マトリックスなどをグローバル コンテキストで備えています。

理想的には、グローバル コンテキストで作業し、すべてを単純な数値にBegin[Global'Numeric']切り替えて、元に戻すことができEnd[]ます。

残念ながら、これは機能しません。たとえばf[par1_,par2_,...] := foo、グローバル コンテキストで定義されたものは、グローバルのサブ コンテキストで定義された 、などをpar1使用しないためです。par2

サブコンテキストに親コンテキストから定義を継承させる方法はありますか? コンテキストを使用して単純な切り替え可能なスコープを作成する他の方法はありますか?

4

1 に答える 1

5

さて、これを回避する1つの方法(私が思うに)は、 $ContextPath適切に調整することによるあなたの問題です:

SetOptions[EvaluationNotebook[], CellContext -> "GlobalTestCtxt`"];
Remove[f, GlobalTestCtxt`Numerical`f, par1, par2];
f[par1_, par2_] := {par1, par2};

savedContextPath = $ContextPath;
Begin["GlobalTestCtxt`Numerical`"];
Print[{$ContextPath, $Context}];
$ContextPath = DeleteCases[$ContextPath, "GlobalTestCtxt`"];
par1 = 1;
par2 = 2;
End[];
$ContextPath = savedContextPath;

さて、これは分析的に評価されます:

f[par1, par2]

そして、これは数値的に:

savedContextPath = $ContextPath;
Begin["GlobalTestCtxt`Numerical`"];
$ContextPath = Prepend[$ContextPath, $Context];
f[par1, par2]
End[];
$ContextPath = savedContextPath;

壊れやすいと私が言う理由は、注意しないと、シンボルを間違ったコンテキストに簡単に取り込んでしまうからです。たとえば、「数値」ブロックを評価する前に、グローバル コンテキストで f を評価するのを忘れたとします。GlobalTestCtxt`Numerical`fさて、最初に数値ブロックを評価したときに誤って記号テーブルに入力した (完全に有効な) 記号に変わるため、数値ブロックは機能しません。このような潜在的なバグのため、私は個人的にこのアプローチを使用しません。

編集:バグを修正しました(数値コンテキストで割り当てを行う場合、「グローバル」コンテキストを非表示にする必要があります)

于 2011-04-14T20:54:28.307 に答える