Cambios Semánticos y de Léxico

Forja ha evolucionado significativamente desde sus inicios. Este documento cataloga todos los cambios semánticos y de léxico —traducciones de palabras clave, renombres de constructores, cambios de sintaxis y evolución del sistema de tipos— que han ocurrido durante el desarrollo del lenguaje.


1. Léxico: Palabras Clave Traducidas al Español

Forja es un lenguaje en español. Todas las palabras clave del lenguaje están en español (con algunas excepciones por compatibilidad). El mapeo completo se encuentra en src/lexer.rs:132-191.

1.1. Palabras Clave Principales

Forja (Español)Equivalente en otros lenguajesCompatibilidad (inglés)Descripción
variable / varlet, varDeclara una variable mutable
constante / constconstconstDeclara una constante inmutable
funcion / funfunction, fnfunDeclara una función o método
siifInicia un bloque condicional
sinoelseRama alternativa de un condicional
mientraswhileBucle controlado por condición
paraforBucle clásico de estilo C
repetirloop, repeatBucle de repetición fija
romper / breakbreakbreakSale del bucle activo
continuar / continuecontinuecontinuePasa a la siguiente iteración
retornarreturnDevuelve un valor desde una función
importarimportCarga módulos externos
claseclassDeclara una clase
tipotype, enumDeclara un tipo algebraico (enum)
coincidirmatchPattern matching
casocaseBrazo de pattern matching
rasgotrait, interfaceDefine interfaces / traits
implementaimpl, implementsImplementa un rasgo para una clase
dondewhereCláusula de restricciones de tipo
nuevonewInstancia una clase
estethis, selfReferencia a la instancia actual
constructorconstructor, initDeclara el constructor de una clase
prestadoref, &Referencia prestada (borrowing)
mutmutmutModificador de mutabilidad
verdaderotrueLiteral booleano verdadero
falsofalseLiteral booleano falso
nulonullValor nulo / ausencia de valor

1.2. Concurrencia y Canales

Forja (Español)EquivalenteDescripción
hilothreadLanza un hilo de ejecución
canalchannelCrea un canal de comunicación
enviarsendEnvía un mensaje por un canal
recibirrecv, receiveRecibe un mensaje de un canal
unirjoinEspera la finalización de un hilo
seleccionarselectSelección no bloqueante de canales
tiempotimeoutRama de timeout en seleccionar
otrodefaultRama por defecto en seleccionar

1.3. Design by Contract

Forja (Español)Equivalente (Eiffel)Descripción
requiererequirePrecondición de función
aseguraensurePostcondición de función
siempreinvariantInvariante de clase
resultadoResultValor de retorno en postcondiciones
anterioroldValor anterior en postcondiciones

1.4. Funciones Built-in y Misceláneas

ForjaEquivalenteDescripción
escribirprint, printlnImprime en la terminal
leerread, inputLee entrada del usuario
BDdbPalabra clave para operaciones de base de datos
externo / externaexternFirma de función externa (FFI)
cuandowhen, onchangeBloque reactivo / observer

1.5. Operadores Lógicos (cambio histórico)

Forja actualAnteriormenteEquivalente
yand / &&&&
oor / ||||
nonot / !!

⚠️ Nota: Los operadores &&, || y ! también son válidos. La versión textual en español es la recomendada.


2. Constructores de Option y Resultado

Forja soporta tipos algebraicos Opcion (Option) y Resultado (Result) directamente como variantes del AST (expresiones nativas), sin necesidad de un prelude. Los constructores aceptan tanto su forma en español como su forma en inglés para compatibilidad máxima.

Archivo fuente: src/ast.rs, src/bytecode.rs:1689-1694

TipoConstructorVariantes aceptadasTag interno
OpcionAlguno(valor)Alguno, Algo, Some"some"
OpcionNinguno()Ninguno, None"none"
ResultadoOk(valor)Ok"ok"
ResultadoError(valor)Error, Err"error"

2.1. Uso en código

Ejemplo: Option y Resultado en Forja
// Las tres formas son equivalentes:
variable a = Alguno(42)
variable b = Algo(42)
variable c = Some(42)

// Pattern matching con constructores en español:
coincidir (a) {
    caso Alguno(v) => escribir("Tengo: ", v)
    caso Ninguno => escribir("No hay valor")
}

// Resultado:
variable res = Ok("exitoso")
variable err = Error("falló")

// También funciona con inglés:
variable res2 = Ok("ok")
variable err2 = Err("error")

2.2. Pattern matching interno

Cuando se usa coincidir con estos constructores, el compilador genera bytecode que inspecciona el campo "tipo" del objeto (vía GetField("tipo")) y lo compara con el tag interno. Si hay subpatrones (ej: Alguno(v)), extrae el campo "valor" y lo asigna a la variable.

Bytecode generado para caso Alguno(v)
Dup
GetField("tipo")
PushTexto("some")
Igual
JumpSiFalso(label_next)
GetField("valor")
Store("v")
[ejecutar cuerpo]
Label(label_next)

ℹ️ Para más detalles sobre este proceso, ver src/bytecode.rs:1687-1784 y src/parser.rs:2139-2161.


3. Tipos de Datos Primitivos

Los nombres de tipos en Forja están en español y se manejan como soft keywords (identificadores que el parser reconoce como tipos en contexto). Ver src/lexer.rs:182-190.

ForjaRustDescripción
Enteroi64Entero con signo de 64 bits
Decimalf64Número de punto flotante de 64 bits
TextoStringCadena de caracteres
BooleanoboolValor booleano (verdadero/falso)
Exacto(i128, u32)Número decimal de precisión arbitraria (BigDecimal)
Nulo()Unidad / ausencia de valor

4. Evolución del Sistema de Tipos (AST)

El AST de Forja (src/ast.rs) ha evolucionado para incluir variantes específicas para los tipos algebraicos. Ver la tabla completa de Tipo y Expresion en la página del AST.

4.1. Tipo enum

Evolución del enum Tipo:

VarianteSignificadoCambio semántico
EnteroEntero i64Originalmente era Int → renombrado a Entero
DecimalFlotante f64Originalmente Float → renombrado
TextoStringOriginalmente String → renombrado
BooleanoBoolOriginalmente Bool → renombrado
NuloUnidadAgregado posteriormente
ExactoBigDecimalAgregado para el sistema Exacto con precisión arbitraria
Clase(String, Vec<Tipo>)Clase/objetoEvolucionó de un simple nombre a incluir parámetros genéricos
Arreglo(Box<Tipo>)ArrayAgregado para listas tipadas
Funcion(Vec<Tipo>, Box<Tipo>)Firma de funciónAgregado para tipos función (params → retorno)
Resultado(Box<Tipo>, Box<Tipo>)Result (ok, error)Agregado para el tipo Resultado
Opcion(Box<Tipo>)OptionAgregado para el tipo Opcion
RasgoObjeto(String)Trait objectAgregado para polimorfismo dinámico
Parametro(String)Parámetro genéricoAgregado para genéricos

4.2. Expresiones de Option y Resultado

El enum Expresion incluye variantes específicas para tipos algebraicos:

VarianteAntesAhoraDescripción
Algo(Box<Expresion>)Some(expr)Algo(expr)Constructor de Opcion con valor
NingunoNoneNingunoConstructor de Opcion vacío
Ok(Box<Expresion>)Ok(expr)Ok(expr)Constructor de Resultado exitoso
Error(Box<Expresion>)Err(expr)Error(expr)Constructor de Resultado fallido

5. Nombres de Opcodes y Micro-Operaciones

Los opcodes del bytecode (src/bytecode.rs) y las micro-operaciones (src/uops.rs) usan nombres en español o spanglish técnico:

Uop / OpcodeTraducciónDescripción
PushEnteroPush IntegerApila un entero
PushDecimalPush DecimalApila un float
PushTextoPush TextApila una cadena
PushBooleanoPush BooleanApila un booleano
PushNuloPush NullApila el valor nulo
JumpSiFalsoJump If FalseSalto condicional si es falso
DeclareVarDeclare VariableDeclara una variable en el ámbito actual
IncrVarIncrement VariableOptimización: incremento directo
ResolveMethodResolve MethodResolución de método virtual
LoadSelfLoad SelfCarga este en el stack
CallNativeCall NativeLlama a función nativa registrada

6. Cambios en la CLI

Los comandos de la interfaz de línea de comandos aceptan tanto español como inglés:

Comando en españolComando en inglésFunción
forja correrforja runEjecutar un archivo
forja ejecutarforja runEjecutar un archivo
forja compilarforja buildGenerar ejecutable
forja construirforja buildGenerar ejecutable
forja formatearforja fmtFormatear código
forja medirforja benchMedir rendimiento
forja diagramaforja diagramGenerar diagrama del AST
forja graficoforja graphGenerar diagrama del AST
forja nuevoforja newCrear nuevo proyecto
forja crearforja newCrear nuevo proyecto
forja ayudaforja helpMostrar ayuda
forja colorearforja highlightColorear sintaxis
forja explicarforja explainExplicar un concepto
forja aprenderforja learnTutorial interactivo
forja transpilarforja transpileTranspilar a Rust
forja interactivoforja replModo interactivo REPL

7. Convenciones de Nomenclatura en Código Rust

El código fuente del compilador de Forja (Rust) usa una mezcla de nomenclatura en español e inglés. Las estructuras, funciones y tipos públicos tienden a usar spanglish técnico:

7.1. Estructuras y Tipos en Rust

Nombre RustTraducción / Notas
TokenKindMantiene el inglés, pero los valores del enum están en español: Si, Sino, Funcion, etc.
ValorFastSpanglish: "Fast" por ForjaFast, "Valor" en español
ForjaFastNombre en español + "Fast" técnico
FrmFastContracción de "Frame Fast"
CompiledCodeInglés, pero funciones asociadas pueden usar español
CodeBufCódigo + Buffer (inglés)
ClassDescriptorInglés técnico
TablaSimbolosEspañol completo
BorrowCheckerInglés (término técnico estándar)
TypeCheckerInglés (término técnico estándar)
LlvmBackendSpanglish
CompilerAsmSpanglish
TargetArchInglés técnico
JitOrchestratorSpanglish (Orquestador JIT)
StackCacheInglés técnico (aunque stack se usa como préstamo)

7.2. Funciones en Rust con nombres en español

FunciónTraducción
generar_prelude()Generate prelude
expandir_a_uops()Expand to uops
remapear_saltos_uops()Remap jump uops
construir_mapeo_posiciones()Build position map
fusionar_opcodes()Fuse opcodes
sanitizar_para_serializacion()Sanitize for serialization
obtener_tag_constructor()Get constructor tag
emitir_subpatrones_constructor()Emit constructor subpatterns
inferir_tipo_expresion()Infer expression type
resolver_nombre_mangled()Resolve mangled name
encontrar_variables_en_expr()Find variables in expression
tiene_anterior()Has predecessor
recolectar_clases()Collect classes
compilar_expresion_asm()Compile ASM expression
compilar_declaracion()Compile declaration

7.3. Funciones con nombre mixto o en inglés

FunciónNotas
peek(), advance(), match()Métodos de parser/lexer — nombres técnicos universales
tokenize(), parse(), compile()Nombres técnicos estándar de compiladores
intern(), intern_rc(), get()Symbol table — API en inglés
ejecutar(), ejecutar_uops()VM — español. Originalmente execute()
cargar_bytecode()Spanglish: "cargar" (español) + "bytecode" (inglés)
push_valor(), pop_valor()Spanglish: "push/pop" (técnico) + "valor" (español)
alloc_obj(), alloc_str()Spanglish: "alloc" (inglés) + "obj/str" (abreviaturas)

8. Historial de Cambios Semánticos Relevantes

8.1. Eliminación de mut en variables locales

Inicialmente Forja requería mut en toda variable mutable (como Rust). Se simplificó: ahora variable implica mutabilidad por defecto, y constante implica inmutabilidad. mut se conserva solo para parámetros de función y referencias prestadas.

8.2. De String a Texto

El tipo de cadena de caracteres se renombró de String a Texto para mantener coherencia con el idioma español. El cambio fue únicamente de nombre; la representación interna sigue siendo un String de Rust.

8.3. De Bool a Booleano

El tipo booleano se renombró de Bool a Booleano siguiendo la misma filosofía de españolización.

8.4. De None/Some a Ninguno/Alguno

Los constructores de Option se renombraron manteniendo compatibilidad hacia atrás. Actualmente se aceptan: Alguno, Algo, Some para el caso con valor; y Ninguno, None para el caso vacío. Ver sección 2 arriba.

8.5. De interface/trait a rasgo

Originalmente Forja usaba trait (como Rust) e interface (como Java). Se unificó bajo rasgo para mantener el español.

8.6. Adición de Design by Contract

Forja incorporó posteriormente requiere, asegura, siempre, resultado y anterior como keywords para el sistema de contratos (inspirado en Eiffel). Estas palabras no existían en versiones iniciales del lenguaje.

8.7. De println/print a escribir

Las funciones de salida estándar se renombraron de println/print a escribir. Sigue aceptando múltiples argumentos separados por coma.

8.8. Adición del tipo Exacto

Se agregó posteriormente el tipo Exacto para aritmética de precisión arbitraria (basado en (i128, u32) para coeficiente y escala), incluyendo soporte completo en el bytecode (Opcode::SumaExact, Opcode::MulExact, etc.) y en la VM ForjaFast.

8.9. De self/this a este

La palabra clave para referirse a la instancia actual evolucionó de aceptar self (como Rust/Python) y this (como Java/JS) a la forma unificada este en español.


9. Compatibilidad con Inglés

Forja mantiene compatibilidad selectiva con inglés para facilitar la migración desde otros lenguajes. Las siguientes palabras clave aceptan su forma inglesa:

Español (recomendado)Inglés (compatible)Contexto
romperbreakBucles
continuarcontinueBucles
funcionfunDeclaración de funciones
variablevarDeclaración de variables
constanteconstDeclaración de constantes
externoexternaFFI
AlgunoSome, AlgoConstructor Option
NingunoNoneConstructor Option
ErrorErrConstructor Resultado
y&&Operador lógico
o||Operador lógico
no!Operador lógico

10. Referencias en el Código Fuente

Todas las referencias a los archivos fuente relevantes: