🚀 Linguaggio L1 – Estensione di L0: procedure e liste
📘 Introduzione
Dopo aver imparato le basi del linguaggio L0, con il modulo L1 potrai definire blocchi di codice riutilizzabili (le procedure) e manipolare insiemi di dati con le liste. Questi strumenti ti permettono di scrivere programmi più flessibili e organizzati.
📌 Nuovi costrutti nel linguaggio L1
def nome_procedura()– definizione di una procedurachiama nome_procedura()– chiamata della proceduralista = [elementi]– definizione di listeaggiungi elemento a lista– aggiunta di un elementorimuovi elemento da lista– rimozione di un elementoscrivi lista[indice]– accesso a elemento per indice
📘 Esempio semplice: definizione e chiamata procedura
def saluta()
scrivi "Ciao!"
fine
chiama saluta()
📘 Esempio con liste
lista = [1, 2, 3]
aggiungi 4 a lista
scrivi lista[2] # stampa 3
rimuovi 2 da lista
scrivi lista[1] # stampa 3
🛠 Interprete simulato in JavaScript (per dimostrazione)
<script>
function esegui_l1(codice_l1) {
const righe = codice_l1.split("\n");
const variabili = {};
const procedure = {};
let output = "";
function stampa(msg) {
output += msg + "\n";
}
function esegui_blocco(blocco) {
let i = 0;
while (i < blocco.length) {
let riga = blocco[i].trim();
if (!riga || riga.startsWith("#")) { i++; continue; }
if (riga.startsWith("scrivi ") && riga.includes("[") && riga.includes("]")) {
try {
let [nome, idx] = riga.slice(7).trim().split("[");
idx = idx.replace("]", "").trim();
stampa(variabili[nome.trim()][parseInt(idx)]);
} catch { stampa("Errore di accesso alla lista."); }
}
else if (riga.startsWith("scrivi ")) {
let expr = riga.slice(7).trim().split("+").map(p => p.trim());
let res = "";
for (let p of expr) {
if (p.startsWith('"') && p.endsWith('"')) res += p.slice(1, -1);
else res += variabili[p] ?? "[?" + p + "]";
}
stampa(res);
}
else if (riga.startsWith("chiedi ")) {
let nome = riga.slice(7).trim();
let val = prompt("Inserisci " + nome + ":");
variabili[nome] = isNaN(val) ? val : Number(val);
}
else if (riga.includes("=") && !riga.startsWith("def ") && !riga.startsWith("lista =")) {
let [n, v] = riga.split("=");
try {
variabili[n.trim()] = eval(v);
} catch {
variabili[n.trim()] = v.replaceAll('"', '').trim();
}
}
else if (riga.startsWith("def ") && riga.endsWith("()")) {
let nome = riga.slice(4, -2).trim();
let corpo = [];
i++;
while (i < blocco.length && blocco[i].trim() !== "fine") {
corpo.push(blocco[i]);
i++;
}
procedure[nome] = corpo;
}
else if (riga.startsWith("chiama ") && riga.endsWith("()")) {
let nome = riga.slice(7, -2).trim();
if (procedure[nome]) esegui_blocco(procedure[nome]);
else stampa("❌ Procedura '" + nome + "' non definita.");
}
else if (riga.startsWith("lista =")) {
let contenuto = riga.slice(7).trim();
try {
variabili["lista"] = eval(contenuto);
} catch {
variabili["lista"] = [];
}
}
else if (riga.startsWith("aggiungi ")) {
let [el, nome] = riga.slice(9).split(" a ");
if (variabili[nome.trim()] instanceof Array) {
variabili[nome.trim()].push(isNaN(el) ? el.replaceAll('"', '') : Number(el));
}
}
else if (riga.startsWith("rimuovi ")) {
let [el, nome] = riga.slice(8).split(" da ");
if (variabili[nome.trim()] instanceof Array) {
let index = variabili[nome.trim()].indexOf(isNaN(el) ? el.replaceAll('"', '') : Number(el));
if (index > -1) variabili[nome.trim()].splice(index, 1);
}
}
i++;
}
}
esegui_blocco(righe);
alert(output);
}
</script>
🎯 Prossimo passo
Nel prossimo modulo, inizieremo a implementare queste funzionalità anche in un ambiente web interattivo, per provare codice L1 direttamente nel browser!
Fine STEP E – Parte 1 ✅
Nessun commento:
Posta un commento