如何隐藏$ Aborted消息?

时间:2011-05-31 23:31:40

标签: wolfram-mathematica

我知道我正在中止评估,并且当侧面的黑条消失时可以看到它。所以不需要这个消息。我该如何关闭它?

3 个答案:

答案 0 :(得分:6)

以下是Simon建议的基于$Pre的方法以及Mr.Wizard建议的基于$Post的方法的概括。

在这两种情况下,都应该将HoldAllComplete属性设置为纯函数,并将x(输入表达式)包含在Unevaluated内,以便它们与Head的输入一起正常工作s SequenceUnevaluatedEvaluate

比较基于$Pre的解决方案的两个版本:

f1 = Function[{x}, CheckAbort[x, Null], {HoldAll}]
f2 = Function[{x}, CheckAbort[Unevaluated@x, Null], {HoldAllComplete}]

In[3]:= f1@Sequence[1,2]
f1@Abort[]
f1@Evaluate[Abort[]]
f1@Unevaluated[1+1]
Out[3]= 1
Out[5]= $Aborted
Out[6]= 2

In[7]:= f2@Sequence[1,2]
f2@Evaluate[Abort[]]
f2@Unevaluated[1+1]
Out[7]= Sequence[1,2]
Out[9]= Unevaluated[1+1]

可以看到第一个版本很容易被Evaluate[Abort[]]打破,并且对于Head s SequenceUnevaluated的输入表达式工作不正常。对于没有HoldAllComplete属性的任何单参数函数,通常都是如此。由于$Pre$Post和朋友都是单参数函数,因此必须始终为它们设置HoldAllComplete属性。

我也发现使用Null作为CheckAbort的第二个参数没有问题(不需要Return@Null)。在我的机器上(Windows 2000下的 Mathematica 7.0.1)$Abort中永远不会返回f2

基于$Post的解决方案也是如此。它可以概括如下:

$Post = Function[x, If[Unevaluated@x =!= $Aborted, Unevaluated@x], 
  HoldAllComplete]

测试表达式:

In[14]:= Unevaluated[1+2]
Sequence[1,2]
$Aborted
Abort[]
Out[14]= Unevaluated[1+2]
Out[15]= Sequence[1,2]

答案 1 :(得分:5)

如果您没有将$Post用于其他内容,或者如果您可以组合功能,则可以使用:

$Post = # /. $Aborted -> Null &;

请注意,您可能会破坏内容,因为程序可能会在其控制流程中使用$Aborted


更强大,解决Alexey的问题:

$Post = Function[Null, Unevaluated@# /. $Aborted -> Null, HoldAllComplete];

答案 2 :(得分:3)

以下似乎可以工作:

SetAttributes[katch, HoldAll];
katch[x_] := CheckAbort[x, Return@Null] 
$Pre = katch;

经过测试,请记住将$ Pre返回到之前的值:

$Pre =.

可能会干扰某些内部中止捕获。

修改

Simon的版本:

$Pre = Function[{x}, CheckAbort[x,Return@Null], {HoldAll}]