2010-11-23 69 views
4

我经常需要通过防止某些定义来评估和检查中间结果来进行调试。我通过做initAll;clearAll[f,g,h]来完成这项工作。因为保持某些模式未评估

  1. 它迫使你把一切都放在一个初始化块
  2. 这是不够灵活,只有保持一定的模式,如不计算f[1]

相反,我想我不喜欢它有一个列表forbidden模式,并有任何模式匹配左未评估。我怎样才能做到这一点?

编辑 到目前为止,我发现这种模式最有用的(这是迈克尔·派拉特的答案,除了与HoldForm和BlankNullSequence)

eh[expr_, symbols : {___Symbol}] := Block[symbols, [email protected][expr]]

+0

initAll ...? <6 more to go> – 2010-11-23 05:34:17

+0

即,initAll:=(f [x _]:= x^2; p [x _]:= x^3) – 2010-11-23 05:48:38

回答

3

Block可以用你想要的帮助:

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

In[13]:= Block[{f}, 
[email protected][(f[g[a]]^2)] 
] 

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

您是否想要阻止评估f的某些低值模式? (例如,块f[x_]但允许f[x_, y_])?

UPDATE

这里有一个函数形式:

SetAttributes[EvaluateHeld, HoldAll]; 
EvaluateHeld[expr_, symbols : {__Symbol}] := 
    Block[symbols, [email protected][expr] 
] 

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

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