Опираясь на решение Эндрю Мойлана , можно создать блочную функцию, которая бы принимала правила:
SetAttributes[BlockRules, HoldRest]
BlockRules[rules_, expr_] :=
Block @@ Append[Apply[Set, Hold@rules, {2}], Unevaluated[expr]]
Затем вы можете сохранить свои числовые правила в переменной и использовать BlockRules.[сохраненные правила, код] или даже определить функцию, которая будет применять фиксированный набор правил, например, так:
In[76]:= NumericCheck =
Function[body, BlockRules[{a -> 3, b -> 2`}, body], HoldAll];
In[78]:= a + b // NumericCheck
Out[78]= 5.
РЕДАКТИРОВАТЬ В ответ на комментарий Тимо может быть возможно использовать NotebookEvaluate (новое в 8) для достижения запрошенного эффекта.
SetAttributes[BlockRules, HoldRest]
BlockRules[rules_, expr_] :=
Block @@ Append[Apply[Set, Hold@rules, {2}], Unevaluated[expr]]
nb = CreateDocument[{ExpressionCell[
Defer[Plot[Sin[a x], {x, 0, 2 Pi}]], "Input"],
ExpressionCell[Defer[Integrate[Sin[a x^2], {x, 0, 2 Pi}]],
"Input"]}];
BlockRules[{a -> 4}, NotebookEvaluate[nb, InsertResults -> "True"];]
В результате этой оценки вы получите блокнот с вашими командами, оцененными, когда локально было установлено значение 4. Чтобы продолжить, вам нужно будет взять блокнот с вашим кодом, открытьновый блокнот, оцените Notebooks[]
, чтобы найти интересующий блокнот, а затем выполните:
BlockRules[variablerules,
NotebookEvaluate[NotebookPut[NotebookGet[nbobj]],
InsertResults -> "True"]]
Надеюсь, вы сможете реализовать эту идею.