Presentamos Achronyme — un lenguaje para pruebas zero-knowledge. Lee el anuncio

Arrays y Colecciones

Arrays, listas y mapas.

Achronyme tiene dos tipos de colecciones integrados: arrays (listas ordenadas) y mapas (diccionarios clave-valor). Ambos se asignan en el heap, son mutables y pueden contener cualquier tipo de valor.

Arrays

Crea arrays con corchetes. Accede a los elementos por índice (basado en cero).

let arr = [10, 20, 30]
assert(arr[0] == 10)
assert(arr[2] == 30)

let mixed = [1, "two", true, nil]
assert(mixed.len() == 4)

let nested = [[1, 2], [3, 4]]
assert(nested[0][1] == 2)

Modifica arrays con asignación por índice, .push() y .pop():

mut nums = [0, 0, 0]
nums[0] = 10
assert(nums[0] == 10)

mut items = [1, 2]
items.push(3)
assert(items.len() == 3)

let last = items.pop()
assert(last == 3)
assert(items.len() == 2)

Métodos de Arrays

MétodoDescripción
.len()Número de elementos
.push(val)Agregar al final
.pop()Eliminar y devolver el último elemento
.map(fn)Transformar cada elemento
.filter(fn)Seleccionar elementos que cumplan el predicado
.reduce(init, fn)Plegar en un solo valor
.find(fn)Primer elemento que cumpla el predicado
.any(fn)Verdadero si algún elemento cumple
.all(fn)Verdadero si todos los elementos cumplen
.sort(fn)Devolver copia ordenada
.flat_map(fn)Mapear y aplanar un nivel
.zip(otra)Emparejar elementos con otra lista
.for_each(fn)Iterar para efectos secundarios

Consulta Métodos y Namespaces Estáticos para la referencia completa.

Mapas

Crea mapas con llaves. Las claves pueden ser identificadores sin comillas o cadenas entre comillas.

let person = {name: "Alice", age: 30}
assert(person.name == "Alice")
assert(person["age"] == 30)

let m = {"hello": 1, "world": 2}
assert(m["hello"] == 1)

Accede a los valores con notación de punto o notación de corchetes. La notación de corchetes soporta claves dinámicas.

let key = "name"
assert(person[key] == "Alice")

let nested = {a: {b: {c: 42}}}
assert(nested.a.b.c == 42)

Agrega o actualiza campos por asignación o con .set():

mut config = {}
config.debug = true
config["port"] = 8080
config.set("host", "localhost")
assert(config.len() == 3)

Métodos de Mapas

MétodoDescripción
.len()Número de pares clave-valor
.keys()Lista de todas las claves
.values()Lista de todos los valores
.entries()Lista de pares [clave, valor]
.contains_key(clave)Verificar si la clave existe
.get(clave, default)Obtener valor con fallback
.set(clave, valor)Agregar o actualizar entrada
.remove(clave)Eliminar y devolver valor

Consulta Métodos y Namespaces Estáticos para la referencia completa.

Iteración

Usa for..in para iterar sobre arrays directamente o sobre claves de mapas con .keys().

mut total = 0
for x in [10, 20, 30] {
    total = total + x
}
assert(total == 60)

let scores = {math: 95, science: 88, english: 92}
mut sum = 0
for k in scores.keys() {
    sum = sum + scores[k]
}
assert(sum == 275)

Patrones

Tabla de despacho — almacena funciones en un mapa para búsqueda dinámica:

let ops = {
    add: fn(a, b) { a + b },
    sub: fn(a, b) { a - b },
    mul: fn(a, b) { a * b }
}
assert(ops.add(10, 3) == 13)
assert(ops["mul"](4, 5) == 20)

Registros — usa mapas como structs ligeros:

fn make_point(x, y) {
    return {x: x, y: y}
}
let p = make_point(3, 4)
assert(p.x == 3)

Conteo de palabras — claves dinámicas para agregación:

mut counts = {}
let words = ["apple", "banana", "apple", "cherry", "banana", "apple"]
for w in words {
    if counts[w] == nil {
        counts[w] = 0
    }
    counts[w] = counts[w] + 1
}
assert(counts.apple == 3)
assert(counts.banana == 2)

Pipelines funcionales — encadena métodos para transformar datos:

let result = [1, 2, 3, 4, 5, 6]
    .filter(fn(n) { n % 2 == 0 })
    .map(fn(n) { n * 10 })
assert(result == [20, 40, 60])

Estructuras anidadas — arrays de mapas, mapas de arrays:

let people = [
    {name: "Alice", age: 30},
    {name: "Bob", age: 25}
]
assert(people[0].name == "Alice")

mut bag = {items: []}
bag.items.push("sword")
bag.items.push("shield")
assert(bag.items.len() == 2)
Navigation