Wolfram mathematica Mathematica中使用$NewSymbol移动上下文
我在玩弄Wolfram mathematica Mathematica中使用$NewSymbol移动上下文,wolfram-mathematica,Wolfram Mathematica,我在玩弄$NewSymbol试图找到一些答案 $NewSymbol在 符号实际上是被创建的。如果 $NewSymbol的操作导致符号 被创造出来,也许是在一个不同的世界里 上下文,然后是创建的符号 将是一个使用 因此,我尝试将一个特定的新符号自动移动到一个测试上下文中,这将阻止它在Global`*上下文中创建,但该符号是在两个上下文中创建的 In[1]:= Remove["Global`*"] In[2]:= $NewSymbol=(Print[#1," : ",#2];
$NewSymbol
试图找到一些答案
$NewSymbol在
符号实际上是被创建的。如果
$NewSymbol的操作导致符号
被创造出来,也许是在一个不同的世界里
上下文,然后是创建的符号
将是一个使用
因此,我尝试将一个特定的新符号自动移动到一个测试上下文中,这将阻止它在Global`*
上下文中创建,但该符号是在两个上下文中创建的
In[1]:= Remove["Global`*"]
In[2]:= $NewSymbol=(Print[#1," : ",#2];
If[#1==="aLongTestSymbolName"&==="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}
[1]中的:=删除[“全局”*“]
在[2]:=$NewSymbol=(Print[#1,“:”,#2];
如果[#1==“aLongTestSymbolName”&&&&==“Global`”,
符号[“TestContext`”#1]]&;
在[3]中:=x
在[3]中计算时:=x:Global`
Out[3]=x
在[4]:=aLongTestSymbolName中
在[4]中对的求值期间:=aLongTestSymbolName:Global`
在[4]:=aLongTestSymbolName:TestContext中对的求值期间`
Out[4]=aLongTestSymbolName
在[5]:=Names[“Global`*]”
Out[5]={aLongTestSymbolName,x}
在[6]:=Names[“TestContext`*]”
Out[6]={TestContext`aLongTestSymbolName}
我认为“aLongTestSymbolName”
不应该在全局`
上下文中。
谁能看出我做错了什么,或者我是否误解了文档
注意:在两种上下文中创建符号不是上述链接到问题的自动突出显示选项。其思想是保留某些符号名称,例如变量的
“x”~~~~~~~~~~~~~~~~~~~代码>,函数的“f”~~~~~~~~~~~~~~~~~~~~~~代码>,然后使用$NewSymbol
中的字符串模式将符号移动到适当的突出显示上下文中。这是因为您将符号名称传递给了Print
,这立即使符号在全局`
:-)
或者不是。在回答之前我真的应该试一下,但我想我知道这个。哎呀
在我看来,$NewSymbol
似乎没有截获符号的创建,或者如果截获了,如何利用它还不清楚
如果使用:
$NewSymbol = Print["Name: ", #2, #] &;
然后:
我们看到,$NewSymbol
的工作方式与$PrePrint
不同,因为它的输出不会变成表达式
因此,如果我们使用:
$NewSymbol = Symbol["TestContext`" <> #] &;
aSecondSymbol
$NewSymbol=Symbol[“TestContext`”#]&;
第二个符号
aSecondSymbol
在Global`
中愉快地创建,就好像什么都没有改变一样
如文档所述,如果可以使用$NewSymbol
来指导符号创建的上下文,我不清楚该如何操作。在关于上下文问题中,您可能会发现,只要在评估的解析阶段出现新符号,就会将该符号添加到当前上下文中。在这种情况下,会将aLongTestSymbolName作为#1提交给打印,因此会在当前上下文Global`
中创建。我认为在$NewSymbol
函数中没有任何方法可以防止这种情况
文章提到,即使您使用Begin[“Context1`]”;某些符号;结束[]
someSymbol不会被放置在Context1`
上下文中,除非Begin[“Context1`”]
在单独的一行上求值。请参见我刚刚取消删除的答案。我认为这是不对的,因为根据文档,符号和上下文名称是作为字符串传递的。@Mr.Wiz-hmmm,yerright。也许mma在通过之前做了类似于ToString[符号]的事情?这将创建符号。文档说$NewSymbol是在创建符号之前计算的。我想象新的符号代码在遇到未知字符串时被MakeExpression
调用。但在创建符号之前,它会运行$NewSymbol,并将该字符串作为参数。W-实际上,在您的示例中,aSecondSymbol
是在“全局”和“测试上下文”中创建的。那么你认为文件有错吗?也许它在旧版本中工作,但是坏了,没有人注意到。。。“我想我应该问问瑞。”西蒙,没错。我的观点是,它仍然是在Global`
中创建的,显然完全独立于$NewSymbol
调用的任何内容,并且如果等与问题无关,则打印/。我希望Michael、Daniel或Sasha能过来回答。我们当地友好的WRI员工似乎没有来过——所以我向WRI发送了一份错误报告。@Simon,WRI有什么回应吗?@Alexey:我的电子邮件已添加到现有的错误报告中。当v9发布时,我们可能会听到更多。。。
$NewSymbol = Symbol["TestContext`" <> #] &;
aSecondSymbol