2009-09-21 11 views
14

मैथमैटिका की प्रतीकात्मक और संख्यात्मक क्षमताओं के साथ खेलने के बाद, मुझे यह एक सभ्य प्रोग्रामिंग भाषा भी मिलती है। हालांकि, सामान्य उद्देश्य वाली भाषा के रूप में इसे कम आकर्षक बनाने वाला कुछ सी-जैसे संरचना डेटा प्रकार (या पास्कल में ज्ञात रिकॉर्ड प्रकार) की कमी है। मैं इस समस्या के आसपास कैसे हो सकता हूं?गणित में डेटा प्रकार का निर्माण?

उत्तर

8

अगर मैं आपके सवाल का सही ढंग से समझ, तो आप बस बातें इस प्रकार लिख सकते हैं:

 
x[foo] = bar 
x[bar] = baz 
x[1] = 7 
x[7] = 1 
?x 

तो किसी भी विशिष्ट सूचकांक के लिए डेटा का उपयोग करने के लिए सिर्फ एक ही टाइप (जैसे, x[1]7 वापस आ जाएगी, x[foo] वापस आ जाएगी bar)।

+0

चीजों को करने का यह तरीका सक्र द्वारा सुझाए गए नियम दृष्टिकोण पर एक वास्तविक लाभ है: यह आपको "संरचना" के "फ़ील्ड" को सीधे तरीके से बदलने की अनुमति देता है। – Pillsy

+2

आपके उत्तर में कोई समस्या है: यदि कोई "फ़ील्ड" एक सूची है, तो इसके तत्व अलग-अलग नहीं बदला जा सकता है। उदाहरण के लिए, x [foo] = {1,2}; x [foo] [[1]] = 3 (* सूची तत्व को बदलने का प्रयास *) परिणामस्वरूप एक त्रुटि होगी, क्योंकि x [foo] एक Lvalue नहीं है। तो यह अभी भी सी संरचना कार्यक्षमता को पूरी तरह से प्रतिस्थापित नहीं करता है। – felix

+1

आपको पुरानी मान को पूरी तरह से प्रतिस्थापित करने की आवश्यकता है, न केवल सूची के एक ही मूल्य को बदलें: f ["foo"] = {1, 2}; एफ ["foo"] = (ReplacePart [f ["foo"], 1 -> 3]) इसके अलावा, मैं कुंजी के लिए स्ट्रिंग या पूर्णांक का उपयोग नहीं करता, प्रतीक नहीं। सेट के लिए अपवैल सेट करके आप कुछ मुश्किल व्यवसाय भी कर सकते हैं। –

14

अद्यतन: मेथेमेटिका 10 Association है, जो एक struct का सबसे महत्वपूर्ण गुण के कई है शुरू की है। (new answer देखें।) इस उत्तर का मूल, कुछ हद तक बहिष्कृत संस्करण नीचे है।


आप उपयोग कर सकते हैं एक मेथेमेटिका नियम एक सी की तरह struct डेटा प्रकार की नकल करने सूचीबद्ध करता है। उदा,:।

person = {firstName -> "John", lastName -> "Doe"} 

फिर आप रिकॉर्ड के क्षेत्रों /. ऑपरेटर का उपयोग करके पहुँच सकते हैं:

firstName /. person 

पैदावार John

lastName /. person 

Doe पैदा करता है।

सूची में एक रिकार्ड के एक क्षेत्र, आगे जोड़ते अद्यतन क्षेत्र अद्यतन करने के लिए:

PrependTo[person , firstName -> "Jane"] 

firstName /. person तो Jane अर्जित करता है।

गणितtransformation rules पर दस्तावेज़ भी देखें।

+2

प्रीपेन्डिंग का उपयोग करके कुछ बदलाव करना मतलब है कि व्यक्ति सूची में कई अप्रयुक्त नियम दिखाई देंगे। बहुत कुशल नहीं है। –

+0

ध्यान दें कि गणित 10 ने ['एसोसिएशन '] (http://reference.wolfram.com/language/ref/Association.html) पेश किया है, जिसमें' संरचना 'के कई सबसे महत्वपूर्ण गुण हैं। [नया उत्तर] देखें (http://stackoverflow.com/a/33465106/330202)। –

2

इस तरह से काम कर सकते हैं:

x[foo] = bar 

x[bar] = baz 

x[1] = 7 

x[7] = 1 

x[c] = {{1,2,3},{4,5,6}} 

और यह भी एक सूची क्षेत्र के तत्वों को बदलने के लिए आप ऐसा निम्न कर सकते हैं:

x[c] = ReplacePart[x[c], {1, 1} -> 8] 

जो रिटर्न:

x[c] = {{8,2,3},{4,5,6}} 
3

मेथेमेटिका 10 ने Association पेश किया है, जिसमेंके कई सबसे महत्वपूर्ण गुण हैं।

someData = <| "name" -> "Bob", "age" -> 23 |> 

In[1]:= someData["name"] 
Out[1]= Bob 

In[2]:= someData["age"] 
Out[2]= 23 

In[3]:= someData[[2]] 
Out[3]= 23 

अधिक जानकारी के लिए, (Association पर बनाता है जो)

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