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

发布于 2024-11-03 17:09:28 字数 557 浏览 0 评论 0原文

我希望暂时重命名内置符号并使用不同的名称,同时阻止该符号的主名称。例如,我希望以下代码仅打印“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 并未真正被阻止在此类代码中。

思考禁用消息跟踪的方法时,出现了这个问题内部结构。

I wish to temporarily rename a built-in symbol and use it with different name while block the main name of this symbol. For example, I wish the following code to print only "2" but not "1" and "3":

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

In really the above code prints nothing.

Is it possible to make print working inside such code while completely block symbol Print?

Solutions like

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

are not suitable since Print is not really blocked inside such code.

The question appeared while thinking on a way to disable tracing of Message internals.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

被翻牌 2024-11-10 17:09:28

这不是很干净,但我相信它是有用的。

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];

在 Block 后跟随一个 ReleaseHold

或者:

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

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

This is not very clean, but I believe it is serviceable.

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

If it is not acceptable to have the function replaced with Null in the return, you may need to use something like:

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

Followed by a ReleaseHold after the Block.

Or:

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

and then follow the Block with: /. zz -> func

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文