Vectores

Los vectores (arrays) junto con las listas son dos elementos estructurados habituales de un lenguje de programación. En MetaTalk se puede trabajar a modo de listas puesto que las variables no tienen un tamaño predefinido y puede crecer o disminuir con los contenidos que se les asignan. En este caso el siguiente o el antecesor se han de traducir a operaciones con los trozos (chunks) que permite direccionar el lenguaje

El caso de los vectores es tanto o más interesante. Los elementos del vector se puede indexar a partir de valores numéricos, como es usual entre corchetes.

local codics

on mouseUp
 repeat with i = 1  to 3
   put (i*10+1) into codics[ i ]
 end repeat

 put the keys of codics

  repeat with i = 1  to the number of lines of (the keys of codics)
    answer i & return & codics[ i ]
  end repeat
end mouseUp
	

El número de dimensiones de los vectores no está limitado, así que se pueden construir matrices (matrix) y operar con ellas con las funciones que incorpora el lenguaje.

local matriuA, matriuB, matriuC, dimensio

on mouseUp
  repeat with i = 1  to 3
    repeat with j = 1  to 3
      put (i&j) into matriuA[i,j]
      put 2 into matriuB[i,j]
    end repeat
  end repeat
  
  put matrixMultiply(matriuA, matriuB) into matriuC
  put extents(matriuC) into dimensio
  put "a" && extents(matriuA) && return &\
          "b" && extents(matriuB) && return &\
          "c" && dimensio

  repeat with i = 1  to the second item of line 1 of dimensio
   repeat with j = 1  to the second item of line 2 of dimensio
    answer i & "," & j && matriuC[ i,j ]
   end repeat
  end repeat
end mouseUp

#Per si tens interés, deu donar:
#      C       =     A       *     B             
# 72  72  72      11 12 13       2 2 2
#132 132 132   =  21 22 23   *   2 2 2
#192 192 192      31 32 33       2 2 2
	

La función extents permite obtener el número de entradas; en realidad el índice menor y el mayor utilizados. Si tuviese más de una dimensión, cada rango de valores aparece en separado del siguiente por un salto de línea. La función keys también lo obtiene, además de los valores de los índices de una variable; se ha introducido aquí para comparar el tratamiento con los vectores asociativos. El interés de estos radica en la facilidad con que se implemetan los diccionarios y otros objetos que consisten en indexar los elementos por una clave no numérica. Estos son una variante de los vectores donde los elementos índice no son numéricos sino alfabéticos.

El siguiente ejemplo muestra cómo se puede generar un vector asociativo a partir de una cadena de caracteres, cómo se pueden ordenar los elementos de índice (el criterio no tiene por qué ser alfabético, pero era el más sencillo) y cómo acceder a los valores almacenados. Por si lo está pensado: sí, existe una orden combine que hace la operación inversa a split. Sencillo, ¿verdad?

local codicsTecles="codic_a=97&codic_e=101&codic_i=105&codic_o=111&codic_u=117"

on mouseUp
  put "Inicialment:" && codicsTecles

  answer "Antes" & return & keys( codicsTecles ) titled "Antes"
  split codicsTecles by "&" and "="

  put keys( codicsTecles ) into varAux
  sort lines of varAux
  answer "Despues" & return & varAux titled "Despues"

  repeat with i = 1  to the number of lines of varAux
   answer codicsTecles[ (line i of varAux)  ] && return & (line i of varAux)
  end repeat
end mouseUp