Tim*_*imo 4 wolfram-mathematica scoping
考虑到我之前关于在大型Mathematica项目中切换数值和分析"模式"的问题的解决方案,我想到了使用Context作为范围构造的想法.
基本思想是在自己的上下文中进行所有数值赋值,例如
Begin["Global`Numerical`"]
par1 = 1;
par2 = 2;
...
End[]
Run Code Online (Sandbox Code Playgroud)
并且在全局背景下具有所有复杂的分析函数,矩阵等.
理想情况下,我可以在全局上下文中工作,并通过简单Begin[Global'Numeric']切换回数字的所有内容End[].
不幸的是这不是DOEN工作,因为如f[par1_,par2_,...] := foo在全球范围内定义不会用par1,par2等已经在全球的背景下子被定义.
有没有办法让子上下文从父上下文继承定义?是否有其他方法可以使用上下文来创建简单的可切换范围?
好吧,通过$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;
Run Code Online (Sandbox Code Playgroud)
现在,这将分析评估:
f[par1, par2]
Run Code Online (Sandbox Code Playgroud)
这个数字:
savedContextPath = $ContextPath;
Begin["GlobalTestCtxt`Numerical`"];
$ContextPath = Prepend[$ContextPath, $Context];
f[par1, par2]
End[];
$ContextPath = savedContextPath;
Run Code Online (Sandbox Code Playgroud)
我说它很脆弱的原因是,除非你小心,否则很容易将符号带入错误的环境中.例如,假设您在评估"数字"块之前忘记在全局上下文中评估f.好了,现在你的数值块将不只是工作,因为它会求助于(完全有效)符号GlobalTestCtxt`Numerical`f,你无意中进入了符号表当你第一次评估的数值块.由于这样的潜在错误,我个人不使用这种方法.
编辑:修复了一个错误(在数字上下文中进行赋值时,有必要隐藏"全局"上下文)
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |