如何解决在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 \”上下文)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。