2009-09-21 18 views
14

Después de jugar con las capacidades simbólicas y numéricas de Mathematica, creo que también es un lenguaje de programación decente. Sin embargo, algo que lo hace menos atractivo como lenguaje de propósito general es la falta de tipo de datos de estructura tipo C (o el tipo de registro como se conoce en Pascal). ¿Cómo puedo evitar este problema?¿Tipo de datos de estructura en Mathematica?

Respuesta

8

Si entiendo bien su pregunta, simplemente puede escribir cosas como esta:

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

A continuación, para acceder a los datos para cualquier índice específico simplemente escriba la misma (por ejemplo, x[1] volverá 7, x[foo] volverá bar).

+0

Esta forma de hacer las cosas tiene una ventaja real sobre el enfoque de reglas sugerido por sakra: te permite mutar los "campos" de la "estructura" de una manera directa. – Pillsy

+2

Hay un problema con su respuesta: si un "campo" es una lista, sus elementos no se pueden cambiar individualmente. Por ejemplo, x [foo] = {1,2}; x [foo] [[1]] = 3 (* intentando cambiar el elemento de lista *) dará como resultado un error, porque x [foo] no es un valorL. Por lo tanto, aún no reemplaza completamente la funcionalidad C struct. – felix

+1

Debe reemplazar completamente el valor anterior, no solo cambiar un solo valor de la lista: f ["foo"] = {1, 2}; f ["foo"] = (ReplacePart [f ["foo"], 1 -> 3]) Además, utilizaría cadenas o enteros para las claves, no para los símbolos. También puede hacer algunas cosas complicadas configurando UpValues ​​for Set. –

14

actualización: Mathematica 10 ha introducido Association, que tiene muchas de las propiedades más importantes de un struct. (Consulte new answer.) La versión original, un tanto obsoleta, de esta respuesta se encuentra a continuación.


Puede utilizar una reglaMathematica listas para imitar un tipo de datos struct C-similares. Por ejemplo,:.

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

A continuación, puede acceder a los campos del registro mediante el operador /.:

firstName /. person 

produce John.

lastName /. person 

yields Doe.

para actualizar un campo de un registro, anteponga el campo actualizado a la lista:

PrependTo[person , firstName -> "Jane"] 

firstName /. person produce entonces Jane.

Consulte también la documentación Mathematica en transformation rules.

+2

Hacer algunos cambios usando el anteponer significa que aparecerán varias reglas no utilizadas en la lista de personas. No muy eficiente. –

+0

Tenga en cuenta que Mathematica 10 ha introducido ['Association'] (http://reference.wolfram.com/language/ref/Association.html), que tiene muchas de las propiedades más importantes de una' struct'. Ver [nueva respuesta] (http://stackoverflow.com/a/33465106/330202). –

2

De esta manera se puede trabajar:

x[foo] = bar 

x[bar] = baz 

x[1] = 7 

x[7] = 1 

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

y también para cambiar los elementos de un campo de lista que puedas Así que lo siguiente:

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

que devuelve:

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

Mathematica 10 ha introducido Association, que tiene muchas de las propiedades más importantes de struct.

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 

Para obtener más información, consulte

Cuestiones relacionadas