在Mathematica中使用上下文作为作用域构造

| 考虑到我在大型Mathematica项目中关于在数值模式和解析模式之间进行切换的问题的解决方案,我想到了使用“ 0”作为范围构造的想法。 基本思想是在自己的上下文中进行所有数值分配,例如
Begin[\"Global`Numerical`\"]
par1 = 1;
par2 = 2;
...
End[]
并且在全局范围内具有所有复杂的分析功能,矩阵等。 理想情况下,我将能够在Global上下文中工作,并使用简单的
Begin[Global\'Numeric\']
切换到所有数字,然后再使用
End[]
切换回数字。 不幸的是,由于例如在全局上下文中定义的“ 4”将不使用在全局子上下文中定义的“ 5”,“ 6”等。 有没有一种方法可以使子上下文从其父上下文继承定义?还有其他使用上下文创建简单可切换范围的方法吗?     
已邀请:
嗯,这是解决问题的一种方法(我认为)是通过适当调整ѭ7来解决的问题:
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;
我说它很脆弱的原因是,除非您小心,否则很容易将符号放入错误的上下文中。例如,假设您在评估\“ numerical \”块之前忘记在全局上下文中评估f。好吧,现在您的数字块将不能简单地工作,因为它将变成一个(完全有效的)符号“ 11”,您在初次评估数字块时无意中将其输入了符号表。由于存在此类潜在错误,因此我个人不使用这种方法。 编辑:修复了一个错误(在数字上下文中进行赋值时,必须隐藏\“ Global \”上下文)     

要回复问题请先登录注册