在 Andrew Moylan 的 solution 的基础上,可以构造一个需要规则的 Block 类函数:
SetAttributes[BlockRules, HoldRest]
BlockRules[rules_, expr_] :=
Block @@ Append[Apply[Set, Hold@rules, {2}], Unevaluated[expr]]
然后您可以将您的数字规则保存在一个变量中,并使用 BlockRules[ savedrules, code ],甚至定义一个可以应用一组固定规则的函数,有点像这样:
In[76]:= NumericCheck =
Function[body, BlockRules[{a -> 3, b -> 2`}, body], HoldAll];
In[78]:= a + b // NumericCheck
Out[78]= 5.
编辑响应 Timo 的评论,可能可以使用 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"];]
作为此评估的结果,您将获得一个笔记本,其中当 a 本地设置为 4 时对您的命令进行评估。为了更进一步,您必须使用该笔记本
使用您的代码,打开一个新笔记本,评估 Notebooks[] 以识别感兴趣的笔记本,然后执行:
BlockRules[variablerules,
NotebookEvaluate[NotebookPut[NotebookGet[nbobj]],
InsertResults -> "True"]]
我希望你能把这个想法付诸实践。