2011-10-27 9 views
12

यदि हम इन लाइनों का मूल्यांकन एक-एक-एक, x संदर्भ cc में बनाए जाएंगे।प्रारंभ [] काम का यह उपयोग क्यों नहीं करता?

Begin["cc`"]; 
x = 1; 
End[] 
हालांकि

, अगर हम उन्हें एक साथ मूल्यांकन,

(Begin["cc`"]; 
x = 1; 
End[]) 

तो xGlobal में बनाया जाएगा।

(Begin["cc`"]; 
Print[$Context]; 
End[]) 

इस व्यवहार के लिए कारण क्या है: यह निम्नलिखित मुद्रण cc` के बावजूद है? मेरा अनुमान है कि संदर्भ केवल पार्सिंग चरण के दौरान महत्वपूर्ण हैं, मूल्यांकन नहीं।

केस का उपयोग करें: मैं एक पैलेट Button बनाना चाहता था जो ग्लोबल्स के साथ संघर्ष से बचने के लिए "निजी" संदर्भ में अभी तक मौजूद नहीं है, तो कुछ प्रतीकों को परिभाषित करेगा। यह करने के लिए पसंदीदा तरीका क्या है, सभी परिभाषाओं को पैकेज फ़ाइल में डालने और पैलेट से लोड करने के अलावा? (मैं पैलेट को स्वयं निहित रखना चाहता हूं।)

+0

मैं सिर्फ इतना है कि डॉक्स में पढ़ा है कि "। प्रतीक नाम की व्याख्या संदर्भ पर निर्भर करता' Begin' इस प्रकार इनपुट अभिव्यक्ति के पार्स को प्रभावित करता है। " वह मेरे पहले सवाल का जवाब देता है। दूसरा अभी भी खड़ा है। – Szabolcs

उत्तर

15

प्रतीकों (और उनके संदर्भ) मूल्यांकन करते समय, विश्लेषण नहीं करते हैं। अगर हम $NewSymbol का उपयोग हम प्रभाव में देख सकते हैं:

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

Print["first"]; 
test1; 
Print["last"] 

(Print["first"]; 
test2; 
Print["last"]) 

पहले एक प्रिंट:

first 
Name: test1 Context: Global` 
last 

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

Name: test2 Context: Global` 
first 
last 

जहाँ से हम देख सकते हैं कि test2Global` संदर्भ में बनाया गया था से पहले किसी भी मूल्यांकन हुआ पर विचार किया जा करने के लिए मजबूर करने के लिए।

मुझे लगता है कि इसके साथ काम करने का सबसे आसान तरीका आपके प्रतीक पर एक स्पष्ट संदर्भ का उपयोग करना है: cc`x = 1

+0

+1, दिलचस्प परिणाम। – rcollyer

+3

कभी-कभी उपयोगी एक और विकल्प है * मूल्यांकन के दौरान कुछ नया पार्सिंग * करने के लिए ToExpression का उपयोग करना: (शुरू करें ["सीसी'"]; [{s = ToExpression ["x"]}, s = 1]; अंत [ ];) –

+0

ब्रेट, क्या किसी विशिष्ट संदर्भ में बनाए जाने वाले प्रतीक को बल देने के लिए '$ NewSymbol' का उपयोग करने का कोई तरीका है, और विस्तार से डिफ़ॉल्ट में नहीं? –

2

आपके दूसरे प्रश्न के लिए, मैं आपको this मेरा उत्तर देता हूं, जो आपके द्वारा उल्लिखित चरणों को प्रभावी ढंग से स्वचालित करता है (ParseTimeNameSpaceWrapper फ़ंक्शन के साथ)। इसे और अधिक मजबूत बनाने के लिए इसे और अधिक काम की आवश्यकता हो सकती है, लेकिन यह एक शुरुआती बिंदु हो सकता है। मैं अवसर पर इस सामान का उपयोग करता हूं।

+0

'ParseTimeNameSpaceWrapper' अभी भी इस तथ्य के आसपास नहीं मिलता है कि प्रतीकों का संदर्भ पार्स-टाइम पर तय किया जाता है, यानी यदि मैं' ParseTimeNameSpaceWrapper [x] 'करता हूं, तो' x' को अभी भी 'ग्लोबल'x' के रूप में व्याख्या किया जाएगा। ',' MyLocalizedContext'x'' के रूप में नहीं। यह समझने के बाद कि संदर्भ पर्स-टाइम पर चुना गया है, मुझे लगता है कि कोई अन्य तरीका नहीं है, लेकिन स्ट्रिंग में कुछ कोड डालने और 'ToExpression' का उपयोग करके, या इसे पैकेज से पढ़ने (या बस लिखकर) ब्रेट के सुझाव के अनुसार स्पष्ट रूप से संदर्भ, लेकिन यह लंबे कोड के लिए बहुत काम है)। – Szabolcs

+0

@Szabolcs मैं देखता हूं। शायद यह धागा पार्सिंग चरण के संबंध में आपके लिए ब्याज का हो सकता है: http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/c1f4ab24db8a8542 –

0
बस संदर्भ के लिए

:

(Begin["cc`"]; Evaluate[Symbol["x"]] = 1; End[]) 

cc`x 
1