Tipos y Valores
Achronyme es de tipado dinámico. Todos los valores se representan como palabras de 64 bits etiquetadas con una etiqueta de 4 bits y un payload de 60 bits.
| Tipo | Ejemplos | Descripción |
|---|---|---|
| Int | 42, -7 | Entero con signo de 60 bits (-2^59 a 2^59-1) |
| Bool | true, false | Valores booleanos |
| String | "hello" | Cadenas UTF-8 (asignadas en el heap) |
| List | [1, 2, 3] | Colecciones ordenadas |
| Map | {"a": 1, "b": 2} | Mapas clave-valor |
| Field | 0p42, 0pxFF, 0pb1010 | Elemento del campo escalar BN254 |
| BigInt256 | 0i256xFF, 0i256d42 | Entero sin signo de 256 bits (solo VM) |
| BigInt512 | 0i512xFF, 0i512d42 | Entero sin signo de 512 bits (solo VM) |
| Function | fn(x) { x + 1 } | Funciones y closures de primera clase |
| Proof | resultado de prove { } | Objeto de prueba Groth16 o PlonK |
| Nil | nil | Ausencia de valor |
Enteros
Sección titulada «Enteros»Los enteros son valores con signo de 60 bits almacenados en línea (sin asignación en heap). Rango: -576460752303423488 a 576460752303423487.
let x = 42let y = -7let big = 100000000000Si una operación aritmética desborda el rango i60, se genera un error en tiempo de ejecución. Usa literales de campo 0p cuando necesites aritmética modular de campo (ej., 0p42).
Booleanos
Sección titulada «Booleanos»let yes = truelet no = falseEn circuitos, true se mapea al elemento de campo 1 y false al 0.
Cadenas
Sección titulada «Cadenas»let greeting = "hello, world"let empty = ""let nums = [1, 2, 3]let mixed = [1, "two", true]let nested = [[1, 2], [3, 4]]let person = {"name": "Alice", "age": 30}Elementos de Campo
Sección titulada «Elementos de Campo»Elementos del campo escalar BN254 para operaciones criptográficas. Internamente en forma Montgomery. Se crean usando el prefijo 0p, que funciona como 0x para hexadecimal:
let a = 0p42 // literal de campo decimallet b = 0pxFF // literal de campo hexadecimallet c = 0pb1010 // literal de campo binariolet d = 0p21888242871839275222246405745257275088548364400416034343698204186575808495617 // decimal grande
let sum = a + blet prod = a * blet inv = 0p1 / a // inverso modularInt y Field no se pueden mezclar en operaciones aritméticas. 0p3 + 5 es un error en tiempo de ejecución — usa 0p3 + 0p5 en su lugar.
Los elementos de campo son esenciales para la programación de circuitos — todos los valores de circuito son elementos de campo internamente.
BigInt (solo VM)
Sección titulada «BigInt (solo VM)»Enteros sin signo de ancho fijo para operaciones criptográficas. Dos anchos: 256 bits (4 limbs) y 512 bits (8 limbs). Aritmética no modular con errores de desbordamiento.
Literales
Sección titulada «Literales»Los literales BigInt usan el prefijo 0i, seguido del ancho y la base:
let a = 0i256xFF // 256 bits hexadecimallet b = 0i256d255 // 256 bits decimallet c = 0i256b11111111 // 256 bits binariolet d = 0i512x1234 // 512 bits hexadecimalFunciones constructoras
Sección titulada «Funciones constructoras»let a = bigint256(42) // desde enterolet b = bigint256("0xFF") // desde cadena hexadecimallet c = bigint512(100) // 512 bits desde enteroAritmética
Sección titulada «Aritmética»Los operadores estándar funcionan entre BigInts del mismo ancho:
let x = 0i256d10let y = 0i256d20let sum = x + y // 30let diff = y - x // 10let prod = x * y // 200let q = y / x // 2let r = 0i256d25 % 0i256d7 // 4let p = 0i256d2 ^ 10 // 1024Seguridad de tipos
Sección titulada «Seguridad de tipos»BigInt no se puede mezclar con Int, Field, ni con un BigInt de diferente ancho:
// Todos estos son errores en tiempo de ejecución:// bigint256(1) + 1 -- BigInt + Int// bigint256(1) + 0p1 -- BigInt + Field// bigint256(1) + bigint512(1) -- incompatibilidad de anchoOperaciones a nivel de bits
Sección titulada «Operaciones a nivel de bits»bit_and(a, b) // AND a nivel de bitsbit_or(a, b) // OR a nivel de bitsbit_xor(a, b) // XOR a nivel de bitsbit_not(a) // NOT a nivel de bitsbit_shl(a, n) // desplazamiento a la izquierda (error si los bits desbordan)bit_shr(a, n) // desplazamiento a la derecha
let bits = to_bits(a) // lista de 0/1 (LSB primero)let val = from_bits(bits, 256) // reconstruir desde bitstypeof() devuelve "BigInt256" o "BigInt512" para valores BigInt.
let nothing = nilnil representa la ausencia de un valor. Las funciones sin una sentencia return devuelven nil.
Namespaces Estáticos
Sección titulada «Namespaces Estáticos»Usa la sintaxis Tipo::MIEMBRO para acceder a constantes a nivel de tipo:
// Límites de enterosprint(Int::MAX) // 576460752303423487 (2^59 - 1)print(Int::MIN) // -576460752303423488 (-2^59)
// Constantes de campolet zero = Field::ZEROlet one = Field::ONElet order = Field::ORDER // Módulo BN254 Fr como string
// Constructor BigIntlet val = BigInt::from_bits(bits, 256)Consulta Métodos y Namespaces Estáticos para la referencia completa.
Vinculaciones de Variables
Sección titulada «Vinculaciones de Variables»let x = 42 // vinculación inmutablemut y = 0 // vinculación mutabley = y + 1 // reasignación (solo para mut)let crea una vinculación inmutable. mut crea una vinculación mutable que puede ser reasignada.
Anotaciones de Tipo
Sección titulada «Anotaciones de Tipo»Achronyme soporta anotaciones de tipo opcionales en vinculaciones de variables y firmas de funciones. En modo circuito, las anotaciones habilitan verificación de tipos en tiempo de compilación y optimización de restricciones. En modo VM, las anotaciones se parsean y aceptan pero la ejecución sigue siendo dinámica.
let x: Field = 0p42let flag: Bool = truemut counter: Field = 0p0Consulta Anotaciones de Tipo para la referencia completa en contexto de circuitos.