vladx 1.3.2 → 1.5.1
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/bin/vladx +4 -1
- package/examples/stdlib/ambiente.vx +8 -0
- package/examples/stdlib/archivio_extra.vx +11 -0
- package/examples/stdlib/asserzione.vx +11 -0
- package/examples/stdlib/client_web.vx +7 -0
- package/examples/stdlib/codifica.vx +8 -0
- package/examples/stdlib/collezioni.vx +11 -0
- package/examples/stdlib/compressione.vx +10 -0
- package/examples/stdlib/console.vx +14 -0
- package/examples/stdlib/cripto.vx +8 -0
- package/examples/stdlib/dati.vx +21 -0
- package/examples/stdlib/eventi.vx +10 -0
- package/examples/stdlib/json_extra.vx +7 -0
- package/examples/stdlib/matematica.vx +9 -0
- package/examples/stdlib/percorso.vx +9 -0
- package/examples/stdlib/processo.vx +9 -0
- package/examples/stdlib/server_web.vx +10 -0
- package/examples/stdlib/sql_helper.vx +7 -0
- package/examples/stdlib/tempo.vx +9 -0
- package/examples/stdlib/testo.vx +10 -0
- package/examples/stdlib/url.vx +11 -0
- package/examples/stdlib/validazione.vx +5 -0
- package/package.json +6 -2
- package/programs/1/index.vx +16 -4
- package/programs/main/index.vx +11 -8
- package/programs/main/passports/Alina.json +1 -0
- package/programs/main/passports/Tanya.json +1 -0
- package/programs/main/passports/vlad.json +1 -0
- package/programs/main/test_async.vx +25 -0
- package/programs/main/test_async_advanced.vx +35 -0
- package/programs/main/test_backend.vx +33 -0
- package/programs/tests/test_new_features.vx +53 -0
- package/programs/tests/test_stdlib.vx +26 -0
- package/programs/tests/test_templates.vx +8 -0
- package/src/cli/cli.js +8 -6
- package/src/interpreter/interpreter.js +388 -170
- package/src/lexer/lexer.js +5 -1
- package/src/lexer/tokens.js +9 -1
- package/src/parser/ast.js +59 -4
- package/src/parser/parser.js +152 -18
- package/src/repl/repl.js +5 -5
- package/src/stdlib/registry.js +301 -0
- /package/programs/main/passports/{Vlad.txt → Vlad.json} +0 -0
package/bin/vladx
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
importa { elencaTutto } da "@std/ArchivioExtra";
|
|
2
|
+
|
|
3
|
+
stampa("Analisi completa cartella 'src':");
|
|
4
|
+
variabile fileSrc = elencaTutto("src");
|
|
5
|
+
|
|
6
|
+
// Mostro solo i primi 5 per brevità
|
|
7
|
+
variabile i = 0;
|
|
8
|
+
per (variabile f di fileSrc) {
|
|
9
|
+
se (i < 5) stampa("- " + f);
|
|
10
|
+
i++;
|
|
11
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
importa { CreaMappa, CreaInsieme, chiavi, valori } da "@std/Collezioni";
|
|
2
|
+
|
|
3
|
+
stampa("--- MAPPA ---");
|
|
4
|
+
variabile m = CreaMappa();
|
|
5
|
+
m.set("chiave", "valore");
|
|
6
|
+
stampa("Contenuto mappa: " + m.get("chiave"));
|
|
7
|
+
|
|
8
|
+
stampa("\n--- OGGETTI ---");
|
|
9
|
+
variabile obj = { nome: "Vlad", versione: 1.4 };
|
|
10
|
+
stampa("Chiavi: " + chiavi(obj));
|
|
11
|
+
stampa("Valori: " + valori(obj));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
importa { comprimi, decomprimi } da "@std/Compressione";
|
|
2
|
+
|
|
3
|
+
variabile segreto = "Questo è un messaggio molto lungo che vogliamo comprimere.";
|
|
4
|
+
stampa("Originale (" + lunghezza(segreto) + " byte): " + segreto);
|
|
5
|
+
|
|
6
|
+
variabile compresso = comprimi(segreto);
|
|
7
|
+
stampa("Compresso (Base64): " + compresso);
|
|
8
|
+
|
|
9
|
+
variabile decompresso = decomprimi(compresso);
|
|
10
|
+
stampa("Decompresso: " + decompresso);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
importa { log, errore, avviso, successo, tabella } da "@std/Console";
|
|
2
|
+
|
|
3
|
+
log("Semplice log di sistema");
|
|
4
|
+
successo("Operazione completata con successo!");
|
|
5
|
+
avviso("Attenzione: valore instabile.");
|
|
6
|
+
errore("Errore critico rilevato!");
|
|
7
|
+
|
|
8
|
+
variabile dati = [
|
|
9
|
+
{ id: 1, nome: "Vlad" },
|
|
10
|
+
{ id: 2, nome: "Rex" }
|
|
11
|
+
];
|
|
12
|
+
|
|
13
|
+
stampa("\nVisualizzazione tabella:");
|
|
14
|
+
tabella(dati);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
importa { sha256, md5, uuid, casuale } da "@std/Cripto";
|
|
2
|
+
|
|
3
|
+
stampa("Generazione UUID: " + uuid());
|
|
4
|
+
stampa("Token casuale (Hex): " + casuale(32));
|
|
5
|
+
|
|
6
|
+
variabile password = "vlad_password_sicura";
|
|
7
|
+
stampa("SHA256: " + sha256(password));
|
|
8
|
+
stampa("MD5: " + md5(password));
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
importa { clona, fondi, raggruppa } da "@std/Dati";
|
|
2
|
+
|
|
3
|
+
stampa("--- CLONE ---");
|
|
4
|
+
variabile a = { x: 1 };
|
|
5
|
+
variabile b = clona(a);
|
|
6
|
+
b.x = 2;
|
|
7
|
+
stampa("a.x (dovrebbe essere 1): " + a.x);
|
|
8
|
+
|
|
9
|
+
stampa("\n--- MERGE ---");
|
|
10
|
+
variabile base = { nome: "Vlad" };
|
|
11
|
+
variabile extra = { eta: 25 };
|
|
12
|
+
fondi(base, extra);
|
|
13
|
+
stampa(base);
|
|
14
|
+
|
|
15
|
+
stampa("\n--- GROUP BY ---");
|
|
16
|
+
variabile persone = [
|
|
17
|
+
{ nome: "Luca", citta: "Roma" },
|
|
18
|
+
{ nome: "Sara", citta: "Milano" },
|
|
19
|
+
{ nome: "Marco", citta: "Roma" }
|
|
20
|
+
];
|
|
21
|
+
stampa(raggruppa(persone, "citta"));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
importa { piGreco, radice, casuale, rotonda, max } da "@std/Matematica";
|
|
2
|
+
|
|
3
|
+
stampa("Valore di PI: " + piGreco);
|
|
4
|
+
stampa("Radice di 144: " + radice(144));
|
|
5
|
+
stampa("Arrotonda 4.7: " + rotonda(4.7));
|
|
6
|
+
stampa("Massimo tra 10, 50, 20: " + max(10, 50, 20));
|
|
7
|
+
|
|
8
|
+
variabile n = casuale() * 10;
|
|
9
|
+
stampa("Numero casuale 0-10: " + rotonda(n));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
importa { unisci, base, cartella, estensione, assoluto } da "@std/Percorso";
|
|
2
|
+
|
|
3
|
+
variabile mioFile = "/home/utente/progetti/test.vx";
|
|
4
|
+
|
|
5
|
+
stampa("File: " + mioFile);
|
|
6
|
+
stampa("Base: " + base(mioFile));
|
|
7
|
+
stampa("Cartella: " + cartella(mioFile));
|
|
8
|
+
stampa("Estensione: " + estensione(mioFile));
|
|
9
|
+
stampa("Percorso assoluto di 'src': " + assoluto("src"));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
importa { id, memoria, piattaforma, versioneNode } da "@std/Processo";
|
|
2
|
+
|
|
3
|
+
stampa("--- INFO PROCESSO ---");
|
|
4
|
+
stampa("ID: " + id);
|
|
5
|
+
stampa("Piattaforma: " + piattaforma);
|
|
6
|
+
stampa("Node Version: " + versioneNode);
|
|
7
|
+
|
|
8
|
+
stampa("\nUso memoria:");
|
|
9
|
+
stampa(memoria());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
importa { rispondiJson, errore } da "@std/ServerWeb";
|
|
2
|
+
|
|
3
|
+
// Esempio d'uso teorico con Rete.server (vedi documentazione)
|
|
4
|
+
// gestore = (richiesta) => {
|
|
5
|
+
// ritorna rispondiJson({ stato: "ok", msg: "Ciao da VladX" });
|
|
6
|
+
// };
|
|
7
|
+
|
|
8
|
+
variabile resp = rispondiJson({ id: 1 });
|
|
9
|
+
stampa("Esempio risposta JSON:");
|
|
10
|
+
stampa(resp);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
importa { maiuscolo, minuscolo, capitalizza, slugify, pulisci } da "@std/Testo";
|
|
2
|
+
|
|
3
|
+
variabile testo = " vladx è fantastico ";
|
|
4
|
+
|
|
5
|
+
stampa("Originale: '" + testo + "'");
|
|
6
|
+
stampa("Pulisci: '" + pulisci(testo) + "'");
|
|
7
|
+
stampa("Maiuscolo: " + maiuscolo(testo));
|
|
8
|
+
stampa("Minuscolo: " + minuscolo(testo));
|
|
9
|
+
stampa("Capitalizza: " + capitalizza("vlad"));
|
|
10
|
+
stampa("Slugify: " + slugify("Benvenuti su VladX 2.0!"));
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
importa { analizza, componi } da "@std/Url";
|
|
2
|
+
|
|
3
|
+
variabile link = "https://vladx.org/search?q=syntax&lang=it#top";
|
|
4
|
+
variabile info = analizza(link);
|
|
5
|
+
|
|
6
|
+
stampa("Host: " + info.host);
|
|
7
|
+
stampa("Protocollo: " + info.protocollo);
|
|
8
|
+
stampa("Query: " + info.query.q);
|
|
9
|
+
|
|
10
|
+
variabile nuovoLink = componi("https://api.test.com", { chiave: "123", utente: "vlad" });
|
|
11
|
+
stampa("Nuovo URL: " + nuovoLink);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vladx",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "VladX - Linguaggio di programmazione con sintassi italiana",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -19,5 +19,9 @@
|
|
|
19
19
|
"interpreter"
|
|
20
20
|
],
|
|
21
21
|
"author": "VladX Team",
|
|
22
|
-
"license": "MIT"
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"better-sqlite3": "^12.6.2",
|
|
25
|
+
"mysql2": "^3.16.2"
|
|
26
|
+
}
|
|
23
27
|
}
|
package/programs/1/index.vx
CHANGED
|
@@ -1,4 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
classe Persona {
|
|
2
|
+
funzione costruttore(nome, eta) {
|
|
3
|
+
questo.nome = nome;
|
|
4
|
+
questo.eta = eta;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
funzione saluta() {
|
|
8
|
+
stampa("Ciao, sono " + questo.nome + " e ho " + questo.eta + " anni");
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
variabile p1 = nuovo Persona("Mario", 25);
|
|
13
|
+
p1.saluta();
|
|
14
|
+
|
|
15
|
+
variabile p2 = nuovo Persona("Luigi", 30);
|
|
16
|
+
p2.saluta();
|
package/programs/main/index.vx
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
variabile passport = {}
|
|
2
2
|
passport.nome = chiedi("Come ti chiami? ")
|
|
3
|
-
passport.
|
|
4
|
-
|
|
5
|
-
se(passport.eta >= 18) {
|
|
6
|
-
stampa("Sei maggiorenne")
|
|
3
|
+
se(Archivio.esiste(`passports/${passport.nome}.json`)) {
|
|
4
|
+
stampa("GIA ESISTE, VATTENE!!")
|
|
7
5
|
} altrimenti {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
passport.eta = chiedi("Quanti anni hai? ")
|
|
7
|
+
|
|
8
|
+
se(passport.eta >= 18) {
|
|
9
|
+
stampa("Sei maggiorenne")
|
|
10
|
+
} altrimenti {
|
|
11
|
+
stampa("Sei minorenne")
|
|
12
|
+
}
|
|
11
13
|
|
|
12
|
-
Archivio.scrivi(`passports/${passport.nome}.
|
|
14
|
+
Archivio.scrivi(`passports/${passport.nome}.json`, JSON.stringify(passport))
|
|
15
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"nome":"Alina","eta":"39"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"nome":"Tanya","eta":"70"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"nome":"vlad","eta":"13"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
stampa("--- Test Async/Await ---")
|
|
2
|
+
|
|
3
|
+
asincrono funzione aspetta_e_ritorna(ms, val) {
|
|
4
|
+
stampa(`Attendo ${ms}ms...`)
|
|
5
|
+
aspetta(ms) // Nota: 'aspetta' è sincrono bloccante nella mia implementazione attuale, ma simula lavoro.
|
|
6
|
+
// Per testare await vero, avrei bisogno di funzioni async native che ritornano promise.
|
|
7
|
+
// Ma 'asincrono' funzione ritorna Promise, quindi 'attendi' dovrebbe funzionare su di essa.
|
|
8
|
+
stampa("Fatto!")
|
|
9
|
+
ritorna val
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
asincrono funzione main() {
|
|
13
|
+
stampa("Inizio main")
|
|
14
|
+
variabile p = aspetta_e_ritorna(500, 42)
|
|
15
|
+
stampa(`P è una Promise? ${tipo(p) == 'promessa'}`) // Dovrebbe essere vero (promessa)
|
|
16
|
+
|
|
17
|
+
variabile risultato = attendi p
|
|
18
|
+
stampa(`Risultato: ${risultato}`)
|
|
19
|
+
|
|
20
|
+
variabile diretto = attendi aspetta_e_ritorna(200, 100)
|
|
21
|
+
stampa(`Diretto: ${diretto}`)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
attendi main()
|
|
25
|
+
stampa("Fine script")
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
stampa("--- Test Async Advanced ---")
|
|
2
|
+
|
|
3
|
+
// 1. Async Arrow Function
|
|
4
|
+
variabile saluta = asincrono (nome) => {
|
|
5
|
+
aspetta(100)
|
|
6
|
+
ritorna `Ciao, ${nome}!`
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// 2. Async Class Method
|
|
10
|
+
classe Lavoratore {
|
|
11
|
+
funzione costruttore(nome) {
|
|
12
|
+
questo.nome = nome
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
asincrono funzione lavora(compito) {
|
|
16
|
+
stampa(`${questo.nome} sta lavorando a: ${compito}...`)
|
|
17
|
+
aspetta(300)
|
|
18
|
+
ritorna `${compito} completato`
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
asincrono funzione test() {
|
|
23
|
+
stampa("Test Arrow Function...")
|
|
24
|
+
variabile promessa = saluta("Vlad")
|
|
25
|
+
stampa(`Tipo: ${tipo(promessa)}`)
|
|
26
|
+
stampa(attendi promessa)
|
|
27
|
+
|
|
28
|
+
stampa("\nTest Class Method...")
|
|
29
|
+
variabile v = nuovo Lavoratore("Vlado")
|
|
30
|
+
variabile res = attendi v.lavora("Refactoring")
|
|
31
|
+
stampa(res)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
attendi test()
|
|
35
|
+
stampa("\nFine Test Advanced")
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
stampa("--- Test Base64 ---")
|
|
2
|
+
variabile testo = "Ciao VladX"
|
|
3
|
+
variabile enc = Base64.codifica(testo)
|
|
4
|
+
stampa(`Encoded: ${enc}`)
|
|
5
|
+
variabile dec = Base64.decodifica(enc)
|
|
6
|
+
stampa(`Decoded: ${dec}`)
|
|
7
|
+
|
|
8
|
+
stampa("\n--- Test Buffer ---")
|
|
9
|
+
variabile buf = Buffer.from("Hello", "utf8")
|
|
10
|
+
stampa(`Is Buffer: ${Buffer.isBuffer(buf)}`)
|
|
11
|
+
|
|
12
|
+
stampa("\n--- Test SQLite ---")
|
|
13
|
+
variabile db = SQLite.apri("test.db")
|
|
14
|
+
db.esegui("CREATE TABLE IF NOT EXISTS utenti (id INTEGER PRIMARY KEY, nome TEXT)")
|
|
15
|
+
variabile result = db.esegui("INSERT INTO utenti (nome) VALUES ('Marco')")
|
|
16
|
+
stampa(`Inserito ID: ${result.ultimoId}`)
|
|
17
|
+
variabile utenti = db.interroga("SELECT * FROM utenti")
|
|
18
|
+
stampa(`Utenti: ${JSON.stringify(utenti)}`)
|
|
19
|
+
db.chiudi()
|
|
20
|
+
Archivio.elimina("test.db")
|
|
21
|
+
|
|
22
|
+
stampa("\n--- Test MySQL (connection failure expected) ---")
|
|
23
|
+
prova {
|
|
24
|
+
variabile conn = MySQL.connetti({
|
|
25
|
+
host: "127.0.0.1",
|
|
26
|
+
user: "root",
|
|
27
|
+
password: "wrong_password",
|
|
28
|
+
connectTimeout: 2000
|
|
29
|
+
})
|
|
30
|
+
conn.chiudi()
|
|
31
|
+
} cattura (err) {
|
|
32
|
+
stampa(`Errore catturato correttamente: ${err}`)
|
|
33
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Test Nuove Funzionalità VladX
|
|
2
|
+
|
|
3
|
+
stampa("--- TEST SCEGLI-CASO ---");
|
|
4
|
+
variabile colore = "verde";
|
|
5
|
+
scegli (colore) {
|
|
6
|
+
caso "rosso":
|
|
7
|
+
stampa("Alt!");
|
|
8
|
+
interrompi;
|
|
9
|
+
caso "verde":
|
|
10
|
+
stampa("Vai!");
|
|
11
|
+
interrompi;
|
|
12
|
+
predefinito:
|
|
13
|
+
stampa("Colore ignoto");
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
stampa("\n--- TEST DESTRUTTURAZIONE ---");
|
|
17
|
+
variabile [a, b] = [10, 20];
|
|
18
|
+
stampa("a: " + a + ", b: " + b); // 10, 20
|
|
19
|
+
|
|
20
|
+
variabile { nome, eta } = { nome: "Vlad", eta: 25, citta: "Roma" };
|
|
21
|
+
stampa("Nome: " + nome + ", Eta: " + eta); // Vlad, 25
|
|
22
|
+
|
|
23
|
+
stampa("\n--- TEST OPERATORE TERNARIO ---");
|
|
24
|
+
variabile x = 10;
|
|
25
|
+
variabile risultato = x > 5 ? "Maggiore" : "Minore";
|
|
26
|
+
stampa("Risultato: " + risultato); // Maggiore
|
|
27
|
+
|
|
28
|
+
stampa("\n--- TEST NULLISH COALESCING ---");
|
|
29
|
+
variabile n = nullo;
|
|
30
|
+
variabile val = n ?? "Default";
|
|
31
|
+
stampa("Valore: " + val); // Default
|
|
32
|
+
|
|
33
|
+
stampa("\n--- TEST OPTIONAL CHAINING ---");
|
|
34
|
+
variabile utente = { info: { nome: "Luca" } };
|
|
35
|
+
stampa("Nome utente: " + utente?.info?.nome); // Luca
|
|
36
|
+
stampa("Cognome utente: " + (utente?.info?.cognome ?? "N/A")); // N/A
|
|
37
|
+
|
|
38
|
+
stampa("\n--- TEST METODI ARRAY ---");
|
|
39
|
+
variabile numeri = [1, 2, 3, 4, 5];
|
|
40
|
+
variabile raddoppiati = attendi numeri.mappa((n) => n * 2);
|
|
41
|
+
stampa("Raddoppiati: " + raddoppiati); // [2, 4, 6, 8, 10]
|
|
42
|
+
|
|
43
|
+
variabile pari = attendi numeri.filtra((n) => n % 2 == 0);
|
|
44
|
+
stampa("Pari: " + pari); // [2, 4]
|
|
45
|
+
|
|
46
|
+
stampa("\n--- TEST MATEMATICA ---");
|
|
47
|
+
stampa("PI: " + Matematica.piGreco);
|
|
48
|
+
stampa("Radice di 16: " + Matematica.radice(16));
|
|
49
|
+
stampa("Casuale (0-1): " + Matematica.casuale());
|
|
50
|
+
|
|
51
|
+
stampa("\n--- TEST TEMPO ---");
|
|
52
|
+
stampa("Data oggi: " + Tempo.data());
|
|
53
|
+
stampa("Ora attuale: " + Tempo.ora());
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Test Integrazione Standard Library VladX
|
|
2
|
+
|
|
3
|
+
importa { maiuscolo, slugify } da "@std/Testo";
|
|
4
|
+
importa { sha256, uuid } da "@std/Cripto";
|
|
5
|
+
importa { log, successo, avviso } da "@std/Console";
|
|
6
|
+
importa { data, ora } da "@std/Tempo"; // Modulo integrato precendente (ora anche in @std/Cronometro)
|
|
7
|
+
importa { media, somma } da "@std/Calcolo";
|
|
8
|
+
|
|
9
|
+
stampa("--- TEST @std/Testo ---");
|
|
10
|
+
stampa("Maiuscolo: " + maiuscolo("vladx"));
|
|
11
|
+
stampa("Slug: " + slugify("Questo è un test!"));
|
|
12
|
+
|
|
13
|
+
stampa("\n--- TEST @std/Cripto ---");
|
|
14
|
+
stampa("SHA256: " + sha256("segreto"));
|
|
15
|
+
stampa("UUID: " + uuid());
|
|
16
|
+
|
|
17
|
+
stampa("\n--- TEST @std/Calcolo ---");
|
|
18
|
+
variabile voti = [10, 8, 9, 7];
|
|
19
|
+
stampa("Media: " + media(voti));
|
|
20
|
+
stampa("Somma: " + somma(voti));
|
|
21
|
+
|
|
22
|
+
stampa("\n--- TEST @std/Console ---");
|
|
23
|
+
successo("Questo è un messaggio di successo!");
|
|
24
|
+
avviso("Attenzione: questo è un avviso.");
|
|
25
|
+
|
|
26
|
+
stampa("\n--- FINE TEST ---");
|
package/src/cli/cli.js
CHANGED
|
@@ -52,7 +52,7 @@ function showVersion() {
|
|
|
52
52
|
console.log(`VladX v${VERSION}`);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
function runFile(filePath) {
|
|
55
|
+
async function runFile(filePath) {
|
|
56
56
|
const absolutePath = path.resolve(filePath);
|
|
57
57
|
|
|
58
58
|
if (!fs.existsSync(absolutePath)) {
|
|
@@ -71,7 +71,7 @@ function runFile(filePath) {
|
|
|
71
71
|
|
|
72
72
|
const interpreter = new Interpreter();
|
|
73
73
|
interpreter.currentPath = absolutePath;
|
|
74
|
-
interpreter.interpret(ast);
|
|
74
|
+
await interpreter.interpret(ast);
|
|
75
75
|
} catch (error) {
|
|
76
76
|
console.error(colorize(`✗ Errore: ${error.message}`, 'red'));
|
|
77
77
|
process.exit(1);
|
|
@@ -129,9 +129,11 @@ function showAST(filePath) {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
function run(args) {
|
|
132
|
+
async function run(args) {
|
|
133
133
|
if (args.length === 0) {
|
|
134
|
-
startREPL();
|
|
134
|
+
startREPL(); // REPL start is synchronous in loop initialization but internal loop is async, it doesn't return promise of completion?
|
|
135
|
+
// startREPL calls repl.start(). repl.start() sets up listeners and returns.
|
|
136
|
+
// It keeps process alive via readline.
|
|
135
137
|
return;
|
|
136
138
|
}
|
|
137
139
|
|
|
@@ -159,7 +161,7 @@ function run(args) {
|
|
|
159
161
|
console.error(colorize('✗ Errore: Specificare un file da eseguire', 'red'));
|
|
160
162
|
process.exit(1);
|
|
161
163
|
}
|
|
162
|
-
runFile(args[1]);
|
|
164
|
+
await runFile(args[1]);
|
|
163
165
|
break;
|
|
164
166
|
|
|
165
167
|
case 'lex':
|
|
@@ -181,7 +183,7 @@ function run(args) {
|
|
|
181
183
|
default:
|
|
182
184
|
// Assume it's a file path
|
|
183
185
|
if (command.endsWith('.vx') || fs.existsSync(command)) {
|
|
184
|
-
runFile(command);
|
|
186
|
+
await runFile(command);
|
|
185
187
|
} else {
|
|
186
188
|
console.error(colorize(`✗ Comando sconosciuto: ${command}`, 'red'));
|
|
187
189
|
console.log('Usa "vladx --help" per vedere i comandi disponibili.');
|