diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 108105d56e..1abc737580 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -2069,6 +2069,15 @@ EmberScript: codemirror_mode: coffeescript codemirror_mime_type: text/x-coffeescript language_id: 103 +Ene: + type: programming + color: "#AA151B" + extensions: + - ".ñ" + - ".ene" + tm_scope: source.ñ + ace_mode: text + language_id: 1492 Erlang: type: programming color: "#B83998" diff --git "a/samples/Ene/benchmark.\303\261" "b/samples/Ene/benchmark.\303\261" new file mode 100644 index 0000000000..aedf60791a --- /dev/null +++ "b/samples/Ene/benchmark.\303\261" @@ -0,0 +1,10 @@ +ññ Benchmark: bucle con operaciones aritméticas + +variable resultado = 0; +variable i = 0; +mientras (i < 100000) { + resultado = resultado + i * 2; + i = i + 1; +} +imprimir("Resultado: " + resultado); +imprimir("Iteraciones: " + i); diff --git "a/samples/Ene/hola.\303\261" "b/samples/Ene/hola.\303\261" new file mode 100644 index 0000000000..fea445de4d --- /dev/null +++ "b/samples/Ene/hola.\303\261" @@ -0,0 +1,6 @@ +imprimir("empecemos"); + + +variable nombre = "Ejemplo"; + +imprimir("Hola, soy " + nombre); diff --git "a/samples/Ene/lib_matematica.\303\261" "b/samples/Ene/lib_matematica.\303\261" new file mode 100644 index 0000000000..b8be073c15 --- /dev/null +++ "b/samples/Ene/lib_matematica.\303\261" @@ -0,0 +1,9 @@ +funcion sumar(a, b) { + devolver a + b; +} + +clase Calculadora { + publico funcion cuadrado(x) { + devolver x * x; + } +} diff --git "a/samples/Ene/test_abstractas.\303\261" "b/samples/Ene/test_abstractas.\303\261" new file mode 100644 index 0000000000..c3da40c2e9 --- /dev/null +++ "b/samples/Ene/test_abstractas.\303\261" @@ -0,0 +1,18 @@ +abstracta clase Figura { + inicio(n) { este.nombre = n; } + publico funcion saludar() { imprimir("Soy una figura: " + este.nombre); } +} + +clase Circulo hereda Figura { + inicio(r) { super.inicio("Círculo"); este.radio = r; } +} + +variable c = nueva Circulo(5); +c.saludar(); + +imprimir("Intentando instanciar Figura (abstracta)..."); +intentar { + variable f = nueva Figura("Error"); +} capturar(e) { + imprimir("Capturado error esperado: " + e); +} diff --git "a/samples/Ene/test_asincronia.\303\261" "b/samples/Ene/test_asincronia.\303\261" new file mode 100644 index 0000000000..883e27617c --- /dev/null +++ "b/samples/Ene/test_asincronia.\303\261" @@ -0,0 +1,10 @@ +asincrono funcion tareaLanzada(ms) { + imprimir("Tarea asíncrona iniciada..."); + devolver "Tarea completada con éxito"; +} + +imprimir("Lanzando tarea..."); +variable t = tareaLanzada(1000); +imprimir("Esperando resultado..."); +variable r = esperar t; +imprimir("Resultado: " + r); diff --git "a/samples/Ene/test_colecciones.\303\261" "b/samples/Ene/test_colecciones.\303\261" new file mode 100644 index 0000000000..4018b3af7b --- /dev/null +++ "b/samples/Ene/test_colecciones.\303\261" @@ -0,0 +1,23 @@ +variable misNumeros = lista(); +misNumeros.añadir(10); +misNumeros.añadir(20); +misNumeros.añadir(30); + +imprimir("Tamaño de la lista: " + misNumeros.tamaño()); +imprimir("Elemento en 1: " + misNumeros.obtener(1)); + +imprimir("Recorriendo lista con para-en:"); +para (variable n en misNumeros) { + imprimir("Número: " + n); +} + +variable miDicc = diccionario(); +miDicc.poner("clave1", "valor1"); +miDicc.poner("clave2", "valor2"); + +imprimir("Valor de clave1: " + miDicc.obtener("clave1")); + +imprimir("Recorriendo claves del diccionario:"); +para (variable k en miDicc) { + imprimir("Clave: " + k + " -> Valor: " + miDicc.obtener(k)); +} diff --git "a/samples/Ene/test_comentarios_v1.\303\261" "b/samples/Ene/test_comentarios_v1.\303\261" new file mode 100644 index 0000000000..0903b756b7 --- /dev/null +++ "b/samples/Ene/test_comentarios_v1.\303\261" @@ -0,0 +1,10 @@ +ñññ + Este es un comentario multilínea + al estilo Ñ v1.0. +ñññ + +variable mensaje = "Hola Mundo"; ññ Comentario de una sola línea +imprimir(mensaje); + +ññ Prueba de comentario al final del archivo +ñññ ñññ ññ Comentario de bloque vacío diff --git "a/samples/Ene/test_contratos.\303\261" "b/samples/Ene/test_contratos.\303\261" new file mode 100644 index 0000000000..d4587bca52 --- /dev/null +++ "b/samples/Ene/test_contratos.\303\261" @@ -0,0 +1,17 @@ +contrato Volador { + volar(); + aterrizar(); +} + +clase Pajaro implementa Volador { + publico funcion volar() { + imprimir("El pájaro está volando..."); + } + publico funcion aterrizar() { + imprimir("El pájaro ha aterrizado."); + } +} + +variable miPajaro = nueva Pajaro(); +miPajaro.volar(); +miPajaro.aterrizar(); diff --git "a/samples/Ene/test_control.\303\261" "b/samples/Ene/test_control.\303\261" new file mode 100644 index 0000000000..447389726d --- /dev/null +++ "b/samples/Ene/test_control.\303\261" @@ -0,0 +1,16 @@ +imprimir("Probando romper y continuar:"); +variable i = 0; +mientras (i < 10) { + i = i + 1; + si (i == 5) continuar; + si (i == 8) romper; + imprimir("Contando: " + i); +} + +imprimir("Probando segun:"); +variable color = "rojo"; +segun (color) { + caso "azul" { imprimir("El color es azul"); } + caso "rojo" { imprimir("El color es rojo"); } + predeterminado { imprimir("Color desconocido"); } +} diff --git "a/samples/Ene/test_cripto.\303\261" "b/samples/Ene/test_cripto.\303\261" new file mode 100644 index 0000000000..5f62927f4f --- /dev/null +++ "b/samples/Ene/test_cripto.\303\261" @@ -0,0 +1,33 @@ +ññ test_cripto.ñ +imprimir("== Prueba de Ene.Cripto =="); + +variable texto = "Este es un mensaje secreto en Ñ"; +imprimir("Texto original: " + texto); + +ññ Hash +variable hash = Ene.Cripto.hash256(texto); +imprimir("Hash SHA-256: " + hash); + +ññ Base64 +variable b64_cifrado = Ene.Cripto.cifrarBase64(texto); +imprimir("Texto en Base64: " + b64_cifrado); +variable b64_descifrado = Ene.Cripto.descifrarBase64(b64_cifrado); +imprimir("Decodificado Base64: " + b64_descifrado); + +si (texto != b64_descifrado) { + imprimir("ERROR al decodificar Base64"); +} + +ññ AES +variable clave = "SuperClaveSecreta123"; +variable aes_cifrado = Ene.Cripto.cifrarAES(texto, clave); +imprimir("Cifrado AES (Base64): " + aes_cifrado); + +variable aes_descifrado = Ene.Cripto.descifrarAES(aes_cifrado, clave); +imprimir("Descifrado AES: " + aes_descifrado); + +si (texto != aes_descifrado) { + imprimir("ERROR al descifrar AES"); +} sino { + imprimir("AES funciona correctamente!"); +} diff --git "a/samples/Ene/test_datos.\303\261" "b/samples/Ene/test_datos.\303\261" new file mode 100644 index 0000000000..6a4c1a319a --- /dev/null +++ "b/samples/Ene/test_datos.\303\261" @@ -0,0 +1,31 @@ +ññ test_datos.ñ +imprimir("== Prueba de Ene.Datos =="); + +Ene.Archivo.borrar("prueba.db"); ññ Por si acaso + +variable bd = Ene.Datos.abrir("Data Source=prueba.db"); + +ññ Crear tabla +bd.ejecutar("CREATE TABLE Usuarios (id INTEGER PRIMARY KEY, nombre TEXT, edad INTEGER)"); +imprimir("Tabla Usuarios creada."); + +ññ Insertar datos +bd.ejecutar("INSERT INTO Usuarios (nombre, edad) VALUES ('Ana', 25)"); +bd.ejecutar("INSERT INTO Usuarios (nombre, edad) VALUES ('Beto', 30)"); +bd.ejecutar("INSERT INTO Usuarios (nombre, edad) VALUES ('Carlos', 22)"); +imprimir("Usuarios insertados."); + +ññ Consultar +variable usuarios = bd.consultar("SELECT * FROM Usuarios"); +imprimir("Resultados de la consulta:"); +imprimir("Total de usuarios: " + usuarios.tamaño()); + +variable i = 0; +mientras (i < usuarios.tamaño()) { + variable u = usuarios.obtener(i); + imprimir("ID: " + u.obtener("id") + " - Nombre: " + u.obtener("nombre") + " - Edad: " + u.obtener("edad")); + i = i + 1; +} + +bd.cerrar(); +imprimir("Base de datos cerrada."); diff --git "a/samples/Ene/test_enums.\303\261" "b/samples/Ene/test_enums.\303\261" new file mode 100644 index 0000000000..e11c91db61 --- /dev/null +++ "b/samples/Ene/test_enums.\303\261" @@ -0,0 +1,13 @@ +enum Direccion { + Norte, + Sur, + Este, + Oeste +} + +variable miDir = Direccion.Norte; +imprimir("Mi dirección es: " + miDir); + +si (miDir == Direccion.Norte) { + imprimir("Voy hacia el Norte."); +} diff --git "a/samples/Ene/test_es.\303\261" "b/samples/Ene/test_es.\303\261" new file mode 100644 index 0000000000..9cd16061a4 --- /dev/null +++ "b/samples/Ene/test_es.\303\261" @@ -0,0 +1,17 @@ +contrato Volador { volar(); } +clase Ave implementa Volador { publico funcion volar() { imprimir("Volando..."); } } +clase Avion implementa Volador { publico funcion volar() { imprimir("Motor encendido..."); } } +clase Perro { } + +variable miAve = nueva Ave(); +variable miPerro = nueva Perro(); + +imprimir("¿miAve es Ave? " + (miAve es Ave)); +imprimir("¿miAve es Volador? " + (miAve es Volador)); +imprimir("¿miPerro es Volador? " + (miPerro es Volador)); +imprimir("¿10 es entero? " + (10 es "entero")); +imprimir("¿'hola' es cadena? " + ("hola" es "cadena")); + +si (miAve es Volador) { + miAve.volar(); +} diff --git "a/samples/Ene/test_excepciones.\303\261" "b/samples/Ene/test_excepciones.\303\261" new file mode 100644 index 0000000000..4b2f1976ae --- /dev/null +++ "b/samples/Ene/test_excepciones.\303\261" @@ -0,0 +1,15 @@ +intentar { + imprimir("Intentando algo peligroso..."); + variable x = 10 / 0; // Esto debería lanzar un error interno de división por cero o similar que manejamos +} capturar(error) { + imprimir("¡Atrapé un error!: " + error); +} + +imprimir("El programa continúa después del error."); + +intentar { + imprimir("Llamando a algo que no existe..."); + variable p = nueva PersonaInexistente(); +} capturar(e) { + imprimir("Error capturado: " + e); +} diff --git "a/samples/Ene/test_fallo_contrato.\303\261" "b/samples/Ene/test_fallo_contrato.\303\261" new file mode 100644 index 0000000000..93374ea14a --- /dev/null +++ "b/samples/Ene/test_fallo_contrato.\303\261" @@ -0,0 +1,10 @@ +contrato Volador { + volar(); +} + +// Esta clase debería fallar al no implementar 'volar' +clase Piedra implementa Volador { + publico funcion saludar() { imprimir("Soy una piedra"); } +} + +imprimir("Esto no debería ejecutarse."); diff --git "a/samples/Ene/test_fase5.\303\261" "b/samples/Ene/test_fase5.\303\261" new file mode 100644 index 0000000000..819d86bb5e --- /dev/null +++ "b/samples/Ene/test_fase5.\303\261" @@ -0,0 +1,29 @@ +contrato Identificable { + obtenerId(); +} + +clase Usuario implementa Identificable { + inicio(i) { este.id = i; } + publico funcion obtenerId() { devolver este.id; } +} + +// Genérico con restricción (donde G hereda Identificable) +// Nota: 'hereda' se usa tanto para clases como contratos en restricciones +clase Repositorio donde G hereda Identificable { + inicio() { este.items = lista(); } + publico funcion añadir(item) { este.items.añadir(item); } + publico funcion mostrarTodos() { + para (item en este.items) { + imprimir("ID: " + item.obtenerId()); + } + } +} + +// Inferencia de tipos (variable sin tipo complejo explícito) +variable repo = nueva Repositorio(); +variable user1 = nueva Usuario(101); +variable user2 = nueva Usuario(202); + +repo.añadir(user1); +repo.añadir(user2); +repo.mostrarTodos(); diff --git "a/samples/Ene/test_fase6.\303\261" "b/samples/Ene/test_fase6.\303\261" new file mode 100644 index 0000000000..cc1673e5c4 --- /dev/null +++ "b/samples/Ene/test_fase6.\303\261" @@ -0,0 +1,31 @@ +// Prueba de Ene.Archivo +variable ruta = "prueba.txt"; +variable contenido = "Hola desde Ñ, este es un archivo de prueba. 12345"; + +imprimir("Escribiendo archivo..."); +Ene.Archivo.escribirToda(ruta, contenido); + +si (Ene.Archivo.existe(ruta)) { + imprimir("¡El archivo existe!"); + variable leido = Ene.Archivo.leerToda(ruta); + imprimir("Contenido leído: " + leido); +} sino { + imprimir("Error: El archivo no se creó."); +} + +// Prueba de Ene.Json +variable datos = diccionario(); +datos.poner("nombre", "Jorge"); +datos.poner("edad", 30); +datos.poner("lenguajes", lista()); +datos.obtener("lenguajes").añadir("Ñ"); +datos.obtener("lenguajes").añadir("CSharp"); + +imprimir("Codificando a JSON..."); +variable jsonStr = Ene.Json.codificar(datos); +imprimir("JSON: " + jsonStr); + +imprimir("Decodificando JSON..."); +variable obj = Ene.Json.decodificar(jsonStr); +imprimir("Nombre decodificado: " + obj.obtener("nombre")); +imprimir("Edad decodificada: " + obj.obtener("edad")); diff --git "a/samples/Ene/test_fase6_red.\303\261" "b/samples/Ene/test_fase6_red.\303\261" new file mode 100644 index 0000000000..847cdd91a8 --- /dev/null +++ "b/samples/Ene/test_fase6_red.\303\261" @@ -0,0 +1,7 @@ +imprimir("Realizando petición HTTP..."); +intentar { + variable respuesta = Ene.Red.obtener("https://api.github.com/zen"); + imprimir("Respuesta de GitHub: " + respuesta); +} capturar (e) { + imprimir("Error en la red: " + e); +} diff --git "a/samples/Ene/test_final_1.0.\303\261" "b/samples/Ene/test_final_1.0.\303\261" new file mode 100644 index 0000000000..791fc8283e --- /dev/null +++ "b/samples/Ene/test_final_1.0.\303\261" @@ -0,0 +1,41 @@ +// Prueba Final de Librería Base 1.0 + +// 1. Archivos Avanzados +imprimir("--- Prueba de Archivos ---"); +Ene.Archivo.crearCarpeta("respaldo"); +Ene.Archivo.escribirToda("nota.txt", "Esta es una nota importante."); +imprimir("Archivo creado."); +Ene.Archivo.mover("nota.txt", "respaldo/nota_v1.txt"); +imprimir("Archivo movido a carpeta 'respaldo'."); + +// 2. Sistema +imprimir("--- Prueba de Sistema ---"); +imprimir("Argumentos del programa: " + Ene.Sistema.argumentos()); + +// 3. GUI Interactiva +imprimir("--- Lanzando GUI Interactiva ---"); +variable contador = 0; + +funcion refrescar() { + variable html = ""; + html = html + "

Consola Interactiva \u00D1

"; + html = html + "
" + contador + "
"; + html = html + ""; + html = html + "

Pulsa el bot\u00F3n para interactuar con el int\u00E9rprete

"; + html = html + ""; + Ene.Interfase.actualizar(html); +} + +Ene.Interfase.alClic("mas", funcion() { + contador = contador + 1; + imprimir("[Interfase] Boton pulsado. Contador: " + contador); + refrescar(); +}); + +refrescar(); +Ene.Interfase.ventana("Mi App en \u00D1"); + +imprimir("Manteniendo aplicacion abierta (Ctrl+C para salir)..."); +mientras (verdadero) { + Ene.Sistema.dormir(100); +} diff --git "a/samples/Ene/test_funciones.\303\261" "b/samples/Ene/test_funciones.\303\261" new file mode 100644 index 0000000000..eec45ceeb0 --- /dev/null +++ "b/samples/Ene/test_funciones.\303\261" @@ -0,0 +1,16 @@ +clase Persona { + privado cadena nombre; + privado entero edad; + + funcion inicio(cadena nombre, entero edad) { + este.nombre = nombre; + este.edad = edad; + } + + funcion presentarse() { + imprimir("Hola, mi nombre es " + este.nombre + " y tengo " + este.edad + " años."); + } +} + +Persona juan = nueva Persona("Juan", 30); +juan.presentarse(); \ No newline at end of file diff --git "a/samples/Ene/test_genericos.\303\261" "b/samples/Ene/test_genericos.\303\261" new file mode 100644 index 0000000000..1631c3575d --- /dev/null +++ "b/samples/Ene/test_genericos.\303\261" @@ -0,0 +1,7 @@ +clase Caja { + inicio(v) { este.valor = v; } + publico funcion obtener() { devolver este.valor; } +} + +variable miCaja = nueva Caja("Diamante"); +imprimir("Caja contiene: " + miCaja.obtener()); diff --git "a/samples/Ene/test_graficos.\303\261" "b/samples/Ene/test_graficos.\303\261" new file mode 100644 index 0000000000..3c089f4887 --- /dev/null +++ "b/samples/Ene/test_graficos.\303\261" @@ -0,0 +1,52 @@ +ññ test_graficos.ñ +imprimir("== Prueba de Ene.Gráficos =="); + +ññ Inicializar ventana +variable ancho = 800; +variable alto = 600; +Ene.Gráficos.iniciarVentana(ancho, alto, "Mi Primera Ventana con Ene.Graficos"); + +ññ Colores RGB(A) +variable colorFondo = Ene.lista(); +colorFondo.añadir(245); colorFondo.añadir(245); colorFondo.añadir(245); colorFondo.añadir(255); + +variable colorCaja = Ene.lista(); +colorCaja.añadir(50); colorCaja.añadir(150); colorCaja.añadir(250); colorCaja.añadir(255); + +variable colorTexto = Ene.lista(); +colorTexto.añadir(20); colorTexto.añadir(20); colorTexto.añadir(20); colorTexto.añadir(255); + +ññ Variables de animación +variable posX = 100; +variable posY = 250; +variable velX = 4; + +variable fps = 60; +variable espera_ms = 1000 / fps; + +imprimir("Presiona la X en la ventana para salir..."); + +mientras (!Ene.Gráficos.ventanaDeberiaCerrar()) { + + ññ Actualizar lógica + posX = posX + velX; + si (posX > ancho - 50) { velX = -4; } + si (posX < 0) { velX = 4; } + + ññ Dibujar + Ene.Gráficos.iniciarDibujo(); + Ene.Gráficos.limpiarFondo(colorFondo); + + ññ x, y, ancho, alto, color + Ene.Gráficos.dibujarRectangulo(posX, posY, 50, 50, colorCaja); + + ññ texto, x, y, tamaño_fuente, color + Ene.Gráficos.dibujarTexto("Animacion con N!", 280, 200, 20, colorTexto); + + Ene.Gráficos.terminarDibujo(); + + Ene.Sistema.dormir(espera_ms); +} + +Ene.Gráficos.cerrarVentana(); +imprimir("Ventana cerrada."); diff --git "a/samples/Ene/test_gui.\303\261" "b/samples/Ene/test_gui.\303\261" new file mode 100644 index 0000000000..bbfea06069 --- /dev/null +++ "b/samples/Ene/test_gui.\303\261" @@ -0,0 +1,3 @@ +imprimir("Lanzando ventana de prueba..."); +Ene.Interfase.ventana("Hola Mundo desde Ñ", 400, 300); +imprimir("Ventana lanzada. Revisa tu navegador."); diff --git "a/samples/Ene/test_herencia.\303\261" "b/samples/Ene/test_herencia.\303\261" new file mode 100644 index 0000000000..91b634f6a1 --- /dev/null +++ "b/samples/Ene/test_herencia.\303\261" @@ -0,0 +1,28 @@ +clase Animal { + publico funcion inicio(nombre) { + este.nombre = nombre; + } + + publico funcion hacerSonido() { + imprimir(este.nombre + " hace un sonido genérico."); + } +} + +clase Perro hereda Animal { + publico funcion inicio(nombre, raza) { + super.inicio(nombre); + este.raza = raza; + } + + publico funcion hacerSonido() { + imprimir(este.nombre + " (un " + este.raza + ") dice: ¡Guau!"); + } + + publico funcion sonidoBase() { + super.hacerSonido(); + } +} + +variable miPerro = nueva Perro("Bobby", "Labrador"); +miPerro.hacerSonido(); +miPerro.sonidoBase(); diff --git "a/samples/Ene/test_jit.\303\261" "b/samples/Ene/test_jit.\303\261" new file mode 100644 index 0000000000..84a17b4d64 --- /dev/null +++ "b/samples/Ene/test_jit.\303\261" @@ -0,0 +1,15 @@ +ññ Prueba de rendimiento JIT Compiler + +imprimir("Probando JIT Compiler vs Tree-Walk..."); + +variable i = 0; +variable suma = 0; + +mientras (i < 100000) { + suma = suma + i; + i = i + 1; +} + +imprimir("Ciclos completados."); +imprimir("Suma total:"); +imprimir(suma); diff --git "a/samples/Ene/test_modulos.\303\261" "b/samples/Ene/test_modulos.\303\261" new file mode 100644 index 0000000000..d8edebeb60 --- /dev/null +++ "b/samples/Ene/test_modulos.\303\261" @@ -0,0 +1,7 @@ +importar "/home/user0000/Escritorio/lib_matematica.ñ"; + +imprimir("Usando función importada..."); +imprimir("Suma de 5 + 7 = " + sumar(5, 7)); + +variable calc = nueva Calculadora(); +imprimir("Cuadrado de 4 = " + calc.cuadrado(4)); diff --git "a/samples/Ene/test_paralelismo.\303\261" "b/samples/Ene/test_paralelismo.\303\261" new file mode 100644 index 0000000000..5393dec2f5 --- /dev/null +++ "b/samples/Ene/test_paralelismo.\303\261" @@ -0,0 +1,69 @@ +ññ Test completo de Paralelismo Real en Ñ + +ññ --- Test 1: Hilos con variable atómica --- +variable contador = nueva Atomico(0); + +funcion tarea(id) { + variable i = 0; + mientras (i < 3) { + contador.incrementar(); + imprimir("Hilo " + id + " - iteración " + i); + i = i + 1; + } +} + +variable h1 = nueva Hilo(tarea, 1); +variable h2 = nueva Hilo(tarea, 2); + +imprimir("=== Iniciando hilos ==="); +h1.iniciar(); +h2.iniciar(); +h1.unir(); +h2.unir(); + +imprimir("Hilos terminados."); +imprimir("Contador final (esperado 6): " + contador.obtener()); + +ññ --- Test 2: Bloqueo (sección crítica) --- +imprimir(""); +imprimir("=== Test de Bloqueo ==="); +variable bloqueo = nueva Bloqueo(); +variable recurso = nueva Atomico(0); + +funcion tareaConBloqueo(id) { + bloqueo.ejecutar(funcion() { + variable val = recurso.obtener(); + recurso.establecer(val + 1); + imprimir("Hilo " + id + " incrementó recurso a " + recurso.obtener()); + }); +} + +variable h3 = nueva Hilo(tareaConBloqueo, 3); +variable h4 = nueva Hilo(tareaConBloqueo, 4); +h3.iniciar(); +h4.iniciar(); +h3.unir(); +h4.unir(); +imprimir("Recurso final (esperado 2): " + recurso.obtener()); + +ññ --- Test 3: Semáforo --- +imprimir(""); +imprimir("=== Test de Semáforo ==="); +variable sem = nueva Semaforo(1); + +funcion tareaConSemaforo(id) { + sem.adquirir(); + imprimir("Hilo " + id + " entró a la sección crítica"); + sem.liberar(); + imprimir("Hilo " + id + " salió de la sección crítica"); +} + +variable h5 = nueva Hilo(tareaConSemaforo, 5); +variable h6 = nueva Hilo(tareaConSemaforo, 6); +h5.iniciar(); +h6.iniciar(); +h5.unir(); +h6.unir(); + +imprimir(""); +imprimir("=== Test de paralelismo completado ==="); diff --git "a/samples/Ene/test_poo.\303\261" "b/samples/Ene/test_poo.\303\261" new file mode 100644 index 0000000000..5da16185cd --- /dev/null +++ "b/samples/Ene/test_poo.\303\261" @@ -0,0 +1,30 @@ +clase Persona { + inicio(nombre, edad) { + este.nombre = nombre; + este.edad = edad; + } + + saludar() { + imprimir("Hola, mi nombre es " + este.nombre + " y tengo " + este.edad + " años."); + } + + cumplirAnios() { + este.edad = este.edad + 1; + imprimir("¡Felicidades! Ahora tengo " + este.edad + " años."); + } +} + +variable juan = nueva Persona("Juan", 25); +juan.saludar(); +juan.cumplirAnios(); + +imprimir("---"); + +clase Calculadora { + sumar(a, b) { + devolver a + b; + } +} + +variable calc = nueva Calculadora(); +imprimir("Resultado suma: " + calc.sumar(10, 5)); diff --git "a/samples/Ene/test_reflexion.\303\261" "b/samples/Ene/test_reflexion.\303\261" new file mode 100644 index 0000000000..3a4d240826 --- /dev/null +++ "b/samples/Ene/test_reflexion.\303\261" @@ -0,0 +1,30 @@ +[Serializable] +clase Persona { + publico inicio(nombre, edad) { + este.nombre = nombre; + este.edad = edad; + } + + [Log] + publico saludar() { + imprimir("Hola, soy " + este.nombre); + } +} + +variable p = nueva Persona("Alejandro", 30); +variable tipoP = Tipo.tipoDe(p); + +imprimir("--- Información de Clase ---"); +imprimir("Clase: " + tipoP); +imprimir("Atributos de Clase: " + Tipo.obtenerAtributos(tipoP)); + +variable metodos = Tipo.obtenerMetodos(tipoP); +imprimir("Métodos: " + metodos); + +imprimir("--- Información de Instancia ---"); +variable campos = Tipo.obtenerCampos(p); +imprimir("Campos: " + campos); + +imprimir("--- Información de Método ---"); +variable saludarMetodo = p.saludar; +imprimir("Atributos de saludar: " + Tipo.obtenerAtributos(saludarMetodo)); diff --git "a/samples/Ene/test_visibilidad.\303\261" "b/samples/Ene/test_visibilidad.\303\261" new file mode 100644 index 0000000000..1bda199c93 --- /dev/null +++ "b/samples/Ene/test_visibilidad.\303\261" @@ -0,0 +1,20 @@ +clase Cuenta { + privado funcion secreto() { + imprimir("Esto es un secreto."); + } + + publico funcion verSaldo() { + imprimir("Tu saldo es 1000."); + este.secreto(); // Acceso interno permitido + } +} + +variable miCuenta = nueva Cuenta(); +miCuenta.verSaldo(); // Debería funcionar + +intentar { + imprimir("Intentando acceder a método privado..."); + miCuenta.secreto(); // Debería fallar +} capturar(error) { + imprimir("Error esperado: " + error); +}