Empaquetamiento

El empaquetamiento (packing) es una operación mediante la cual se puede coger varios elementos y empaquetarlos en un nuevo objeto. Se puede usar con listas y mapas para obtener nuevas copias completas o parciales. Para estos fines, se utilizan operadores de empaquetado especiales.

Operador de empaquetado de mapas

Dogma proporciona el operador de empaquetado o copia para obtener un mapa de otro mapa. Es decir, para crear una copia independiente de un objeto.

Por un lado, podemos utilizar el operador {campo,campo,campo...}, el cual devuelve la copia con los campos indicados, pudiendo crear nuevos si fuera necesario:

objeto{campo,campo,campo}

Donde cada campo puede ser:

Vamos a ver un ejemplo ilustrativo:

artist = {
  name = "Night Moves"
  origin = "US"
  web = "nightmovesmpls.com"
}

a = artist{name,web,origin="United States"}
#aquí: a = {name="Night Moves", web="nightmovespls.com", origin="United States"}

Este operador deja intacto el objeto origen. Crea un nuevo objeto al que le copia los campos indicados. Y lo devuelve.

Si lo que deseamos es hacer una copia completa o modificada, se pueden utilizar los operadores {*} (shallow copy, copia superficial) o {**} (deep copy, copia profunda):

objeto{*,campo,campo...}
objeto{**,campo,campo...}

Si se desea, se puede:

He aquí un ejemplo ilustrativo:

opts = {
  user = "me"
  password = "mypass"
  db = "mydb"
  desc = "My description."
}

copy = opts{*,-desc,db=>database,password="mynewpass"}

Tras lo anterior, tendremos:

Operador de empaquetado de listas

También es posible hacer una copia y añadir nuevos valores al final de una lista. En este caso, se usa el operador [*]. Ejemplos:

x = [1, 2, 3, 4, 5]
y = [5, 4, 3, 2, 1]

#devuelve una copia de x, o sea, [1, 2, 3, 4, 5]
l = x[*]

#devuelve una copia de x con los valores 4 y 5 adicionales: [1, 2, 3, 4, 5]
l = x[*,4, 5]

#devuelve una copia de x con el valor 6 adicional así como los de y
#o sea: [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
l = x[*,6,...y]