Ну, вот один из способов обойти (как мне кажется) ваша проблема, настроив $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
, который вы случайно ввели в таблицу символов, когда впервые оценили числовой блок. Из-за возможных ошибок, подобных этой, я лично не использую этот подход.
Редактировать: исправлена ошибка (необходимо скрывать «глобальный» контекст при выполнении заданий в числовом контексте)