Ir al contenido

Métodos y Namespaces Estáticos

Desde beta.13, la mayoría de operaciones sobre valores usan sintaxis de métodos: valor.metodo(args). Los métodos se resuelven en tiempo de ejecución basándose en el tag del tipo. Cada tipo tiene su propio conjunto de métodos.

Achronyme también proporciona namespaces estáticos usando la sintaxis Tipo::MIEMBRO para constantes y constructores a nivel de tipo.

// Llamada a método
let items = [3, 1, 2]
let sorted = items.sort(fn(a, b) { a - b })
// Encadenamiento
let result = [1, 2, 3, 4, 5]
.filter(fn(n) { n > 2 })
.map(fn(n) { n * 10 })
// result: [30, 40, 50]

6 métodos sobre valores enteros.

Devuelve el valor absoluto.

let x = -42
assert(x.abs() == 42)

Devuelve el menor de dos enteros.

assert(3.min(7) == 3)

Devuelve el mayor de dos enteros.

assert(3.max(7) == 7)

Exponenciación entera. El exponente debe ser no negativo.

assert(2.pow(10) == 1024)

Convierte el entero a un elemento de campo BN254.

let f = 42.to_field()
assert(typeof(f) == "Field")

Devuelve la representación en string.

assert(42.to_string() == "42")

Límites del entero con signo de 60 bits.

print(Int::MAX) // 576460752303423487 (2^59 - 1)
print(Int::MIN) // -576460752303423488 (-2^59)

14 métodos sobre valores de cadena.

Devuelve el número de caracteres.

assert("hello".len() == 5)

Devuelve true si la cadena comienza con el prefijo dado.

assert("hello".starts_with("hel"))

Devuelve true si la cadena termina con el sufijo dado.

assert("hello".ends_with("llo"))

Devuelve true si la cadena contiene la subcadena.

assert("hello world".contains("world"))

Divide la cadena por el delimitador dado. Devuelve una lista de cadenas.

assert("a,b,c".split(",") == ["a", "b", "c"])

Elimina espacios en blanco al inicio y al final.

assert(" hello ".trim() == "hello")

Reemplaza todas las apariciones de buscar con reemplazo.

assert("aabbcc".replace("bb", "XX") == "aaXXcc")

Convierte todos los caracteres a mayúsculas.

assert("hello".to_upper() == "HELLO")

Convierte todos los caracteres a minúsculas.

assert("HELLO".to_lower() == "hello")

Divide en una lista de caracteres individuales.

assert("abc".chars() == ["a", "b", "c"])

Devuelve el índice de la primera aparición. Devuelve -1 si no se encuentra.

assert("hello world".index_of("world") == 6)
assert("hello".index_of("xyz") == -1)

Extrae una subcadena desde la posición inicio hasta fin (exclusivo). Los índices se ajustan a los límites.

assert("hello".substring(1, 4) == "ell")

Repite la cadena n veces. Tamaño máximo: 10 MB.

assert("ab".repeat(3) == "ababab")

Devuelve la cadena misma (identidad).

assert("hi".to_string() == "hi")

13 métodos sobre valores de lista.

Devuelve el número de elementos.

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

Agrega un elemento al final. Modifica la lista en su lugar. Devuelve nil.

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

Elimina y devuelve el último elemento. Devuelve nil si está vacía.

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

Devuelve una nueva lista con fn(elem) aplicado a cada elemento.

let doble = [1, 2, 3].map(fn(n) { n * 2 })
assert(doble == [2, 4, 6])

Devuelve una nueva lista con solo los elementos donde fn(elem) es verdadero.

let pares = [1, 2, 3, 4].filter(fn(n) { n % 2 == 0 })
assert(pares == [2, 4])

Pliega la lista en un solo valor: acc = fn(acc, elem) para cada elemento.

let suma = [1, 2, 3].reduce(0, fn(acc, n) { acc + n })
assert(suma == 6)

Llama fn(elem) para cada elemento (para efectos secundarios). Devuelve nil.

[1, 2, 3].for_each(fn(n) { print(n) })

Devuelve el primer elemento donde fn(elem) es verdadero, o nil si ninguno coincide.

let encontrado = [1, 2, 3, 4].find(fn(n) { n > 2 })
assert(encontrado == 3)

Devuelve true si fn(elem) es verdadero para algún elemento. Cortocircuita.

assert([1, 2, 3].any(fn(n) { n == 2 }))

Devuelve true si fn(elem) es verdadero para todos los elementos. Cortocircuita.

assert([1, 2, 3].all(fn(n) { n > 0 }))

Devuelve una nueva lista ordenada. El comparador fn(a, b) debe devolver negativo si a < b, cero si iguales, positivo si a > b.

let ordenado = [3, 1, 2].sort(fn(a, b) { a - b })
assert(ordenado == [1, 2, 3])

Como .map(), pero aplana un nivel de listas anidadas.

let result = [1, 2, 3].flat_map(fn(n) { [n, n * 10] })
assert(result == [1, 10, 2, 20, 3, 30])

Devuelve una lista de pares [a, b], truncada a la lista más corta.

let pares = [1, 2, 3].zip([10, 20, 30])
assert(pares == [[1, 10], [2, 20], [3, 30]])

8 métodos sobre valores de mapa.

Devuelve el número de pares clave-valor.

let m = {name: "Alice", age: 30}
assert(m.len() == 2)

Devuelve una lista de todas las claves.

let m = {name: "Alice", age: 30}
let k = m.keys()
assert(k.len() == 2)

Devuelve una lista de todos los valores.

let m = {a: 1, b: 2, c: 3}
let v = m.values()
assert(v.len() == 3)

Devuelve una lista de pares [clave, valor].

let m = {x: 10, y: 20}
let e = m.entries()
// e contiene [["x", 10], ["y", 20]]
assert(e.len() == 2)

Devuelve true si el mapa contiene la clave dada.

let m = {name: "Alice"}
assert(m.contains_key("name"))
assert(!m.contains_key("age"))

Devuelve el valor para clave, o default si la clave no existe.

let m = {name: "Alice"}
assert(m.get("name", "?") == "Alice")
assert(m.get("age", 0) == 0)

Establece o actualiza un par clave-valor. Modifica el mapa en su lugar. Devuelve nil.

mut m = {}
m.set("name", "Alice")
m.set("age", 30)
assert(m.len() == 2)
assert(m.name == "Alice")

Elimina una clave y devuelve su valor. Devuelve nil si la clave no existe.

mut m = {name: "Alice", age: 30}
let eliminado = m.remove("age")
assert(eliminado == 30)
assert(m.len() == 1)

2 métodos sobre elementos de campo BN254.

Convierte el elemento de campo a un entero. El valor debe caber en 64 bits.

let f = 0p42
assert(f.to_int() == 42)

Devuelve la representación decimal en string.

let f = 0p42
assert(f.to_string() == "42")

Estáticos: Field::ZERO, Field::ONE, Field::ORDER

Sección titulada «Estáticos: Field::ZERO, Field::ONE, Field::ORDER»

Constantes de campo para BN254 Fr.

let z = Field::ZERO // 0p0
let o = Field::ONE // 0p1
let q = Field::ORDER // "21888242871839275222246405745257275088548364400416034343698204186575808495617"

7 métodos sobre valores BigInt256 y BigInt512.

Convierte a una lista de enteros 0/1 en orden LSB primero. La longitud es 256 o 512 dependiendo del ancho.

let bits = bigint256(42).to_bits()
// bits[0] = 0, bits[1] = 1, bits[2] = 0, bits[3] = 1, bits[4] = 0, bits[5] = 1

AND a nivel de bits. Ambos operandos deben tener el mismo ancho.

let result = bigint256("0xFF").bit_and(bigint256("0x0F"))
assert(result == bigint256("0x0F"))

OR a nivel de bits. Ambos operandos deben tener el mismo ancho.

let result = bigint256("0xF0").bit_or(bigint256("0x0F"))
assert(result == bigint256("0xFF"))

XOR a nivel de bits. Ambos operandos deben tener el mismo ancho.

let result = bigint256("0xFF").bit_xor(bigint256("0x0F"))
assert(result == bigint256("0xF0"))

NOT a nivel de bits (invierte todos los bits).

let x = bigint256(0).bit_not() // todos los bits activados

Desplaza a la izquierda n bits. Error si algún bit se desborda.

assert(bigint256(1).bit_shl(8) == bigint256(256))

Desplaza a la derecha n bits. Los bits desplazados se descartan.

assert(bigint256(256).bit_shr(8) == bigint256(1))

Alias para la función global from_bits.

let val = BigInt::from_bits(bigint256(42).to_bits(), 256)
assert(val == bigint256(42))

TipoMétodoArgsDevuelve
Int.abs()0Int
.min(otro)1Int
.max(otro)1Int
.pow(exp)1Int
.to_field()0Field
.to_string()0String
String.len()0Int
.starts_with(prefijo)1Bool
.ends_with(sufijo)1Bool
.contains(substr)1Bool
.split(delim)1List
.trim()0String
.replace(buscar, reempl)2String
.to_upper()0String
.to_lower()0String
.chars()0List
.index_of(substr)1Int
.substring(inicio, fin)2String
.repeat(n)1String
.to_string()0String
List.len()0Int
.push(elem)1nil
.pop()0valor
.map(fn)1List
.filter(fn)1List
.reduce(init, fn)2valor
.for_each(fn)1nil
.find(fn)1valor
.any(fn)1Bool
.all(fn)1Bool
.sort(fn)1List
.flat_map(fn)1List
.zip(otra)1List
Map.len()0Int
.keys()0List
.values()0List
.entries()0List
.contains_key(clave)1Bool
.get(clave, default)2valor
.set(clave, valor)2nil
.remove(clave)1valor
Field.to_int()0Int
.to_string()0String
BigInt.to_bits()0List
.bit_and(otro)1BigInt
.bit_or(otro)1BigInt
.bit_xor(otro)1BigInt
.bit_not()0BigInt
.bit_shl(n)1BigInt
.bit_shr(n)1BigInt
NamespaceMiembroValor
Int::MAX576460752303423487 (2^59 - 1)
Int::MIN-576460752303423488 (-2^59)
Field::ZEROElemento de campo 0
Field::ONEElemento de campo 1
Field::ORDERMódulo BN254 Fr (string)
BigInt::from_bitsConstructor from_bits(bits, ancho)