Skip to content

Colecciones

El lenguaje cuenta con las colecciones lista y diccionario.

Lista

La lista encapsula valores de cualquier tipo de forma secuencial. Para esto se usa el identificador list. Por ejemplo,

1
(list 1 2 3)  ; lista de tres elementos: 1, 2 y 3.

Debido a que el Botlang es funcional, no cuenta con estructuras de control de tipo while o for. Por esto la iteración suele hacerse a través de listas, mediante primitivas para manipulación de las mismas, como map, filter, reduce, entre otras.

Operaciones

Operador Código de ejemplo Resultado
get (get (list 4 5 6) 2) 5
get-or-nil (get-or-nil (list 4 5 6) 4) nil
extend (extend (list 1 2) (list 3 4)) [1, 2, 3, 4]
head (head (list 1 2 3)) 1
tail (tail (list 1 2 3)) [2, 3]
init (init (list 1 2 3)) [1, 2]
last (last (list 1 2 3)) 3
length (length (list 1 2 3)) 3
map (map f (list 1 2 3)) [f(1), f(2), f(3)]
filter (filter (function (v) (> v 3)) (list 5 2 8 9 -5 4) [5, 8, 9, 4]
sort (sort (list 2 3 1)) [1,2,3]
max (max (list 2 3 1)) 3
min (min (list 2 3 1)) 1
find (find (list 2 3 1) 2) 1
reverse (reverse (list 1 2 3 4)) [4, 3, 2, 1]
enumerate (enumerate "abcd") [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
sum (sum (list 1 2 3 4 10)) 20

Diccionario

Los diccionarios almacenan asociaciones llave->valor.

Sintaxis:

1
2
3
4
(make-dict (list
    (cons "k1" "v1")
    (cons "k2" "v2")
))  ; diccionario {"k1": "v1", "k2": "v2"}

En Botlang los diccionarios son ordenados, por lo que el orden de las llaves dado en su definición se mantiene.

1
2
3
4
5
6
7
(define d (make-dict (list
    (cons "k1" "v1")
    (cons "k2" "v2")
)))

(keys d)  ; ["k1", "k2"]
(values d)  ; ["v1", "v2"]

Estas estructuras admiten modificación de sus valores, lo cual constituye un mecanismo de mutación en Botlang, por lo cual el lenguaje no es puramente funcional.

Por ejemplo,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
(define d (make-dict (list
    (cons "k" 1)
)))
d  ; {"k": 1}

(put! d "k2" 2)
d  ; {"k": 1, "k2": 2}

(put! d "k" 3)
d  ; {"k": 3, "k2": 2}

(remove! d "k2")
d  ; {"k": 1}

Operaciones

Operador Código de ejemplo Resultado
get (get dict key default) Valor asociado a key. Opcional: entrega default si no encuentra la llave.
put (put dict key value) Entrega un nuevo diccionario resultante de añadir value a key en dict.
put! (put! dict key value) Asocia value a key en el diccionario dict
remove! (remove! dict key) Elimina la key del diccionario dict
keys (keys dict) Lista de llaves de dict
values (values dict) Lista de valores de dict
associations (associations dict) Lista de pares llave-valor de dict