保持某些模式未被评估

时间:2010-11-23 04:31:55

标签: wolfram-mathematica

我经常需要通过阻止某些定义来评估和检查中间结果来进行调试。我通过initAll;clearAll[f,g,h]来实现这一目标。我不喜欢它,因为

  1. 它会强制您将所有内容放在一个init块中
  2. 它不够灵活,只能保留f[1]未评估的某些模式
  3. 相反,我希望有一个列表forbidden模式,并且有任何匹配左侧未评估的模式。我怎样才能做到这一点?

    修改的 到目前为止,我发现这种模式最有用(除了HoldForm和BlankNullSequence之外,它是Michael Pilat的答案)

    eh[expr_, symbols : {___Symbol}] := Block[symbols, HoldForm@Evaluate[expr]]

1 个答案:

答案 0 :(得分:3)

Block可以帮助您实现目标:

f[x_] := x + 1;
g[x_] := x - 1;

In[13]:= Block[{f},
 Hold@Evaluate[(f[g[a]]^2)]
 ]

Out[13]= Hold[f[-1 + a]^2]

您是否希望阻止对f的某些下限模式进行评估? (例如,阻止f[x_]但允许f[x_, y_])?

<强>更新

这是一种功能形式:

SetAttributes[EvaluateHeld, HoldAll];
EvaluateHeld[expr_, symbols : {__Symbol}] :=
  Block[symbols, Hold@Evaluate[expr]
]

In[7]:= EvaluateHeld[f[g[a]]^2, {f}]

Out[7]= Hold[f[-1 + a]^2]