使用Mathematica中的$ NewSymbol移动上下文

Sim*_*mon 7 wolfram-mathematica

我一直在$NewSymbol努力寻找能够回答这个问题的东西.文档说

在实际创建符号之前应用$ NewSymbol.如果$ NewSymbol的操作导致创建符号(可能在不同的上下文中),则创建的符号将是使用的符号.

所以我尝试自动将一个特定的新符号移动到一个测试上下文中,该测试上下文应该阻止它在Global`*上下文中的创建,但是符号在两个上下文中都被创建.

In[1]:= Remove["Global`*"]
In[2]:= $NewSymbol=(Print[#1," : ",#2];
                    If[#1==="aLongTestSymbolName"&&#2==="Global`",
                       Symbol["TestContext`"<>#1]])&;

In[3]:= x
During evaluation of In[3]:= x : Global`
Out[3]= x

In[4]:= aLongTestSymbolName
During evaluation of In[4]:= aLongTestSymbolName : Global`
During evaluation of In[4]:= aLongTestSymbolName : TestContext`
Out[4]= aLongTestSymbolName

In[5]:= Names["Global`*"]
Out[5]= {aLongTestSymbolName,x}

In[6]:= Names["TestContext`*"]
Out[6]= {TestContext`aLongTestSymbolName}
Run Code Online (Sandbox Code Playgroud)

我认为"aLongTestSymbolName"不应该在这种Global`背景下.任何人都可以看到我做错了什么或者我是否误解了文档?


注意:在两个上下文中创建符号不是上述链接到问题中自动突出显示的选项.我们的想法是保留某些符号名称,例如"x"~~___变量和"f"~~___函数,然后使用字符串模式$NewSymbol将符号移动到适当的突出显示的上下文.

Mr.*_*ard 3

这是因为您将符号名称传递给Print,这立即在 中生成了符号Global`。:-)

或不。在回答之前我真的应该尝试一下,但我以为我知道这个。哎呀。


现在在我看来,它$NewSymbol不会拦截符号的创建,或者如果拦截了,如何利用它还不清楚。

如果有人使用:

$NewSymbol = Print["Name: ", #2, #] &;
Run Code Online (Sandbox Code Playgroud)

然后:

In[10]:= aNewSymbol

During evaluation of In[10]:= Name: Global`aNewSymbol

Out[10]= aNewSymbol
Run Code Online (Sandbox Code Playgroud)

我们看到它的$NewSymbol工作方式并不像$PrePrint它的输出不会成为表达式。

因此,如果我们使用:

$NewSymbol = Symbol["TestContext`" <> #] &;

aSecondSymbol
Run Code Online (Sandbox Code Playgroud)

aSecondSymbol愉快地创造出来,Global`就好像什么都没有改变一样。

正如文档所述,如果$NewSymbol可以用于指导创建符号的上下文,我不清楚如何做到这一点。

  • W - 实际上,在您的示例中,“aSecondSymbol”是在“Global”和“TestContext”中创建的。您认为文档有错吗?也许它在旧版本中可以工作,但被破坏了,没有人注意到......我想我应该问 WRI。 (3认同)