Wolfram mathematica 保持某些模式不被评估

Wolfram mathematica 保持某些模式不被评估,wolfram-mathematica,Wolfram Mathematica,我经常需要通过阻止某些定义评估和检查中间结果来进行调试。我通过执行initAll来实现这一点;clearAll[f,g,h]。我不喜欢它,因为 它迫使您将所有内容放在一个init块中 它不够灵活,无法只保留某些模式,如f[1]未评估 相反,我希望有一个列表禁止的模式,并且没有计算任何匹配的模式。我怎样才能做到这一点 编辑 到目前为止,我发现这个模式最有用(这是Michael Pilat的答案,除了HoldForm和BlankNullSequence) eh[expr\uu,symbols:{uu

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

  • 它迫使您将所有内容放在一个init块中
  • 它不够灵活,无法只保留某些模式,如
    f[1]
    未评估
  • 相反,我希望有一个列表
    禁止的
    模式,并且没有计算任何匹配的模式。我怎样才能做到这一点

    编辑 到目前为止,我发现这个模式最有用(这是Michael Pilat的答案,除了HoldForm和BlankNullSequence)


    eh[expr\uu,symbols:{uuuuu Symbol}]:=Block[symbols,HoldForm@Evaluate[expr]

    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\u]
    但允许
    f[x\u,y\u]

    更新

    这是一个函数形式:

    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]
    

    例如,initAll:=(f[x_z]:=x^2;p[x_z]:=x^3)可能类似于Leonid Shifrin的自定义计算器是您想要的?他提到他的计算器可能会给出与内置计算器不同的结果。我更喜欢使用内置的evaluator,可能是通过临时修改值列表。然而,如果这样做比“initAll;clearAll[g,h]”或手动修改f[x_uu]的定义以返回f[1]上未计算的值需要更多的努力,那么这就有点挫败了公平性。我必须承认我使用了
    initAll;clearAll[f,g,h]
    之前的构造…块构造是神奇的。。。但是他们让我的头受伤了。这个版本
    Block[{f=Hold[f[#]]&},f[g[a]^2]
    对我来说更有意义。Michael,理想情况下是的,但如果每次我想尝试对特定类型的输入保持未赋值比手动修改f的定义更难,那么可以将其封装到函数中吗?也就是说,你可以做
    evalHeld[(f[g[a]]^2),{f}]
    ,然后得到上面的结果?请看我的更新=)我也会想出一些方法来阻止
    f
    的特定模式,但我要到假期结束后才能做,因为它有点复杂,而且涉及到向下值操作。