Ale*_*kov 5 wolfram-mathematica
我希望暂时重命名内置符号并使用不同的名称,同时阻止此符号的主名称.例如,我希望以下代码只打印"2"而不是"1"和"3":
Block[{print = Print, Print}, Print[1]; print[2]; Print[3];]
Run Code Online (Sandbox Code Playgroud)
实际上上面的代码什么都没打印.
是否有可能print在完全阻止符号的同时在这些代码中工作Print?
解决方案如
With[{Print = f, print = Print}, Print[1]; print[2]; Print[3];]
Run Code Online (Sandbox Code Playgroud)
不适合,因为Print在这样的代码中没有真正阻止.
在考虑禁用Message内部跟踪的方法时出现了这个问题.
这不是很干净,但我相信它是可用的.
Internal`InheritedBlock[{Print},
Unprotect[Print];
Print[x__] := Null /; ! TrueQ[$prn];
print[x__] := Block[{$prn = True}, Print[x]];
Print[1]; print[2]; Print[3];
]
Run Code Online (Sandbox Code Playgroud)
如果Null在返回中替换函数是不可接受的,则可能需要使用以下内容:
func[x__] := Hold[func[x]] /; ! TrueQ[$prn];
Run Code Online (Sandbox Code Playgroud)
随后是一个ReleaseHold座后.
要么:
func[x__] := zz[x] /; ! TrueQ[$prn];
Run Code Online (Sandbox Code Playgroud)
然后按照块进行: /. zz -> func