4

考虑到我之前关于在大型 Mathematica 项目中切换数值和分析“模式”的问题的解决方案,我想到了将其Context用作范围构造的想法。

基本思想是在它们自己的上下文中进行所有数值赋值,例如

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

并具有全局上下文中所有复杂的分析函数、矩阵等。

理想情况下,我将能够在 Global 上下文中工作,并使用简单的数字切换到所有数字,Begin[Global'Numeric']然后使用End[].

不幸的是,这不起作用,因为例如f[par1_,par2_,...] := foo在 Global 上下文中定义的将不会使用已在 Global 的子上下文中定义的 , 等par1par2

有没有办法让子上下文从其父上下文继承定义?有没有其他方法可以使用上下文来创建一个简单的可切换范围?

4

1 回答 1

5

$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 回答