# Tipos y colecciones

## Objetivo de aprendizaje
- Aplicar tipos de Lucia y estructuras de coleccion en codigo real.

## Sintaxis clave
```lucia
let age: int = 20;
let price: float = 12.5;
let name: string = "Ana";
let active: bool = true;
let tags: list<string> = ["a", "b"];
let user: dict<string, any> = {"name": "Ana", "age": 20};
```

## Ejemplos
- Acceso en listas: `tags[0]`.
- Acceso en diccionarios: `user["name"]`.
- Valores temporales: `date(...)`, `datetime(...)`.

## Patrones practicos
- Listas y diccionarios vacios con tipo explicito:
```lucia
let mazo: list<Carta> = [];
let puntajes: dict<string, int> = {};
```
- Reasignar vacios conserva el tipo de la variable:
```lucia
mazo = [];
puntajes = {};
```
- Lectura y escritura por indice:
```lucia
let temp: Carta = mazo[i];
mazo[i] = mazo[j];
puntajes["ana"] = 10;
```
- Metodos tipados en colecciones:
```lucia
mazo.append(Carta("A"));
if (puntajes.contains_key("ana")) {
	print(puntajes.get("ana", 0));
}
```

## Notas
- Para tamano de colecciones usa `len(x)`.
- `list<T>` exige elementos compatibles en asignacion y append.
- `dict<K, V>` valida tipo de llave y de valor.
- Metodos comunes de list: `insert`, `remove`, `removeAt`, `extend`, `first`, `last`, `is_empty`, `copy`, `clear`.
- Metodos comunes de dict: `items`, `size`, `merge`, `put`, `remove`, `is_empty`, `clear`.

## Errores comunes
- Asignar tipos incompatibles.
- Usar indices o claves invalidas.
- Llamar metodos no soportados por el tipo receptor (por ejemplo `length()` en list).

## Practica sugerida
- Modela un registro de estudiante con `dict<string, any>` y lista de notas.

## Practica extendida
- Crea un mezclador de mazo:
1. Define `list<Carta>`.
2. Usa `for` y `random(0, n - 1)`.
3. Intercambia elementos con asignacion por indice.

## Relacionados
- functions-and-builtins
- methods-and-chaining
