2011-05-29 24 views
7

我正在玩$NewSymbol試圖找到答案this question與。 The docs say that

$ 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} 

我相信"aLongTestSymbolName"不應該在Global`環境。 任何人都可以看到我做錯了什麼,或者如果我誤解了文檔?


注意:在兩個上下文中創建的符號不是上述鏈接問題中自動突出顯示的選項。這個想法是爲變量保留某些符號名稱,例如"x"~~___,爲函數保留"f"~~___,然後使用$NewSymbol中的字符串模式將符號移動到適當的高亮上下文中。

回答

3

這是因爲您將符號名稱傳遞給Print,該符號名稱立即在Global`中生成符號。 :-)

還是不是。我應該在回答之前真正嘗試一些事情,但我認爲我知道這一點。哎呀。


現在看來,我認爲$NewSymbol不攔截符號的創造,或者,如果是這樣,如何利用說不清楚。

如果一個用途:

$NewSymbol = Print["Name: ", #2, #] &; 

則:

In[10]:= aNewSymbol 

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

Out[10]= aNewSymbol 

我們看到$NewSymbol不會因爲它的輸出不會成爲像表達工作$PrePrint

因此,如果我們使用:

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

aSecondSymbol 

aSecondSymbol在愉快地在Global`創建,好像什麼也沒有發生變化。

如果$NewSymbol可用於指導創建符號的上下文,如文檔所述,但我不清楚這可能是如何完成的。

+3

W--實際上,在你的例子中,''GlobalSeq''和''TestContext'''都創建了aSecondSymbol。 您認爲文檔是錯誤的嗎?也許它在舊版本中工作,但破裂,沒有人注意到...我想我應該問WRI。 – Simon 2011-05-29 22:45:37

+0

@Simon,這是正確的。我的觀點是,它仍然是在''Global''中創建的,顯然完全獨立於'$ NewSymbol'調用的任何東西,並且'Print' /'If'等與問題無關。我希望邁克爾,丹尼爾或薩沙會停下來回答。 – 2011-05-30 07:58:00

+0

看起來我們當地的一個友好的WRI員工已經不在了 - 所以我向WRI發送了一個錯誤報告。 – Simon 2011-05-30 22:42:24

0

在有關上下文問題的this Mathematica Journal article中,您可能會發現只有在評估的解析階段出現一個新符號纔會將此符號添加到當前上下文中。在這種情況下,aLongTestSymbolName被交給Print和If作爲#1,因此在當前上下文Global`中創建。我不認爲在$NewSymbol函數中您可以做任何事情來防止這種情況發生。

該文章提到,即使您使用Begin["Context1`"]; someSymbol; End[] someSymbol也不放置在Context1`上下文中,除非Begin["Context1`"]在單獨一行中進行評估。

+0

查看我剛剛取消刪除的答案。我認爲這是不對的,因爲符號和上下文名稱是作爲字符串傳遞的,根據文檔。 – 2011-05-29 21:15:50

+0

@ Mr.Wiz hmmm,yerright。也許mma在傳遞之前做了類似ToString [符號]的事情?那樣會創建符號。 – 2011-05-29 21:55:39

+1

文檔說在創建符號之前對$ NewSymbol進行評估。我想象一下,當遇到未知字符串時,新的符號代碼被'MakeExpression'調用。但是在它創建符號之前,它會以該字符串作爲參數運行$ NewSymbol。 – Simon 2011-05-29 22:36:30