gpt4 book ai didi

wolfram-mathematica - 在 Mathematica 中使用上下文作为范围构造

转载 作者:行者123 更新时间:2023-11-30 23:51:08 26 4
gpt4 key购买 nike

想办法解决我的previous question关于在一个大型 Mathematica 项目中在数值和分析“模式”之间切换,我想到了使用 Context 的想法作为作用域构造。

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

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

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

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

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

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

最佳答案

好吧,这是通过调整 $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 ,您在第一次计算数字块时无意中将其输入到符号表中。由于像这样的潜在错误,我个人不使用这种方法。

编辑:修复了一个错误(在数字上下文中进行赋值时需要隐藏“全局”上下文)

关于wolfram-mathematica - 在 Mathematica 中使用上下文作为范围构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5668864/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com