Использование контекста как обзорной конструкции в Mathematica - PullRequest
4 голосов
/ 14 апреля 2011

Думая о решении моего предыдущего вопроса о переключении между числовым и аналитическим "режимами" в большом проекте Mathematica, я подумал об идее использования Context в качестве обзорной конструкции.

Основная идея состоит в том, чтобы делать все присвоения числовых значений в их собственном контексте, например,

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

и имеют все сложные аналитические функции, матрицы и т. Д. В глобальном контексте.

В идеале я мог бы работать в глобальном контексте и переключиться на все числовое с помощью простого Begin[Global'Numeric'] и переключиться обратно с помощью End[].

К сожалению, это не работает, так как, например, f[par1_,par2_,...] := foo, определенный в глобальном контексте, не будет использовать par1, par2 и т. Д., Которые были определены в подконтексте Global.

Есть ли способ заставить под-контексты наследовать определения от их родительского контекста? Есть ли другой способ использовать контексты для создания простой переключаемой области?

1 Ответ

5 голосов
/ 15 апреля 2011

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

Редактировать: исправлена ​​ошибка (необходимо скрывать «глобальный» контекст при выполнении заданий в числовом контексте)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...