06. Vim: listas II

Publicado por

En la entrada anterior empecé a explicar cómo es que Vim proporciona el tipo de dato lista, sin embargo, aunque muy probablemente este tema ya sea familiar para ti, mencionar todo lo que se puede hacer con ellas en una sola nota puede llegar a ser un tanto abrumador; por ello decidí ofrecer el tema en dos partes, y esta es la segunda ¡comencemos!

Como todo buen lenguaje de alto nivel Vimscript permite manipular listas fácilmente a través de expresiones y funciones. La primera operación que se puede hacer sobre listas ya la has usado: la asignación. Sin embargo se pueden hacer cosas más interesantes que solo asignar una lista a una variable.

:let lista = ["uno", [2, 3.4], 5]
:echo lista[-1]
:echo lista[1][0]
:let sublista = lista[:-2]

Funciones

Terminé la nota anterior mencionando que el editor ofrece varias funciones para manipular listas. Empecemos por las funciones para alterar el contenido de una lista:

  • insert(lista , elemento [, indice]): Inserta elemento en lista justo antes de la posición índice. El argumento índice es opcional y por defecto toma el valor cero.
  • add(lista , elemento): Agrega elemento al final de lista
  • extend(lista , otra_lista): Agrega los elementos de otra_lista al final de lista.
  • remove(lista , inicio [, fin]): Elimina de lista los elementos ubicados desde la posición inicio hasta la posición fin. El argumento fin es opcional, y si no se especifica, solo el elemento en la posición inicio es eliminado.

Recordemos que las listas son colecciones ordenadas, por lo que también hay funciones para alterar el orden de los elementos que contienen:

  • sort(lista): Ordena los elementos de lista alfabéticamente
  • reverse(lista): Invierte el orden de los elementos contenidos en lista
  • uniq(lista): Elimina los elementos duplicados

Operaciones sobre listas

No solo a través de funciones se pueden manipular las listas. Como buen lenguaje de alto nivel, Vimscript define una buena cantidad de operaciones:

  • Concatenar (concatenation)
  • Identidad (identity)
  • Desempacar (unpack)

Concatenación

Para concatenar dos listas, podemos echar mano de los operadores + y +=

:let cabeza = [1]
:let lista = cabeza + [2, 3]
:let lista += [4, 5]
:echo lista
[1, 2, 3, 4, 5]

Identidad de una lista

Al igual que en otros lenguajes, el identificador de una lista, es una referencia al objeto, por lo que la operación de asignación no es en realidad una copia. Como ilustración toma el siguiente ejemplo:

:let lista = [1, 2]
:let alias = lista
:call add(lista, 3)
:echo alias
[1, 2, 3]

Como puedes ver, tanto lista como alias son la misma lista, solo que referida por identificadores diferentes. Esto se puede confirmar a través del operador is:

:echo lista is alias
1

No tener claro este concepto, puede llevar a efectos secundarios difíciles de depurar cuando se manejan listas sin el cuidado apropiado. Si lo que tú quieres es copiar una lista en lugar de solo crear identificadores que apunten a la misma colección, necesitarás utilizar la función copy():

:let copia = copy(lista)
:echo lista is copia
0

Una cosa importante que hay que notar es que copy() realiza una copia superficial de la lista. Si tu lista contiene además de elementos escalares, datos más complejos, como otras listas, tal vez necesites una copia profunda. La diferencia entre estos conceptos está muy bien explicada en esta nota.

Comparación

Para que dos listas sean consideradas iguales, deben cumplir dos criterios: contar con la misma cantidad de elementos y que cada elemento en la misma posición sea igual en ambas listas. Siguiendo nuestro ejemplo anterior, aunque lista y alias no sean la misma lista, sí son consideradas iguales:

:echo lista is alias
0
:echo lista == alias
1

Hay un último detalle con respecto a la comparación de listas que vale la pena notar: a diferencia de la comparación entre escalares, entre las listas no hay conversión de tipo automática; es decir, mientras una comparación entre un entero y una cadena puede evaluarse como verdadera, este no es el caso entre los elementos de las listas:

:echo 5 == "5"
1
:echo [5] == ["5"]
0

Vaya, sí que se ha extendido este tema, creo que por el momento es mejor dejarlo así. Ya lo terminaremos en la siguiente nota; de momento cuentas con elementos suficientes para practicar el manejo de las listas. ¡Hasta entonces!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *