examples/advanced/04_literals_and_variadic.cat
# Exemples de littéraux de listes et dictionnaires + fonctions variadiques

# LITTÉRAUX DE LISTES

print("⇒ Littéraux de listes")

# Liste vide
empty = list()
print("Liste vide:", empty)

# Liste de nombres
numbers = list(1, 2, 3, 4, 5)
print("Nombres:", numbers)

# Liste de chaînes
names = list("Alice", "Bob", "Charlie")
print("Noms:", names)

# Liste avec expressions
computed = list(1 + 1, 2 * 3, 10 / 2)
print("Calculées:", computed)

# Listes imbriquées
matrix = list(list(1, 2, 3), list(4, 5, 6), list(7, 8, 9))
print("Matrice:", matrix)

# Itération sur une liste
print("\nItération:")
for n in list(10, 20, 30) {
    print("  -", n)
}

# LITTÉRAUX DE DICTIONNAIRES

print("\n⇒ Littéraux de dictionnaires")

# Dictionnaire vide
empty_dict = dict()
print("Dict vide:", empty_dict)

# Dictionnaire simple
person = dict(("name", "Alice"), ("age", 30), ("city", "Paris"))
print("Personne:", person)

# Dictionnaire avec clés numériques
mapping = dict((1, "un"), (2, "deux"), (3, "trois"))
print("Mapping:", mapping)

# Dictionnaire avec valeurs calculées
stats = dict(("sum", 1 + 2 + 3), ("product", 2 * 3 * 4))
print("Stats:", stats)

# Structures imbriquées
data = dict(("numbers", list(1, 2, 3)), ("info", dict(("x", 10), ("y", 20))))
print("Données imbriquées:", data)

# FONCTIONS VARIADIQUES

print("\n⇒ Fonctions variadiques")

# Lambda variadique simple
collect = (*items) => { items }
print("collect(1, 2, 3):", collect(1, 2, 3))

# Somme variadique
somme = (*nums) => {
    total = 0
    for x in nums {
        total = total + x
    }
    total
}
print("somme(1, 2, 3, 4, 5):", somme(1, 2, 3, 4, 5))
print("somme(10, 20, 30):", somme(10, 20, 30))

# Variadic avec paramètre régulier
prefix_list = (prefix, *items) => {
    result = list(prefix)
    for item in items {
        result = result + list(item)
    }
    result
}
print("prefix_list(0, 1, 2, 3):", prefix_list(0, 1, 2, 3))

# Plusieurs paramètres réguliers + variadic
make_range = (start, end, *extras) => {
    dict(("start", start), ("end", end), ("extras", extras))
}
print("make_range(1, 10, 'a', 'b'):", make_range(1, 10, "a", "b"))

# COMBINAISONS AVANCÉES

print("\n⇒ Combinaisons")

# Créer une liste avec variadic
make_list = (*items) => { list(items) }
print("make_list(1, 2, 3):", make_list(1, 2, 3))

# Min et max variadique
find_extremes = (*nums) => { dict(("min", min(nums)), ("max", max(nums))) }
print("find_extremes(5, 2, 9, 1, 7):", find_extremes(5, 2, 9, 1, 7))

# Longueur avec variadic
count_args = (*args) => { len(args) }
print("count_args('a', 'b', 'c', 'd'):", count_args("a", "b", "c", "d"))

# EXEMPLE PRATIQUE : CALCULATEUR

print("\n⇒ Calculateur variadique")

# Fonction qui applique une opération à tous les arguments
apply_op = (op, *nums) => {
    match op {
        "sum" => {
            total = 0
            for n in nums { total = total + n }
            total
        }
        "product" => {
            total = 1
            for n in nums { total = total * n }
            total
        }
        "list" => { nums }
        _ => { None }
    }
}

print("Somme:", apply_op("sum", 1, 2, 3, 4, 5))
print("Produit:", apply_op("product", 2, 3, 4))
print("Liste:", apply_op("list", 10, 20, 30, 40))

print("\n⇒ Fin des exemples")