我知道我正在中止评估,并且当侧面的黑条消失时可以看到它。所以不需要这个消息。我该如何关闭它?
答案 0 :(得分:6)
以下是Simon建议的基于$Pre
的方法以及Mr.Wizard建议的基于$Post
的方法的概括。
在这两种情况下,都应该将HoldAllComplete
属性设置为纯函数,并将x
(输入表达式)包含在Unevaluated
内,以便它们与Head
的输入一起正常工作s Sequence
,Unevaluated
和Evaluate
。
比较基于$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 Sequence
和Unevaluated
的输入表达式工作不正常。对于没有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}]