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

Wolfram mathematica 是否可以暂时重命名和阻止内置函数?,wolfram-mathematica,Wolfram Mathematica,我希望暂时重命名一个内置符号,并使用不同的名称,同时阻止此符号的主名称。例如,我希望以下代码只打印“2”,而不打印“1”和“3”: 实际上,上面的代码不打印任何内容 是否可以使打印在这样的代码中工作,同时完全阻止符号打印 解决方案如 With[{Print = f, print = Print}, Print[1]; print[2]; Print[3];] 不适用,因为打印在此类代码中并没有真正被阻止 这个问题是在禁用消息的内部跟踪时出现的。这不是很干净,但我相信它是可以使用的 Inter

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

实际上,上面的代码不打印任何内容

是否可以使
打印
在这样的代码中工作,同时完全阻止符号
打印

解决方案如

With[{Print = f, print = Print}, Print[1]; print[2]; Print[3];] 
不适用,因为
打印
在此类代码中并没有真正被阻止


这个问题是在禁用
消息的内部跟踪时出现的。

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

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

或:


然后在块后面加上:
/。zz->func

Alexey,你确实发现了难题。如果你用Hold而不是f呢?这不是阻止打印(但不是打印)正确吗?@István,现在你的意思似乎很清楚了。问题是,
With
仅替换符号的显式实例,而
Block
临时替换块内所有调用的符号,即使是隐藏的调用。您不是唯一希望使用此功能的人。在这篇文章的第四篇文章中,我描述了一个假设函数
Unblock
,它将完全满足您的需求。理想情况下,它将与
协同工作,允许阻塞和取消阻塞的多层次嵌套。不幸的是,这里没有内置的类似于
的解除阻塞功能。我很高兴知道我错了。托德的工具包技巧的又一个实例!(). 我确实想念$inMsg部分-(就像PortalYep中的立方体朋友,就是那个。忘了他的名字。坦白说!你从哪里了解到内部“继承块”?@belisarius one,从Daniel Lichtblau那里学到的。
func[x__] := Hold[func[x]] /; ! TrueQ[$prn];
func[x__] := zz[x] /; ! TrueQ[$prn];