是否可以临时重命名和阻止内置函数?

时间:2011-04-27 06:56:12

标签: wolfram-mathematica

我希望暂时重命名内置符号并使用不同的名称,同时阻止此符号的主名称。例如,我希望以下代码仅打印“2”而不打印“1”和“3”:

Block[{print = Print, Print}, Print[1]; print[2]; Print[3];]

实际上上面的代码什么都没打印。

是否可以在完全阻止符号print的同时使Print在此类代码中工作?

这样的解决方案
With[{Print = f, print = Print}, Print[1]; print[2]; Print[3];] 

不合适,因为Print并未真正阻止此类代码。

问题出现在thinking期间,禁止跟踪Message内部信息。

1 个答案:

答案 0 :(得分:6)

这不是很干净,但我相信它是可以使用的。

Internal`InheritedBlock[{Print},
  Unprotect[Print];
  Print[x__] := Null /; ! TrueQ[$prn];
  print[x__] := Block[{$prn = True}, Print[x]];
  Print[1]; print[2]; Print[3];
]

如果在回复中将函数替换为Null是不可接受的,则可能需要使用以下内容:

func[x__] := Hold[func[x]] /; ! TrueQ[$prn];

在阻止后跟ReleaseHold

或者:

func[x__] := zz[x] /; ! TrueQ[$prn];

然后按下阻止:/. zz -> func