我经常需要通过阻止某些定义来评估和检查中间结果来进行调试。我通过initAll;clearAll[f,g,h]
来实现这一目标。我不喜欢它,因为
f[1]
未评估的某些模式相反,我希望有一个列表forbidden
模式,并且有任何匹配左侧未评估的模式。我怎样才能做到这一点?
修改的 到目前为止,我发现这种模式最有用(除了HoldForm和BlankNullSequence之外,它是Michael Pilat的答案)
eh[expr_, symbols : {___Symbol}] := Block[symbols, HoldForm@Evaluate[expr]]
答案 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]