2011-05-29 14 views
7

में $ NewSymbol के साथ संदर्भों को स्थानांतरित करना मैं $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

डब्ल्यू - असल में, आपके उदाहरण में 'एक सेकेंड सिंबल' दोनों 'ग्लोबल' '' '' '' '' '' '' '' '' '' '' ' क्या आपको लगता है कि दस्तावेज़ीकरण गलत है? शायद यह एक पुराने संस्करण में काम किया लेकिन टूट गया और कोई भी ध्यान नहीं दिया ... मुझे लगता है मुझे डब्लूआरआई से पूछना चाहिए। – Simon

+0

@ सिमॉन, यह सही है। मेरा मुद्दा यह था कि यह अभी भी 'ग्लोबल '' 'न्यूजिमबोल' द्वारा लगाए गए किसी भी चीज़ से स्पष्ट रूप से स्वतंत्र रूप से स्वतंत्र रूप से बनाया गया है, और 'प्रिंट' /' अगर 'आदि समस्या से संबंधित नहीं हैं। मुझे आशा है कि माइकल, डैनियल, या साशा जवाब के साथ रुक जाएंगे। –

+0

ऐसा लगता है कि हमारे स्थानीय मित्रवत डब्ल्यूआरआई कर्मचारियों ने बंद कर दिया है - इसलिए मैंने डब्लूआरआई को एक बग रिपोर्ट भेजी। – Simon

0

this Mathematica Journal article में संदर्भ मुद्दों के बारे में आप पाते हैं कि मूल्यांकन के पार्सिंग चरण में केवल एक नए प्रतीक की उपस्थिति इस प्रतीक को वर्तमान संदर्भ में जोड़ देगी।इस मामले में aLongTestSymbolName को प्रिंट और यदि # 1 के रूप में सौंप दिया गया है और इसलिए वर्तमान संदर्भ Global` में बनाया गया है। मुझे नहीं लगता कि यह रोकने के लिए $NewSymbol फ़ंक्शन में आप कुछ भी कर सकते हैं।

लेख कहा गया है कि भले ही आप Begin["Context1`"]; someSymbol; End[] का उपयोग someSymbol Context1` संदर्भ में नहीं रखा गया है, जब तक कि Begin["Context1`"] एक अलग लाइन पर मूल्यांकन किया जाता है।

+0

उत्तर जो मैंने अभी हटाया है उसे देखें। मुझे लगता है कि यह सही नहीं है, क्योंकि दस्तावेज के अनुसार प्रतीक और संदर्भ नाम स्ट्रिंग के रूप में पारित किए जाते हैं। –

+0

@ श्री विज़ हम्म, यरइट। शायद एमएमए पास करने से पहले एक ToString [प्रतीक] के समान कुछ करता है? तब वह प्रतीक बना देगा। –

+1

दस्तावेज़ कहते हैं कि प्रतीक बनने से पहले $ NewSymbol का मूल्यांकन किया जाता है। मुझे लगता है कि जब नया अज्ञात स्ट्रिंग का सामना होता है तो नया प्रतीक कोड 'मेकएक्सप्रेस' द्वारा बुलाया जाता है। लेकिन इससे पहले कि यह प्रतीक बनाता है, यह उस स्ट्रिंग के साथ $ NewSymbol को तर्क के रूप में चलाता है। – Simon