2010-11-24 8 views
7

कभी कभी मैं इस परिदृश्य में चलाने - एक प्रक्रिया एक वैश्विक समारोह f[x] का उपयोग करता है कुछ गणना करने के लिए, इस बीच एक और प्रक्रिया f=5 जो 5[x]का पता लगाने के DownValue/OwnValue विरोध करता है

मैं स्थानीयकरण करने के बारे में पता है में बाद के सभी कॉल f[x] बदल जाता है करता है चर, लेकिन मैं विकास में शुरुआती वैश्विक चर का उपयोग करना पसंद करता हूं।

मैं खुद के वैल्यू और डाउनवैल्यू को मिश्रण करने के वैध कारण के बारे में नहीं सोच सकता। ऊपर की स्थिति की स्थिति होने पर चेतावनी संदेश को लागू करने का कोई तरीका है?

नीचे युक्तियों के अतिरिक्त, डिफ़ॉल्ट संदर्भ सेल विकल्प के तहत OptionsInspector में पाया जा सकता/मूल्यांकन विकल्प/CellContext

उत्तर

11

आप Protect[f] का उपयोग (किसी भी तरह के) आगे कार्य से बचने के लिए कर सकते हैं और Unprotect[f] उन्हें फिर से अनुमति देने के लिए।

तुम भी वास्तव में f पर खुद-मूल्यों डाल, लेकिन अभी भी उपयोग करने के लिए Protect/Unprotect बिना नीचे-मूल्यों का काम अनुमति देने से Set[f, ...] को रोकने के लिए अप-मूल्यों के साथ कुछ सरल hackery कर सकता है:

In[76]:= ClearAll[f] 

In[77]:= f /: Set[f, x_] := x 

In[78]:= f = 7 

Out[78]= 7 

In[79]:= f 

Out[79]= f 

In[80]:= f[x_] := x + 1 

In[81]:= f[1] 

Out[81]= 2 

उपरोक्त पारदर्शी रूप से Setf पर उपयोग को अवरुद्ध करता है। एक वास्तविक संदेश जारी करने वाले भी स्पष्ट है:

In[93]:= f::noov = "Blocked attempt to assign `1` as an OwnValue of f"; 

In[94]:= f /: Set[f, x_] := (Message[f::noov, x]; x) 

In[95]:= f = 7 

During evaluation of In[95]:= f::noov: Blocked attempt to assign 7 as 
    an OwnValue of f 

Out[95]= 7 
+0

यदि डाउनवैल्यू/ओनवैल्यू टकराव है तो चेतावनी संदेश मुद्रित करने के लिए सेट/सेटडेलेड ओवरराइड करने के बारे में आप क्या सोचते हैं? –

+1

शायद संभव है, लेकिन शायद नाजुक। क्या आपने इसके बजाय संदर्भों का उपयोग करने पर विचार किया है ('Begin' /' end') या सेल/नोटबुक-स्तर संदर्भों को सेट करना? –

+0

+1, मैंने इस तरह के औसत का उपयोग करने के बारे में सोचा नहीं था। चतुर। इसके अतिरिक्त, आप सेल/नोटबुक स्तर संदर्भों के बारे में एक अच्छा बिंदु बनाते हैं; मैंने उन्हें वी। 5. – rcollyer

3

यह एक चेतावनी संदेश पैदा करने के बारे में मूल सवाल का जवाब नहीं है, लेकिन Formal Symbols वैश्विक प्रतीक के रूप में उपयोग के लिए काम कर रहे हैं। वे स्वचालित रूप से संरक्षित होते हैं और इसलिए गलती से परिभाषित नहीं किया जा सकता है। आप कीस्ट्रोक <ESC>$f</ESC> का उपयोग करके औपचारिक प्रतीक दर्ज करते हैं, जहां f कोई भी पत्र हो सकता है। नुकसान यह है कि एक के बजाय प्रतीक दर्ज करने के लिए चार कीस्ट्रोक लेते हैं।

+0

+1। क्या प्रोग्रामिंग रूप से प्रोग्राम करना संभव है (एक पैकेज के भीतर) औपचारिक प्रतीकों को डबल-मारा या यूनानी अक्षरों से बाहर करना संभव है? यदि नहीं, तो मुझे लगता है कि औपचारिक प्रतीकों के दस्तावेज में मेकबॉक्स उदाहरण उदाहरण प्रतिस्थापन (चरित्र और/या रंग) के लिए अनुमति देंगे। यह वास्तव में उपयोगी डिजाइन चाल हो सकता है। :) – telefunkenvf14

+0

@ telefunkenvf14 यदि आप औपचारिक प्रतीकों (ऊपर और नीचे बिंदुओं के साथ) की विशिष्ट दृश्य उपस्थिति का जिक्र कर रहे हैं, तो मुझे ऐसे अन्य प्रतीकों को उत्पन्न करने के तरीके के बारे में पता नहीं है। जहां तक ​​मैं कह सकता हूं, बिंदीदार अक्षर एक विशेष फ़ॉन्ट में वर्ण हैं। कोई शायद 'अंडरवर्सक्रिप्ट' और 'सिंबलनाइजेशन' का उपयोग करके करीब आ सकता है लेकिन परिणाम कीबोर्ड से प्रवेश करने में परेशानी हो सकती हैं। औपचारिक प्रतीकों की अन्य विशेषताओं, कि उनमें अंतर्निहित परिभाषाओं की कमी है और 'संरक्षित' द्वारा सुरक्षित हैं, किसी भी अन्य प्रतीक की व्यवस्था करना आसान है। – WReach

संबंधित मुद्दे