我希望暂时重命名内置符号并使用不同的名称,同时阻止此符号的主名称。例如,我希望以下代码仅打印“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
内部信息。
答案 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