hispano-lang 1.1.7 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +637 -237
- package/dist/evaluator.js +1395 -259
- package/dist/parser.js +646 -201
- package/dist/tokenizer.js +199 -121
- package/package.json +12 -3
package/README.md
CHANGED
|
@@ -1,41 +1,106 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="https://raw.githubusercontent.com/nicvazquezdev/hispano-lang-website/main/public/hl-main-logo.png" alt="HispanoLang" width="180"/>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<strong>El lenguaje de programación en español</strong>
|
|
7
|
+
</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
Un lenguaje de programación moderno, expresivo y completamente en español.<br/>
|
|
11
|
+
Diseñado para eliminar las barreras del idioma en la educación tecnológica.
|
|
12
|
+
</p>
|
|
13
|
+
|
|
14
|
+
<p align="center">
|
|
15
|
+
<a href="https://www.npmjs.com/package/hispano-lang"><img src="https://img.shields.io/npm/v/hispano-lang?style=for-the-badge&logo=npm&logoColor=white&color=cb3837" alt="npm version"/></a>
|
|
16
|
+
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="License: MIT"/></a>
|
|
17
|
+
<a href="https://nodejs.org/"><img src="https://img.shields.io/node/v/hispano-lang?style=for-the-badge&logo=node.js&logoColor=white&color=339933" alt="Node.js Version"/></a>
|
|
18
|
+
<a href="https://www.npmjs.com/package/hispano-lang"><img src="https://img.shields.io/npm/dm/hispano-lang?style=for-the-badge&color=blue" alt="Downloads"/></a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
<p align="center">
|
|
22
|
+
<a href="#inicio-rápido">Inicio Rápido</a> •
|
|
23
|
+
<a href="#instalación">Instalación</a> •
|
|
24
|
+
<a href="#referencia-del-lenguaje">Documentación</a> •
|
|
25
|
+
<a href="#ejemplos">Ejemplos</a> •
|
|
26
|
+
<a href="#contribuir">Contribuir</a>
|
|
27
|
+
</p>
|
|
2
28
|
|
|
3
|
-
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Tabla de Contenidos
|
|
32
|
+
|
|
33
|
+
- [Acerca de HispanoLang](#acerca-de-hispanolang)
|
|
34
|
+
- [Inicio Rápido](#inicio-rápido)
|
|
35
|
+
- [Instalación](#instalación)
|
|
36
|
+
- [Referencia del Lenguaje](#referencia-del-lenguaje)
|
|
37
|
+
- [Variables y Constantes](#variables-y-constantes)
|
|
38
|
+
- [Tipos de Datos](#tipos-de-datos)
|
|
39
|
+
- [Operadores](#operadores)
|
|
40
|
+
- [Estructuras de Control](#estructuras-de-control)
|
|
41
|
+
- [Funciones](#funciones)
|
|
42
|
+
- [Programación Orientada a Objetos](#programación-orientada-a-objetos)
|
|
43
|
+
- [Colecciones](#colecciones)
|
|
44
|
+
- [Manejo de Errores](#manejo-de-errores)
|
|
45
|
+
- [Ejemplos](#ejemplos)
|
|
46
|
+
- [API de Node.js](#api-de-nodejs)
|
|
47
|
+
- [Arquitectura](#arquitectura)
|
|
48
|
+
- [Contribuir](#contribuir)
|
|
49
|
+
- [Licencia](#licencia)
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## Acerca de HispanoLang
|
|
54
|
+
|
|
55
|
+
HispanoLang es un lenguaje de programación interpretado con sintaxis completamente en español. Fue diseñado con un objetivo claro: **democratizar el acceso a la programación** para los más de 500 millones de hispanohablantes en el mundo.
|
|
56
|
+
|
|
57
|
+
### ¿Por qué HispanoLang?
|
|
4
58
|
|
|
5
|
-
|
|
59
|
+
La mayoría de los lenguajes de programación utilizan palabras clave en inglés, creando una barrera adicional para quienes están aprendiendo a programar. HispanoLang elimina esta barrera, permitiendo que los estudiantes se concentren en los **conceptos fundamentales** de la programación sin tener que lidiar simultáneamente con un idioma extranjero.
|
|
6
60
|
|
|
7
|
-
|
|
8
|
-
[](https://opensource.org/licenses/MIT)
|
|
9
|
-
[](https://nodejs.org/)
|
|
10
|
-
[](https://www.npmjs.com/package/hispano-lang)
|
|
61
|
+
### Características
|
|
11
62
|
|
|
12
|
-
|
|
63
|
+
| Característica | Descripción |
|
|
64
|
+
| ------------------------------ | ---------------------------------------------------------------------- |
|
|
65
|
+
| **Sintaxis en Español** | Palabras clave intuitivas como `variable`, `funcion`, `si`, `mientras` |
|
|
66
|
+
| **Tipado Dinámico** | Sistema de tipos flexible con conversiones automáticas |
|
|
67
|
+
| **POO Completa** | Clases, herencia, constructores y métodos |
|
|
68
|
+
| **Funciones de Primera Clase** | Funciones como valores, closures y callbacks |
|
|
69
|
+
| **Colecciones Ricas** | Arrays y objetos con métodos funcionales integrados |
|
|
70
|
+
| **REPL Interactivo** | Experimenta con código en tiempo real |
|
|
71
|
+
| **Integración Node.js** | Usa HispanoLang como módulo en proyectos JavaScript |
|
|
72
|
+
| **TypeScript Ready** | Definiciones de tipos incluidas |
|
|
13
73
|
|
|
14
|
-
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Inicio Rápido
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Instalar globalmente
|
|
80
|
+
npm install -g hispano-lang
|
|
81
|
+
|
|
82
|
+
# Iniciar el REPL interactivo
|
|
83
|
+
hispano
|
|
15
84
|
|
|
16
|
-
|
|
85
|
+
# O ejecutar un archivo
|
|
86
|
+
hispano mi_programa.hl
|
|
87
|
+
```
|
|
17
88
|
|
|
18
|
-
|
|
89
|
+
Tu primer programa en HispanoLang:
|
|
19
90
|
|
|
20
|
-
|
|
91
|
+
```
|
|
92
|
+
variable mensaje = "¡Hola, mundo!"
|
|
93
|
+
mostrar mensaje
|
|
94
|
+
```
|
|
21
95
|
|
|
22
|
-
|
|
23
|
-
- ⚡ **Intérprete completo** - Implementado en JavaScript/Node.js
|
|
24
|
-
- 🎓 **Minimalista** - Pensado para aprender lógica sin distracciones
|
|
25
|
-
- 📚 **Educativo** - Enfoque en conceptos fundamentales
|
|
26
|
-
- 🔧 **CLI Tool** - Interfaz de línea de comandos intuitiva
|
|
27
|
-
- 🧪 **Suite de tests** - 170+ tests para garantizar calidad
|
|
28
|
-
- 📦 **NPM Package** - Fácil instalación y distribución
|
|
29
|
-
- 🔄 **REPL Interactivo** - Modo interactivo para experimentar
|
|
30
|
-
- 📝 **TypeScript Support** - Definiciones de tipos incluidas
|
|
31
|
-
- 🌍 **Open Source** - Libre para usar, modificar y contribuir
|
|
96
|
+
---
|
|
32
97
|
|
|
33
|
-
##
|
|
98
|
+
## Instalación
|
|
34
99
|
|
|
35
|
-
###
|
|
100
|
+
### Requisitos
|
|
36
101
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
102
|
+
- Node.js 20.0.0 o superior
|
|
103
|
+
- npm o yarn
|
|
39
104
|
|
|
40
105
|
### Instalación Global (Recomendada)
|
|
41
106
|
|
|
@@ -43,347 +108,682 @@ La mayoría de los lenguajes de programación utilizan palabras clave en inglés
|
|
|
43
108
|
npm install -g hispano-lang
|
|
44
109
|
```
|
|
45
110
|
|
|
46
|
-
### Instalación
|
|
111
|
+
### Instalación como Dependencia
|
|
47
112
|
|
|
48
113
|
```bash
|
|
49
114
|
npm install hispano-lang
|
|
50
115
|
```
|
|
51
116
|
|
|
52
|
-
###
|
|
117
|
+
### Desde el Código Fuente
|
|
53
118
|
|
|
54
119
|
```bash
|
|
55
120
|
git clone https://github.com/nicvazquezdev/hispano-lang.git
|
|
56
121
|
cd hispano-lang
|
|
57
122
|
npm install
|
|
58
123
|
npm run build
|
|
124
|
+
npm link
|
|
59
125
|
```
|
|
60
126
|
|
|
61
|
-
|
|
127
|
+
### Verificar Instalación
|
|
62
128
|
|
|
63
|
-
|
|
129
|
+
```bash
|
|
130
|
+
hispano --version
|
|
131
|
+
```
|
|
64
132
|
|
|
65
|
-
|
|
133
|
+
---
|
|
66
134
|
|
|
67
|
-
|
|
68
|
-
# Modo interactivo (REPL)
|
|
69
|
-
hispano
|
|
135
|
+
## Referencia del Lenguaje
|
|
70
136
|
|
|
71
|
-
|
|
72
|
-
hispano script.hl
|
|
137
|
+
### Variables y Constantes
|
|
73
138
|
|
|
74
|
-
|
|
75
|
-
hispano -e "mostrar 'Hola mundo'"
|
|
139
|
+
#### Variables
|
|
76
140
|
|
|
77
|
-
|
|
78
|
-
hispano --help
|
|
141
|
+
Las variables se declaran con la palabra clave `variable` y pueden ser reasignadas:
|
|
79
142
|
|
|
80
|
-
# Ejecutar tests
|
|
81
|
-
hispano --test
|
|
82
143
|
```
|
|
144
|
+
variable nombre = "Ana"
|
|
145
|
+
variable edad = 25
|
|
146
|
+
variable activo = verdadero
|
|
83
147
|
|
|
84
|
-
|
|
148
|
+
edad = 26 // Reasignación permitida
|
|
149
|
+
```
|
|
85
150
|
|
|
86
|
-
|
|
87
|
-
const { interpret, run, getVariables } = require('hispano-lang');
|
|
151
|
+
#### Constantes
|
|
88
152
|
|
|
89
|
-
|
|
90
|
-
const result = interpret(`
|
|
91
|
-
variable nombre = "Juan"
|
|
92
|
-
mostrar "Hola " + nombre
|
|
93
|
-
`);
|
|
153
|
+
Las constantes se declaran con `constante` y no pueden ser reasignadas:
|
|
94
154
|
|
|
95
|
-
|
|
155
|
+
```
|
|
156
|
+
constante PI = 3.14159
|
|
157
|
+
constante MAX_INTENTOS = 3
|
|
158
|
+
constante VERSION = "2.0.0"
|
|
96
159
|
|
|
97
|
-
//
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
160
|
+
PI = 3.14 // Error: No se puede reasignar la constante
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
### Tipos de Datos
|
|
166
|
+
|
|
167
|
+
| Tipo | Ejemplo | Descripción |
|
|
168
|
+
| ---------- | -------------------- | ------------------------------ |
|
|
169
|
+
| Número | `42`, `3.14`, `-10` | Enteros y decimales |
|
|
170
|
+
| Texto | `"Hola"`, `'Mundo'` | Cadenas de caracteres |
|
|
171
|
+
| Booleano | `verdadero`, `falso` | Valores lógicos |
|
|
172
|
+
| Arreglo | `[1, 2, 3]` | Colección ordenada |
|
|
173
|
+
| Objeto | `{ clave: valor }` | Colección de pares clave-valor |
|
|
174
|
+
| Nulo | `nulo` | Ausencia intencional de valor |
|
|
175
|
+
| Indefinido | `indefinido` | Variable sin valor asignado |
|
|
176
|
+
| Función | `funcion() {}` | Bloque de código reutilizable |
|
|
177
|
+
| Clase | `clase {}` | Plantilla para crear objetos |
|
|
178
|
+
|
|
179
|
+
#### Conversión de Tipos
|
|
102
180
|
|
|
103
|
-
console.log(outputs); // ['20']
|
|
104
181
|
```
|
|
182
|
+
entero("42") // 42
|
|
183
|
+
entero(3.7) // 3
|
|
105
184
|
|
|
106
|
-
|
|
185
|
+
decimal("3.14") // 3.14
|
|
107
186
|
|
|
108
|
-
|
|
109
|
-
|
|
187
|
+
texto(123) // "123"
|
|
188
|
+
texto(verdadero) // "verdadero"
|
|
110
189
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
190
|
+
booleano(1) // verdadero
|
|
191
|
+
booleano("") // falso
|
|
192
|
+
|
|
193
|
+
tipo(42) // "numero"
|
|
194
|
+
tipo("hola") // "texto"
|
|
195
|
+
tipo([1, 2]) // "arreglo"
|
|
117
196
|
```
|
|
118
197
|
|
|
119
|
-
|
|
198
|
+
---
|
|
120
199
|
|
|
121
|
-
###
|
|
200
|
+
### Operadores
|
|
122
201
|
|
|
123
|
-
|
|
124
|
-
// Saludo personalizado
|
|
125
|
-
variable nombre = "María"
|
|
126
|
-
mostrar "¡Hola " + nombre + "!"
|
|
202
|
+
#### Aritméticos
|
|
127
203
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
204
|
+
| Operador | Descripción | Ejemplo |
|
|
205
|
+
| -------- | -------------- | -------------- |
|
|
206
|
+
| `+` | Suma | `5 + 3` → `8` |
|
|
207
|
+
| `-` | Resta | `5 - 3` → `2` |
|
|
208
|
+
| `*` | Multiplicación | `5 * 3` → `15` |
|
|
209
|
+
| `/` | División | `6 / 2` → `3` |
|
|
210
|
+
| `%` | Módulo | `7 % 3` → `1` |
|
|
133
211
|
|
|
134
|
-
|
|
135
|
-
si suma > 10 {
|
|
136
|
-
mostrar "¡Es un número grande!"
|
|
137
|
-
} sino {
|
|
138
|
-
mostrar "Es un número pequeño"
|
|
139
|
-
}
|
|
140
|
-
```
|
|
212
|
+
#### Comparación
|
|
141
213
|
|
|
142
|
-
|
|
214
|
+
| Operador | Descripción | Ejemplo |
|
|
215
|
+
| -------- | ------------- | ---------------------- |
|
|
216
|
+
| `==` | Igual a | `5 == 5` → `verdadero` |
|
|
217
|
+
| `!=` | Diferente de | `5 != 3` → `verdadero` |
|
|
218
|
+
| `<` | Menor que | `3 < 5` → `verdadero` |
|
|
219
|
+
| `>` | Mayor que | `5 > 3` → `verdadero` |
|
|
220
|
+
| `<=` | Menor o igual | `3 <= 3` → `verdadero` |
|
|
221
|
+
| `>=` | Mayor o igual | `5 >= 5` → `verdadero` |
|
|
143
222
|
|
|
144
|
-
|
|
145
|
-
variable nombre = "Juan"
|
|
146
|
-
variable edad = 25
|
|
147
|
-
variable activo = verdadero
|
|
148
|
-
variable salario = 50000.50
|
|
149
|
-
```
|
|
223
|
+
#### Lógicos
|
|
150
224
|
|
|
151
|
-
|
|
225
|
+
| Operador | Descripción | Ejemplo |
|
|
226
|
+
| -------- | ----------- | --------------------------------- |
|
|
227
|
+
| `y` | AND lógico | `verdadero y falso` → `falso` |
|
|
228
|
+
| `o` | OR lógico | `verdadero o falso` → `verdadero` |
|
|
229
|
+
| `!` | NOT lógico | `!verdadero` → `falso` |
|
|
152
230
|
|
|
153
|
-
|
|
154
|
-
// Entrada básica
|
|
155
|
-
leer nombre
|
|
156
|
-
mostrar "Hola " + nombre
|
|
231
|
+
#### Asignación Compuesta
|
|
157
232
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
233
|
+
```
|
|
234
|
+
variable x = 10
|
|
235
|
+
x += 5 // x = 15
|
|
236
|
+
x -= 3 // x = 12
|
|
237
|
+
x *= 2 // x = 24
|
|
238
|
+
x /= 4 // x = 6
|
|
239
|
+
x %= 4 // x = 2
|
|
161
240
|
```
|
|
162
241
|
|
|
163
|
-
|
|
242
|
+
---
|
|
164
243
|
|
|
165
|
-
|
|
244
|
+
### Estructuras de Control
|
|
245
|
+
|
|
246
|
+
#### Condicional Si/Sino
|
|
247
|
+
|
|
248
|
+
```
|
|
166
249
|
si edad >= 18 {
|
|
167
|
-
|
|
250
|
+
mostrar "Mayor de edad"
|
|
168
251
|
} sino {
|
|
169
|
-
|
|
252
|
+
mostrar "Menor de edad"
|
|
170
253
|
}
|
|
171
254
|
```
|
|
172
255
|
|
|
173
|
-
|
|
256
|
+
#### Elegir/Caso (Switch)
|
|
174
257
|
|
|
175
|
-
```
|
|
176
|
-
|
|
258
|
+
```
|
|
259
|
+
elegir opcion {
|
|
260
|
+
caso 1: mostrar "Opción uno"
|
|
261
|
+
caso 2: mostrar "Opción dos"
|
|
262
|
+
caso 3: {
|
|
263
|
+
mostrar "Opción tres"
|
|
264
|
+
mostrar "Con múltiples líneas"
|
|
265
|
+
}
|
|
266
|
+
pordefecto: mostrar "Opción no válida"
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### Bucle Mientras
|
|
271
|
+
|
|
272
|
+
```
|
|
177
273
|
variable i = 0
|
|
178
274
|
mientras i < 5 {
|
|
179
|
-
|
|
180
|
-
|
|
275
|
+
mostrar i
|
|
276
|
+
i = i + 1
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
#### Bucle Para
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
para (variable i = 0; i < 5; i = i + 1) {
|
|
284
|
+
mostrar i
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
#### Bucle Hacer/Mientras
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
variable x = 0
|
|
292
|
+
hacer {
|
|
293
|
+
mostrar x
|
|
294
|
+
x = x + 1
|
|
295
|
+
} mientras x < 3
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
#### Bucle Para Cada
|
|
299
|
+
|
|
300
|
+
```
|
|
301
|
+
variable frutas = ["manzana", "banana", "naranja"]
|
|
302
|
+
para cada fruta en frutas {
|
|
303
|
+
mostrar fruta
|
|
181
304
|
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
#### Control de Flujo
|
|
182
308
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
309
|
+
```
|
|
310
|
+
mientras verdadero {
|
|
311
|
+
si condicion {
|
|
312
|
+
romper // Sale del bucle
|
|
313
|
+
}
|
|
314
|
+
si otraCondicion {
|
|
315
|
+
continuar // Salta a la siguiente iteración
|
|
316
|
+
}
|
|
186
317
|
}
|
|
187
318
|
```
|
|
188
319
|
|
|
320
|
+
---
|
|
321
|
+
|
|
189
322
|
### Funciones
|
|
190
323
|
|
|
191
|
-
|
|
324
|
+
#### Declaración y Llamada
|
|
325
|
+
|
|
326
|
+
```
|
|
192
327
|
funcion saludar(nombre) {
|
|
193
|
-
|
|
328
|
+
retornar "Hola, " + nombre
|
|
194
329
|
}
|
|
195
330
|
|
|
196
|
-
mostrar saludar("
|
|
331
|
+
mostrar saludar("María") // "Hola, María"
|
|
197
332
|
```
|
|
198
333
|
|
|
199
|
-
|
|
334
|
+
#### Funciones Anónimas
|
|
200
335
|
|
|
201
|
-
```
|
|
202
|
-
variable
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
mostrar frutas.ultimo() // naranja
|
|
336
|
+
```
|
|
337
|
+
variable duplicar = funcion(x) {
|
|
338
|
+
retornar x * 2
|
|
339
|
+
}
|
|
206
340
|
|
|
207
|
-
//
|
|
208
|
-
frutas.agregar("uva") // push
|
|
209
|
-
frutas.remover() // pop
|
|
210
|
-
frutas.contiene("banana") // includes
|
|
341
|
+
mostrar duplicar(5) // 10
|
|
211
342
|
```
|
|
212
343
|
|
|
213
|
-
|
|
344
|
+
#### Funciones como Parámetros
|
|
214
345
|
|
|
215
|
-
```
|
|
346
|
+
```
|
|
347
|
+
funcion aplicar(valor, operacion) {
|
|
348
|
+
retornar operacion(valor)
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
variable resultado = aplicar(5, funcion(x) { retornar x * x })
|
|
352
|
+
mostrar resultado // 25
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
#### Funciones Matemáticas Integradas
|
|
356
|
+
|
|
357
|
+
```
|
|
358
|
+
raiz(16) // 4
|
|
359
|
+
potencia(2, 8) // 256
|
|
360
|
+
absoluto(-5) // 5
|
|
361
|
+
redondear(3.7) // 4
|
|
362
|
+
piso(3.7) // 3
|
|
363
|
+
techo(3.2) // 4
|
|
364
|
+
seno(0) // 0
|
|
365
|
+
coseno(0) // 1
|
|
366
|
+
tangente(0) // 0
|
|
367
|
+
aleatorio() // Número entre 0 y 1
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
### Programación Orientada a Objetos
|
|
373
|
+
|
|
374
|
+
#### Definición de Clases
|
|
375
|
+
|
|
376
|
+
```
|
|
377
|
+
clase Persona {
|
|
378
|
+
constructor(nombre, edad) {
|
|
379
|
+
este.nombre = nombre
|
|
380
|
+
este.edad = edad
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
saludar() {
|
|
384
|
+
retornar "Hola, soy " + este.nombre
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
cumplirAnios() {
|
|
388
|
+
este.edad = este.edad + 1
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
#### Instanciación
|
|
394
|
+
|
|
395
|
+
```
|
|
396
|
+
variable persona = nuevo Persona("Carlos", 30)
|
|
397
|
+
mostrar persona.nombre // "Carlos"
|
|
398
|
+
mostrar persona.saludar() // "Hola, soy Carlos"
|
|
399
|
+
|
|
400
|
+
persona.cumplirAnios()
|
|
401
|
+
mostrar persona.edad // 31
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
#### Herencia
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
clase Empleado extiende Persona {
|
|
408
|
+
constructor(nombre, edad, cargo) {
|
|
409
|
+
super(nombre, edad)
|
|
410
|
+
este.cargo = cargo
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
presentarse() {
|
|
414
|
+
retornar este.saludar() + " y trabajo como " + este.cargo
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
variable emp = nuevo Empleado("Ana", 28, "Ingeniera")
|
|
419
|
+
mostrar emp.presentarse() // "Hola, soy Ana y trabajo como Ingeniera"
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
#### Verificación de Tipo
|
|
423
|
+
|
|
424
|
+
```
|
|
425
|
+
variable p = nuevo Persona("Luis", 25)
|
|
426
|
+
mostrar tipo(p) // "Persona"
|
|
427
|
+
```
|
|
428
|
+
|
|
429
|
+
---
|
|
430
|
+
|
|
431
|
+
### Colecciones
|
|
432
|
+
|
|
433
|
+
#### Arreglos
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
variable numeros = [1, 2, 3, 4, 5]
|
|
437
|
+
|
|
438
|
+
// Acceso y modificación
|
|
439
|
+
mostrar numeros[0] // 1
|
|
440
|
+
numeros[0] = 10
|
|
441
|
+
|
|
442
|
+
// Propiedades y métodos básicos
|
|
443
|
+
numeros.longitud() // 5
|
|
444
|
+
numeros.primero() // 10
|
|
445
|
+
numeros.ultimo() // 5
|
|
446
|
+
numeros.agregar(6) // Añade al final
|
|
447
|
+
numeros.remover() // Remueve del final
|
|
448
|
+
numeros.contiene(3) // verdadero
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
#### Métodos Funcionales
|
|
452
|
+
|
|
453
|
+
```
|
|
454
|
+
variable nums = [1, 2, 3, 4, 5]
|
|
455
|
+
|
|
456
|
+
// Transformación
|
|
457
|
+
nums.mapear(funcion(x) { retornar x * 2 })
|
|
458
|
+
// [2, 4, 6, 8, 10]
|
|
459
|
+
|
|
460
|
+
// Filtrado
|
|
461
|
+
nums.filtrar(funcion(x) { retornar x > 2 })
|
|
462
|
+
// [3, 4, 5]
|
|
463
|
+
|
|
464
|
+
// Reducción
|
|
465
|
+
nums.reducir(funcion(acc, x) { retornar acc + x }, 0)
|
|
466
|
+
// 15
|
|
467
|
+
|
|
468
|
+
// Búsqueda
|
|
469
|
+
nums.buscar(funcion(x) { retornar x > 3 })
|
|
470
|
+
// 4
|
|
471
|
+
|
|
472
|
+
// Verificación
|
|
473
|
+
nums.algunos(funcion(x) { retornar x > 4 }) // verdadero
|
|
474
|
+
nums.todos(funcion(x) { retornar x > 0 }) // verdadero
|
|
475
|
+
|
|
476
|
+
// Ordenamiento
|
|
477
|
+
nums.ordenar() // [1, 2, 3, 4, 5]
|
|
478
|
+
nums.invertir() // [5, 4, 3, 2, 1]
|
|
479
|
+
|
|
480
|
+
// Manipulación
|
|
481
|
+
nums.cortar(1, 3) // [2, 3]
|
|
482
|
+
nums.insertar(2, 99) // Inserta 99 en posición 2
|
|
483
|
+
nums.unir(", ") // "1, 2, 3, 4, 5"
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### Iteración
|
|
487
|
+
|
|
488
|
+
```
|
|
489
|
+
variable colores = ["rojo", "verde", "azul"]
|
|
490
|
+
colores.recorrer(funcion() {
|
|
491
|
+
mostrar "Color: " + elemento + " en índice " + indice
|
|
492
|
+
})
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
#### Objetos
|
|
496
|
+
|
|
497
|
+
```
|
|
216
498
|
variable persona = {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
499
|
+
nombre: "Elena",
|
|
500
|
+
edad: 32,
|
|
501
|
+
ciudad: "Madrid"
|
|
220
502
|
}
|
|
221
503
|
|
|
222
|
-
mostrar persona.nombre //
|
|
223
|
-
persona.edad =
|
|
504
|
+
mostrar persona.nombre // "Elena"
|
|
505
|
+
persona.edad = 33 // Modificar
|
|
506
|
+
persona.profesion = "Dev" // Añadir propiedad
|
|
224
507
|
```
|
|
225
508
|
|
|
226
|
-
|
|
509
|
+
#### Cadenas de Texto
|
|
227
510
|
|
|
228
|
-
```javascript
|
|
229
|
-
variable texto = "hola mundo"
|
|
230
|
-
mostrar texto.longitud() // 10
|
|
231
|
-
mostrar texto.mayusculas() // HOLA MUNDO
|
|
232
|
-
mostrar texto.minusculas() // hola mundo
|
|
233
511
|
```
|
|
512
|
+
variable texto = "Hola Mundo"
|
|
234
513
|
|
|
235
|
-
|
|
514
|
+
// Propiedades
|
|
515
|
+
texto.longitud() // 10
|
|
236
516
|
|
|
237
|
-
|
|
517
|
+
// Transformación
|
|
518
|
+
texto.mayusculas() // "HOLA MUNDO"
|
|
519
|
+
texto.minusculas() // "hola mundo"
|
|
520
|
+
texto.recortar() // Elimina espacios extremos
|
|
521
|
+
texto.invertir() // "odnuM aloH"
|
|
522
|
+
|
|
523
|
+
// Búsqueda
|
|
524
|
+
texto.incluye("Mundo") // verdadero
|
|
525
|
+
texto.empiezaCon("Hola") // verdadero
|
|
526
|
+
texto.terminaCon("Mundo") // verdadero
|
|
527
|
+
|
|
528
|
+
// Extracción
|
|
529
|
+
texto.caracter(0) // "H"
|
|
530
|
+
texto.subcadena(0, 4) // "Hola"
|
|
531
|
+
|
|
532
|
+
// Manipulación
|
|
533
|
+
texto.dividir(" ") // ["Hola", "Mundo"]
|
|
534
|
+
texto.reemplazar("Mundo", "Amigo") // "Hola Amigo"
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
#### Interpolación de Cadenas
|
|
538
|
+
|
|
539
|
+
```
|
|
540
|
+
variable nombre = "María"
|
|
541
|
+
variable edad = 25
|
|
542
|
+
|
|
543
|
+
mostrar `Hola ${nombre}, tienes ${edad} años`
|
|
544
|
+
// "Hola María, tienes 25 años"
|
|
545
|
+
|
|
546
|
+
mostrar `El doble de tu edad es ${edad * 2}`
|
|
547
|
+
// "El doble de tu edad es 50"
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
#### Métodos Numéricos
|
|
551
|
+
|
|
552
|
+
```
|
|
553
|
+
variable n = 42
|
|
554
|
+
|
|
555
|
+
n.esPar() // verdadero
|
|
556
|
+
n.esImpar() // falso
|
|
557
|
+
n.esPositivo() // verdadero
|
|
558
|
+
n.esNegativo() // falso
|
|
559
|
+
n.aTexto() // "42"
|
|
560
|
+
```
|
|
561
|
+
|
|
562
|
+
---
|
|
563
|
+
|
|
564
|
+
### Manejo de Errores
|
|
565
|
+
|
|
566
|
+
```
|
|
238
567
|
intentar {
|
|
239
|
-
|
|
568
|
+
variable resultado = operacionRiesgosa()
|
|
569
|
+
mostrar resultado
|
|
240
570
|
} capturar (error) {
|
|
241
|
-
|
|
571
|
+
mostrar "Ocurrió un error: " + error
|
|
242
572
|
}
|
|
243
573
|
```
|
|
244
574
|
|
|
245
|
-
|
|
575
|
+
---
|
|
246
576
|
|
|
247
|
-
|
|
248
|
-
variable valorNulo = nulo
|
|
249
|
-
variable valorIndefinido = indefinido
|
|
250
|
-
```
|
|
577
|
+
## Ejemplos
|
|
251
578
|
|
|
252
|
-
|
|
579
|
+
### Calculadora Simple
|
|
253
580
|
|
|
254
|
-
|
|
581
|
+
```
|
|
582
|
+
funcion calculadora(a, b, operacion) {
|
|
583
|
+
elegir operacion {
|
|
584
|
+
caso "+": retornar a + b
|
|
585
|
+
caso "-": retornar a - b
|
|
586
|
+
caso "*": retornar a * b
|
|
587
|
+
caso "/": {
|
|
588
|
+
si b == 0 {
|
|
589
|
+
retornar "Error: División por cero"
|
|
590
|
+
}
|
|
591
|
+
retornar a / b
|
|
592
|
+
}
|
|
593
|
+
pordefecto: retornar "Operación no válida"
|
|
594
|
+
}
|
|
595
|
+
}
|
|
255
596
|
|
|
256
|
-
|
|
257
|
-
|
|
597
|
+
mostrar calculadora(10, 5, "+") // 15
|
|
598
|
+
mostrar calculadora(10, 5, "*") // 50
|
|
258
599
|
```
|
|
259
600
|
|
|
260
|
-
|
|
601
|
+
### Fibonacci
|
|
602
|
+
|
|
603
|
+
```
|
|
604
|
+
funcion fibonacci(n) {
|
|
605
|
+
si n <= 1 {
|
|
606
|
+
retornar n
|
|
607
|
+
}
|
|
608
|
+
retornar fibonacci(n - 1) + fibonacci(n - 2)
|
|
609
|
+
}
|
|
261
610
|
|
|
611
|
+
para (variable i = 0; i < 10; i = i + 1) {
|
|
612
|
+
mostrar fibonacci(i)
|
|
613
|
+
}
|
|
262
614
|
```
|
|
263
|
-
src/
|
|
264
|
-
├── tokenizer.js # Análisis léxico
|
|
265
|
-
├── parser.js # Análisis sintáctico
|
|
266
|
-
├── evaluator.js # Evaluación de expresiones
|
|
267
|
-
└── interpreter.js # Orquestador principal
|
|
268
615
|
|
|
269
|
-
|
|
270
|
-
└── hispano.js # CLI tool
|
|
616
|
+
### Sistema de Gestión
|
|
271
617
|
|
|
272
|
-
test/
|
|
273
|
-
└── test.js # Suite completa de tests (170+ casos)
|
|
274
618
|
```
|
|
619
|
+
clase Producto {
|
|
620
|
+
constructor(nombre, precio) {
|
|
621
|
+
este.nombre = nombre
|
|
622
|
+
este.precio = precio
|
|
623
|
+
}
|
|
624
|
+
}
|
|
275
625
|
|
|
276
|
-
|
|
626
|
+
clase Carrito {
|
|
627
|
+
constructor() {
|
|
628
|
+
este.productos = []
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
agregar(producto) {
|
|
632
|
+
este.productos.agregar(producto)
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
total() {
|
|
636
|
+
retornar este.productos.reducir(
|
|
637
|
+
funcion(acc, p) { retornar acc + p.precio },
|
|
638
|
+
0
|
|
639
|
+
)
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
mostrarResumen() {
|
|
643
|
+
mostrar "=== Carrito de Compras ==="
|
|
644
|
+
para cada producto en este.productos {
|
|
645
|
+
mostrar `${producto.nombre}: $${producto.precio}`
|
|
646
|
+
}
|
|
647
|
+
mostrar `Total: $${este.total()}`
|
|
648
|
+
}
|
|
649
|
+
}
|
|
277
650
|
|
|
278
|
-
|
|
651
|
+
variable carrito = nuevo Carrito()
|
|
652
|
+
carrito.agregar(nuevo Producto("Laptop", 999))
|
|
653
|
+
carrito.agregar(nuevo Producto("Mouse", 29))
|
|
654
|
+
carrito.agregar(nuevo Producto("Teclado", 79))
|
|
655
|
+
carrito.mostrarResumen()
|
|
656
|
+
```
|
|
279
657
|
|
|
280
|
-
|
|
281
|
-
# Clonar el repositorio
|
|
282
|
-
git clone https://github.com/nicvazquezdev/hispano-lang.git
|
|
283
|
-
cd hispano-lang
|
|
658
|
+
---
|
|
284
659
|
|
|
285
|
-
|
|
286
|
-
npm install
|
|
660
|
+
## API de Node.js
|
|
287
661
|
|
|
288
|
-
|
|
289
|
-
npm run dev
|
|
662
|
+
### Uso como Módulo
|
|
290
663
|
|
|
291
|
-
|
|
292
|
-
|
|
664
|
+
```javascript
|
|
665
|
+
const { interpret, run } = require("hispano-lang");
|
|
293
666
|
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
667
|
+
// Interpretar código y obtener resultado completo
|
|
668
|
+
const result = interpret(`
|
|
669
|
+
variable x = 10
|
|
670
|
+
mostrar x * 2
|
|
671
|
+
`);
|
|
297
672
|
|
|
298
|
-
|
|
299
|
-
|
|
673
|
+
console.log(result.success); // true
|
|
674
|
+
console.log(result.output); // ['20']
|
|
675
|
+
console.log(result.error); // null
|
|
676
|
+
|
|
677
|
+
// Ejecutar y obtener solo la salida
|
|
678
|
+
const output = run(`mostrar "Hola desde Node.js"`);
|
|
679
|
+
console.log(output); // ['Hola desde Node.js']
|
|
300
680
|
```
|
|
301
681
|
|
|
302
|
-
###
|
|
682
|
+
### TypeScript
|
|
303
683
|
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
- `npm run dev` - Modo desarrollo con nodemon
|
|
307
|
-
- `npm run lint` - Verificar código con ESLint
|
|
308
|
-
- `npm run format` - Formatear código con Prettier
|
|
309
|
-
- `npm run build` - Construir para producción
|
|
310
|
-
- `npm run demo` - Ejecutar demo
|
|
684
|
+
```typescript
|
|
685
|
+
import { interpret, InterpretationResult } from "hispano-lang";
|
|
311
686
|
|
|
312
|
-
|
|
687
|
+
const result: InterpretationResult = interpret(`
|
|
688
|
+
variable mensaje = "TypeScript + HispanoLang"
|
|
689
|
+
mostrar mensaje
|
|
690
|
+
`);
|
|
691
|
+
```
|
|
313
692
|
|
|
314
|
-
|
|
693
|
+
---
|
|
315
694
|
|
|
316
|
-
|
|
695
|
+
## Arquitectura
|
|
317
696
|
|
|
318
|
-
|
|
319
|
-
2. **Crea** una rama para tu feature (`git checkout -b feature/AmazingFeature`)
|
|
320
|
-
3. **Commit** tus cambios (`git commit -m 'Add some AmazingFeature'`)
|
|
321
|
-
4. **Push** a la rama (`git push origin feature/AmazingFeature`)
|
|
322
|
-
5. **Abre** un Pull Request
|
|
697
|
+
HispanoLang utiliza una arquitectura de intérprete clásica con tres fases:
|
|
323
698
|
|
|
324
|
-
|
|
699
|
+
```
|
|
700
|
+
┌─────────────┐ ┌────────────┐ ┌─────────────┐
|
|
701
|
+
│ Tokenizer │ ──▶ │ Parser │ ──▶ │ Evaluator │
|
|
702
|
+
│ (Léxico) │ │ (Sintaxis) │ │ (Ejecución) │
|
|
703
|
+
└─────────────┘ └────────────┘ └─────────────┘
|
|
704
|
+
│ │ │
|
|
705
|
+
▼ ▼ ▼
|
|
706
|
+
Tokens AST Resultado
|
|
707
|
+
```
|
|
325
708
|
|
|
326
|
-
|
|
327
|
-
- ✅ Añade tests para nuevas funcionalidades
|
|
328
|
-
- ✅ Actualiza la documentación si es necesario
|
|
329
|
-
- ✅ Asegúrate de que todos los tests pasen
|
|
330
|
-
- ✅ Usa `npm run lint` y `npm run format` antes de commitear
|
|
709
|
+
### Estructura del Proyecto
|
|
331
710
|
|
|
332
|
-
|
|
711
|
+
```
|
|
712
|
+
hispano-lang/
|
|
713
|
+
├── src/
|
|
714
|
+
│ ├── tokenizer.js # Análisis léxico
|
|
715
|
+
│ ├── parser.js # Análisis sintáctico → AST
|
|
716
|
+
│ ├── evaluator.js # Evaluación del AST
|
|
717
|
+
│ └── interpreter.js # Orquestador principal
|
|
718
|
+
├── bin/
|
|
719
|
+
│ └── hispano.js # CLI
|
|
720
|
+
├── test/
|
|
721
|
+
│ └── test.js # Suite de tests (310+)
|
|
722
|
+
└── dist/ # Build de producción
|
|
723
|
+
```
|
|
333
724
|
|
|
334
|
-
|
|
335
|
-
- ✨ **Nuevas funcionalidades** - Propón mejoras
|
|
336
|
-
- 📚 **Documentación** - Mejora ejemplos y guías
|
|
337
|
-
- 🧪 **Tests** - Añade casos de prueba
|
|
338
|
-
- 🌍 **Traducciones** - Ayuda con documentación en otros idiomas
|
|
339
|
-
- 🎨 **UI/UX** - Mejora la experiencia del CLI
|
|
725
|
+
---
|
|
340
726
|
|
|
341
|
-
##
|
|
727
|
+
## Contribuir
|
|
342
728
|
|
|
343
|
-
|
|
729
|
+
Las contribuciones son bienvenidas. Por favor, lee las siguientes guías antes de contribuir.
|
|
344
730
|
|
|
345
|
-
|
|
346
|
-
2. **Crea** un nuevo issue con:
|
|
347
|
-
- Descripción clara del problema
|
|
348
|
-
- Código que reproduce el error
|
|
349
|
-
- Versión de Node.js
|
|
350
|
-
- Sistema operativo
|
|
351
|
-
- Pasos para reproducir
|
|
731
|
+
### Configuración del Entorno
|
|
352
732
|
|
|
353
|
-
|
|
733
|
+
```bash
|
|
734
|
+
git clone https://github.com/nicvazquezdev/hispano-lang.git
|
|
735
|
+
cd hispano-lang
|
|
736
|
+
npm install
|
|
737
|
+
npm test
|
|
738
|
+
```
|
|
354
739
|
|
|
355
|
-
|
|
740
|
+
### Flujo de Trabajo
|
|
356
741
|
|
|
357
|
-
|
|
742
|
+
1. Fork del repositorio
|
|
743
|
+
2. Crear rama feature: `git checkout -b feature/nueva-funcionalidad`
|
|
744
|
+
3. Commit de cambios: `git commit -m 'Añadir nueva funcionalidad'`
|
|
745
|
+
4. Push a la rama: `git push origin feature/nueva-funcionalidad`
|
|
746
|
+
5. Crear Pull Request
|
|
358
747
|
|
|
359
|
-
|
|
748
|
+
### Estándares de Código
|
|
360
749
|
|
|
361
|
-
-
|
|
362
|
-
-
|
|
750
|
+
- Ejecutar `npm run lint` antes de commit
|
|
751
|
+
- Ejecutar `npm run format` para formatear código
|
|
752
|
+
- Añadir tests para nuevas funcionalidades
|
|
753
|
+
- Mantener cobertura de tests existente
|
|
363
754
|
|
|
364
|
-
|
|
755
|
+
### Reportar Bugs
|
|
365
756
|
|
|
366
|
-
|
|
367
|
-
- 🧪 **Contribuidores y testers del proyecto**
|
|
368
|
-
- 📚 **Educadores que usan HispanoLang en sus clases**
|
|
369
|
-
- 🎓 **Estudiantes que aprenden programación con HispanoLang**
|
|
757
|
+
Abre un [issue](https://github.com/nicvazquezdev/hispano-lang/issues) incluyendo:
|
|
370
758
|
|
|
371
|
-
|
|
759
|
+
- Descripción del problema
|
|
760
|
+
- Código para reproducir
|
|
761
|
+
- Comportamiento esperado vs actual
|
|
762
|
+
- Versión de Node.js y sistema operativo
|
|
372
763
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
764
|
+
---
|
|
765
|
+
|
|
766
|
+
## Licencia
|
|
767
|
+
|
|
768
|
+
Distribuido bajo la Licencia MIT. Ver [LICENSE](LICENSE) para más información.
|
|
378
769
|
|
|
379
770
|
---
|
|
380
771
|
|
|
381
|
-
|
|
772
|
+
## Autor
|
|
382
773
|
|
|
383
|
-
|
|
774
|
+
**Nicolas Vazquez**
|
|
775
|
+
|
|
776
|
+
- GitHub: [@nicvazquezdev](https://github.com/nicvazquezdev)
|
|
777
|
+
- Email: nicorvazquezs@gmail.com
|
|
384
778
|
|
|
385
|
-
|
|
779
|
+
---
|
|
386
780
|
|
|
387
|
-
|
|
781
|
+
<p align="center">
|
|
782
|
+
<sub>Hecho con dedicación para la comunidad hispanohablante</sub>
|
|
783
|
+
</p>
|
|
388
784
|
|
|
389
|
-
|
|
785
|
+
<p align="center">
|
|
786
|
+
<a href="https://github.com/nicvazquezdev/hispano-lang">
|
|
787
|
+
<img src="https://img.shields.io/github/stars/nicvazquezdev/hispano-lang?style=social" alt="GitHub Stars"/>
|
|
788
|
+
</a>
|
|
789
|
+
</p>
|